
Это репозиторий, столкнувшийся с проблемой повышения привилегий в своей Linux-системе, а также новость о проблеме "Dirty pipeline"
Макс Келлерманн, разработчик из CM4all (немецкой компании веб-хостинга), обнаружил её в начале 2022 года, но не в ходе поиска уязвимостей. Он занимался отладкой, когда узнал, что клиент недоволен тем, что логи на его сервере самопроизвольно повреждаются.
Келлерманн потратил месяцы на выяснение причины. Его работа в конечном счёте привела его к условию, глубоко связанному с тем, как ядро Linux обрабатывает каналы (pipes) и кэш страниц (page cache). Он понял, что найденная ошибка, объясняющая повреждение логов, на самом деле была гораздо серьёзнее — полная уязвимость повышения привилегий (полная уязвимость повышения привилегий — это критическая ошибка безопасности, которая позволяет атакующему с низким уровнем доступа (например, обычному пользователю, гостю или непривилегированному приложению) получить административный, суперпользовательский или root-доступ к системе. Это означает, что атакующий обходит все предусмотренные границы безопасности, получая полный контроль для изменения системных файлов, установки программ, кражи данных или удаления файлов).
Он ответственно сообщил об этом команде ядра Linux и самому Линусу Торвальдсу. Исправление было выпущено в течение нескольких дней.
Настоящая проблема в том, что когда функция splice() передавала данные в канал (pipe), она забывала сбросить этот флаг в целевом буфере. Таким образом, страница, переданная через splice() (которая указывает непосредственно на кэш страниц файла, доступный только для чтения), всё ещё имела установленный флаг CAN_MERGE.
Теперь, если вы записываете данные в этот канал, ядро видит флаг CAN_MERGE, предполагает, что страница доступна для записи, и объединяет ваши данные непосредственно в кэш страниц — то есть в содержимое файла в памяти — без какой-либо проверки прав.
Результат: вы можете перезаписать содержимое любого файла, доступного вам для чтения, включая SUID-бинарники (set user ID) с правами root, такие как su, passwd, sudo.
Почему эта ошибка была так важна?
Несколько причин:
/usr/bin/passwd, выполняются от имени root независимо от того, кто их вызывает. Измените их → мгновенный root. Это позволяет эксплуататорам получить контроль уровня root.