Исследователи из команды Google Project Zero выпустили недавно через сообщение в блоге новый метод эксплуатации уязвимостей (CVE-2020-29661) в реализации обработчика ioctl TIOCSPGRP из Подсистема tty ядра Linux, а также подробные механизмы защиты, которые могут заблокировать эти уязвимости.
В сообщении упоминается, что проблема вызвана ошибкой в настройках блокировки, что привело к состоянию гонки в коде /tty/tty_jobctrl.c, который использовался для создания условий для доступа к памяти после запуска (use-after-free), эксплуатируемой пользовательским пространством посредством манипуляции с ioct- путем вызова TIOCSPGRP.
Помимо опубликованной информации, также была проведена функциональная демонстрация эксплойта для повышения привилегий в Debian 10 с ядром 4.19.0-13-amd64 и что также не исключает, что это может повлиять на различные дистрибутивы, среди которых, конечно же, есть те, которые основаны на Debian и являются производными от него.
Многие из описываемых мною отдельных методов эксплуатации и способов смягчения последствий не новы. Однако я думаю, что стоит написать их вместе, чтобы показать, как различные средства защиты взаимодействуют с довольно обычным эксплойтом после освобождения.
Фрагменты кода в этом сообщении блога, относящиеся к эксплойту, взяты из предыдущей версии 4.19.160, поскольку именно на нем основано целевое ядро Debian; некоторые другие фрагменты кода взяты из основной ветки Linux.
В то же время в опубликованной статье акцент делается не столько на технике создания функционального эксплойта, сколько на том, какие инструменты там в ядре чтобы защитить себя против таких уязвимостей.
Вывод неутешительный, поскольку уже упоминалось, что такие методы, как сегментирование памяти в куче и контроль доступа к памяти после ее освобождения, на практике не применяются, поскольку они приводят к снижению производительности и защите на основе CFI (целостность потока управления), которая блокирует эксплойты в более поздних версиях. стадии атаки, требует доработок.
Особый тип терминального устройства - это псевдотерминалы, которые используются, например, когда вы открываете приложение терминала в графической среде или подключаетесь к удаленному компьютеру через SSH. В то время как другие терминальные устройства подключены к какому-либо аппаратному обеспечению, оба конца псевдотерминала управляются пространством пользователя, и псевдотерминалы могут быть свободно созданы пространством пользователя (без привилегий).
Всякий раз, когда / dev / ptmx открывается (сокращение от «псевдотерминальный мультиплексор»), результирующий файловый дескриптор представляет сторону устройства (называемую в документации и исходных текстах ядра «главным псевдотерминалом») устройства. Новый псевдотерминал -Терминал.
Соответствующее оконечное устройство (к которому обычно подключается оболочка) автоматически создается ядром в / dev / pts / .
При рассмотрении того, что может иметь значение в долгосрочной перспективе, упор делается на использование расширенных статических парсеров или использование безопасных для памяти языков, таких как диалекты Rust и C с расширенными аннотациями (например, проверенный C), для создания средств проверки статуса, блокировок и т. Д. объекты и указатели. В методах защиты также упоминается включение режима panic_on_oops, что делает структуры ядра доступными только для чтения и ограничивает доступ к системным вызовам с помощью таких механизмов, как seccomp.
Ошибка, вызывающая проблему это было исправлено в ядре Linux 3 декабря прошлого года. Проблема проявляется в ядрах до версии 5.9.13, но большинство дистрибутивов устранили проблему в обновлениях пакетов ядра, которые предлагались в прошлом году.
Также упоминается аналогичная уязвимость (CVE-2020-29660), которая была обнаружена одновременно в реализации вызова TIOCGSID ioctl, но также была везде удалена.
В конце концов Если вам интересно узнать об этом больше, вы можете проверить детали По следующей ссылке.