
Exploit proof-of-concept per la corruzione dei registri di debug ptrace del kernel Linux (CVE-2018-1000199), che dimostra una gestione degli errori errata nella virtualizzazione dei breakpoint.
Il codice ptrace di Linux virtualizza l'accesso ai registri di debug, e
il codice di virtualizzazione presenta una gestione degli errori errata.
Ciò significa che se si scrive un valore illegale in, ad esempio, DR0,
lo stato interno del tracciamento dei breakpoint del kernel può diventare
corrotto nonostante il fatto che la chiamata ptrace() restituirà -EINVAL.
Ad esempio, è possibile trovare l'indirizzo di do_debug in /proc/kallsyms
su un kernel x86 e passare quell'indirizzo al PoC allegato. Sospetto
che anche architetture diverse da x86 siano interessate, ma non ho
provato a sfruttarlo. Il bug stesso è diffuso in tutto il kernel
nel codice generico e per architettura.
Non ho individuato un modo ovvio per ottenere un'escalation dei privilegi usando questo bug, ma potrebbe esistere. Ad esempio, è plausibile che usare questo bug per colpire il gestore NMI di perf potrebbe causare l'overflow dello stack NMI, portando a varie forme di corruzione. Non ho provato ad analizzare l'impatto su architetture non x86 poiché so solo come funzionano i breakpoint su x86, ma gli effetti del bug potrebbero essere molto diversi.
Linus ha in gran parte risolto questo problema a monte nel commit
f67b15037a7a50c57f72e69a6d59941ad90a0f0f. Con quel commit applicato,
la gestione degli errori è ancora sbagliata, ma il difetto produce un
breakpoint disabilitato invece di un breakpoint errato.
http://man7.org/linux/man-pages/man2/ptrace.2.html
Esempio d'uso: $ ./PoC.exe ffffffff81b44400