
Linux 커널 ptrace 디버그 레지스터 손상(CVE-2018-1000199)에 대한 개념 증명 익스플로잇으로, 중단점 가상화에서의 잘못된 오류 처리 방식을 시연합니다.
리눅스 ptrace 코드는 디버그 레지스터에 대한 접근을 가상화하며, 해당 가상화 코드에는 오류 처리(error handling)가 잘못되어 있습니다. 즉, 예를 들어 DR0에 잘못된 값을 쓰면 ptrace() 호출이 -EINVAL을 반환함에도 불구하고 커널의 중단점(breakpoint) 추적 내부 상태가 손상될 수 있습니다.
예를 들어 x86 커널에서 /proc/kallsyms에서 do_debug의 주소를 찾아 해당 주소를 첨부된 PoC에 전달할 수 있습니다. x86 이외의 아키텍처도 영향을 받을 수 있다고 생각하지만, 이를 악용하려고 시도하지는 않았습니다. 버그 자체는 커널의 제네릭 코드와 아키텍처 코드 전반에 퍼져 있습니다.
이 버그를 이용한 명백한 권한 상승(privilege escalation) 방법은 발견하지 못했지만, 존재할 가능성은 있습니다. 예를 들어, 이 버그를 이용해 perf NMI 핸들러를 대상으로 하면 NMI 스택이 넘쳐 다양한 형태의 손상이 발생할 수 있습니다. x86 중단점이 어떻게 동작하는지만 알고 있어서 다른 아키텍처에 미치는 영향은 분석하지 않았지만, 이 버그의 영향은 매우 다를 수 있습니다.
Linus는 대부분 이 문제를 업스트림 커밋 f67b15037a7a50c57f72e69a6d59941ad90a0f0f에서 수정했습니다. 해당 커밋을 적용하면 오류 처리는 여전히 잘못되었지만, 결함으로 인해 잘못된 중단점이 아닌 비활성화된 중단점이 발생합니다.
http://man7.org/linux/man-pages/man2/ptrace.2.html
사용 예: $ ./PoC.exe ffffffff81b44400