
Exploit de prova de conceito para corrupção de registrador de depuração ptrace do kernel Linux (CVE-2018-1000199), demonstrando tratamento incorreto de erros na virtualização de breakpoints.
O código ptrace do Linux virtualiza o acesso aos registradores de depuração, e o código de virtualização possui um tratamento de erros incorreto. Isso faz com que se você escrever um valor inválido, por exemplo, no DR0, o estado interno do rastreamento de breakpoints do kernel possa ser corrompido, apesar do fato de que a chamada ptrace() retornará -EINVAL.
Como exemplo, você pode encontrar o endereço de do_debug em /proc/kallsyms em um kernel x86 e passar esse endereço para o PoC anexado. Suspeito que outras arquiteturas além de x86 também sejam afetadas, mas não tentei explorar o bug. O bug em si está espalhado por todo o kernel em código genérico e de arquitetura.
Não percebi uma forma óbvia de obter escalonamento de privilégios usando esse bug, mas pode existir. Por exemplo, é plausível que usar esse bug para atacar o manipulador NMI do perf possa resultar em estouro da pilha NMI, resultando em várias formas de corrupção. Não tentei analisar o impacto em arquiteturas não x86, pois só sei como breakpoints x86 funcionam, mas os efeitos do bug podem ser muito diferentes.
O Linus corrigiu isso principalmente upstream no commit f67b15037a7a50c57f72e69a6d59941ad90a0f0f. Com esse commit aplicado, o tratamento de erros ainda está incorreto, mas o defeito resulta em um breakpoint desativado em vez de um breakpoint incorreto.
http://man7.org/linux/man-pages/man2/ptrace.2.html
Exemplo de uso: $ ./PoC.exe ffffffff81b44400