Исследователи из команды Google Project Zero опубликовали метод эксплуатации уязвимости (CVE-2020-29661) в реализации ioctl-обработчика TIOCSPGRP из tty-подсистемы ядра Linux, а также детально рассмотрели механизмы защиты, которые могли бы блокировать подобные уязвимости.
Вызывающая проблему ошибка была устранена в ядре Linux ещё 3 декабря прошлого года. Проблема проявляется в ядрах до версии 5.9.13, но большинство дистрибутивов устранили проблему в обновлениях пакетов с ядром, предложенных ещё в прошлом году (Debian, RHEL, SUSE, Ubuntu, Fedora, Arch). Похожая уязвимость (CVE-2020-29660) одновременно была найдена в реализации ioctl-вызова TIOCGSID, но она также уже повсеместно устранена.
Проблема вызвана ошибкой при установке блокировок, приводящей к состоянию гонки в коде drivers/tty/tty_jobctrl.c, которое удалось использовать для создания условий обращения к памяти после её освобождения (use-after-free), эксплуатируемых из пространства пользователя через манипуляции с ioct-вызовом TIOCSPGRP. Рабочий эксплоит продемонстрирован для повышения привилегий в Debian 10 с ядром 4.19.0-13-amd64.
Al mismo tiempo, en el artículo publicado, el énfasis no está tanto en la técnica para crear un exploit funcional, sino en las herramientas que existen en el núcleo para proteger contra tales vulnerabilidades. La conclusión no es alentadora, los métodos como la segmentación de la memoria en el montón y el control del acceso a la memoria después de que se libera no se utilizan en la práctica, ya que conducen a una disminución del rendimiento y la protección basada en CFI (Control Flow Integrity), bloqueando exploits. en las últimas etapas del ataque, necesita mejorar.
Al considerar lo que podría marcar la diferencia a largo plazo, el uso de analizadores estáticos avanzados o el uso de lenguajes seguros para la memoria como Rust y dialectos C con anotaciones ricas (como Checked C) en la fase de construcción de verificadores de estado se destacan cerraduras, objetos y punteros. Entre los métodos de protección también se mencionan la activación del modo panic_on_oops, la transferencia de las estructuras del kernel al modo de solo lectura y la restricción de acceso a las llamadas al sistema mediante mecanismos como seccomp.
Fuente: opennet.ru
