간단히 말해서:내 배포판의 Linux 3.08 커널에서 cat /proc/kallsyms
예를 들어 _commit_creds 함수/기호가 주소 0xc1073fe0에 있음을 찾을 수 있습니다. 언제:
- 내 커널 빌드(옵션 1)
- 커널 바이너리 조정(옵션 2)
응가능한이 주소에 영향을 미치나요? (즉, 커널에 대한 공격을 완화하기 위한 무작위화?)
커널 제공 ABI를 중단하지 않도록 커널 제공 시스템 호출이 예측 가능/알려진 주소에 유지되어야 한다고 가정하는 것이 더 정확합니까?
긴 버전
일부CVE-2016-0728특정 Linux 커널 취약점 제공개념의 증거다음 두 줄의 소스 코드를 사용하세요.
#define COMMIT_CREDS_ADDR (0xffffffff81094250)
#define PREPARE_KERNEL_CREDS_ADDR (0xffffffff81094550)
각자의 역할을 하고 있는데도use-after-free 오버플로 유형의 문제가 발생한 후에만그럼에도 불구하고 권한 상승을 완료하는 것은 여전히 중요합니다. 물론 주소는 모든 코어에서 동일하지 않으며 기본적으로 모든 릴리스마다 변경됩니다. 그럼에도 불구하고 커널 라인 내에서는 일정한 것으로 보입니다(예: Ubuntu 12.04 x86의 주소는 항상 0xc1073fe0입니다).
내 질문은 이러한 주소에 영향을 주어 순서를 섞거나 무작위화하여 커널 활용을 더 어렵게 만드는 것이 가능한지 이해하는 것입니다(즉, 공격자는 커널 링 0에 명령 포인터를 갖고 나면 다소 눈이 멀게 됩니다). 시스템 호출에 대한 ABI를 갖기 위해 sys_xxxxxxxxxx 기호의 위치를 변경할 수 없다고 가정합니다. 그러나 적어도 커널 기호의 내부에 대해서는 기호를 예측 가능하게 만들어야 한다는 필요성을 반드시 이해하지 못합니다.
그러므로 나는 여기서 이러한 커널 기호를 무작위로 지정하는 방법을 묻고 있습니다.
- (1) 사용자 정의 커널을 컴파일하거나,
- (2) 커널을 더 잘 조정하고 기호를 이동하는 것이 좋습니다(아마도 이것이 더 어렵고 깨지기 쉬운 일이라고 생각합니다).
커널 기호의 주소를 변경하면 어떤 결과가 발생합니까? (시스템 호출 ABI 제외)
답변1
모든 Ubuntu 12.04 x86의 주소가 동일한 경우 모두 동일한 Linux 버전과 함께 제공되기 때문일 수 있습니다. 최적화가 활성화된 최신 버전의 GCC를 사용하여 자신의 커널을 컴파일하면 각 빌드의 주소가 무작위로 지정됩니다.
사실, 최근 커널에서는 이것이 필요하지도 않습니다. ~부터이번에 제출하세요(2014년 1월) x86 아키텍처의 커널 주소 공간은 "커널 주소 공간 레이아웃 무작위화"라는 메커니즘을 통해 부팅할 때마다 변경됩니다.http://lwn.net/Articles/569635/.
따라서 배포판을 업그레이드하거나 커널을 다시 컴파일하면 임의의 주소가 있어야 합니다.
결과적으로 컴파일러나 커널 로더 프로세스가 작업을 수행하도록 하면 거의 문제가 발생하지 않습니다. 컴파일 후에 빌드를 조정하려고 하면 빌드를 시작할 수 없거나 더 나쁘게는 무작위로 충돌이 발생할 가능성이 가장 높습니다. 컴파일러 출력 후처리의 또 다른 실질적인 결과는 컴파일 중에 커널에 서명할 수 없다는 것입니다(예를 들어 신뢰할 수 있는 부팅에 필요함).