
Proof-of-Concept-Exploit für die Korruption der ptrace-Debug-Register im Linux-Kernel (CVE-2018-1000199), der eine fehlerhafte Fehlerbehandlung in der Breakpoint-Virtualisierung demonstriert.
Der Linux-ptrace-Code virtualisiert den Zugriff auf die Debug-Register, und der Virtualisierungscode hat eine falsche Fehlerbehandlung. Das bedeutet, dass, wenn Sie einen ungültigen Wert in beispielsweise DR0 schreiben, der interne Zustand der Breakpoint-Verfolgung des Kernels korrupt werden kann, obwohl der ptrace()-Aufruf -EINVAL zurückgibt.
Als Beispiel können Sie die Adresse von do_debug in /proc/kallsyms auf einem x86-Kernel finden und diese Adresse an die beigefügte PoC übergeben. Ich vermute, dass auch andere Architekturen als x86 betroffen sind, aber ich habe nicht versucht, sie auszunutzen. Der Fehler selbst ist im gesamten Kernel im generischen und Arch-Code verteilt.
Ich habe keinen offensichtlichen Weg gefunden, um mittels dieses Fehlers eine Privilegieneskalation zu erreichen, aber es könnte einen geben. Zum Beispiel ist es plausibel, dass die Verwendung dieses Fehlers, um den perf-NMI-Handler anzugreifen, zu einem Überlauf des NMI-Stacks führen könnte, was verschiedene Formen der Korruption zur Folge hätte. Ich habe nicht versucht, die Auswirkungen auf Nicht-x86-Architekturen zu analysieren, da ich nur weiß, wie x86-Breakpoints funktionieren, aber die Auswirkungen des Fehlers könnten sehr unterschiedlich sein.
Linus hat dies größtenteils im Upstream im Commit f67b15037a7a50c57f72e69a6d59941ad90a0f0f behoben. Mit diesem Commit angewendet ist die Fehlerbehandlung immer noch falsch, aber der Defekt führt zu einem deaktivierten Breakpoint anstelle eines falschen Breakpoints.
http://man7.org/linux/man-pages/man2/ptrace.2.html
Anwendungsbeispiel: $ ./PoC.exe ffffffff81b44400