
Эксплойт proof-of-concept для повреждения отладочных регистров ptrace в ядре Linux (CVE-2018-1000199), демонстрирующий некорректную обработку ошибок при виртуализации точек останова.
Код ptrace в Linux виртуализует доступ к отладочным регистрам, и в коде виртуализации неправильно обрабатываются ошибки. Это означает, что если записать недопустимое значение, скажем, в DR0, внутреннее состояние отслеживания точек останова ядра может повредиться, несмотря на то, что вызов ptrace() вернёт -EINVAL.
В качестве примера можно найти адрес do_debug в /proc/kallsyms на x86-ядре и передать этот адрес приложенному PoC. Подозреваю, что затронуты и другие архитектуры, помимо x86, но я не пытался эксплуатировать эту уязвимость. Сам баг разбросан по всему ядру — и в общем, и в архитектурно-зависимом коде.
Я не нашёл очевидного способа повысить привилегии с помощью этой ошибки, но он может существовать. Например, вполне вероятно, что использование этой ошибки против обработчика perf NMI может привести к переполнению стека NMI и вызвать различные формы повреждения. Я не пытался анализировать влияние на архитектуры, отличные от x86, поскольку знаю только то, как работают точки останова на x86, но эффекты бага могут быть самыми разными.
Линус в основном исправил это в апстрим-коммите f67b15037a7a50c57f72e69a6d59941ad90a0f0f. С применённым коммитом обработка ошибок по-прежнему неверна, но дефект приводит к отключённой точке останова вместо некорректной.
http://man7.org/linux/man-pages/man2/ptrace.2.html
Пример использования: $ ./PoC.exe ffffffff81b44400