Dirtyfrag — универсальная уязвимость в Linux
Знаете, что страшнее всего в безопасности Linux? Не то, что уязвимости существуют — это как бы ожидаемо. Страшнее всего, когда уязвимость работает ВЕЗДЕ. Без разницы, какой дистрибутив вы используете — Ubuntu, Debian, CentOS, Arch. Одна дыра — и злоумышленник получает полный контроль над системой.
Именно такая история произошла на этой неделе. Встречайте: Dirtyfrag.
Что такое dirtyfrag
Dirtyfrag — это универсальная уязвимость локального повышения привилегий (LPE, Local Privilege Escalation — вид атаки, когда злоумышленник с обычными правами пользователя получает права администратора). Автор отчёта — исследователь Hyunwoo Kim — сравнивает её с предыдущей находкой под названием Copy Fail (предыдущая подобная уязвимость в Linux). Обе позволяют получить root-доступ мгновенно, без всякой подготовки.
Но есть нюанс.
Эмбарго (период секретности, когда разработчики готовят патчи) было сорвано. Это означает, что на момент публикации нет ни CVE-номера (Common Vulnerabilities and Exposures — международный каталог уязвимостей, каждой присваивается уникальный номер), ни официальных патчей от производителей дистрибутивов. Никто не успел исправить дыру заранее.
Как это работает
Уязвимость состоит из двух частей, которые «складываются» вместе. Первая — в сетевом стеке ядра Linux, связанная с обработкой ESP (Encapsulating Security Payload — протокол шифрования данных в IPsec) и IPsec (набор протоколов для защиты интернет-трафика — шифрование и проверка подлинности данных). Вторая — в модуле rxrpc (удалённые вызовы процедур — механизм, позволяющий одной программе вызывать функции в другой программе на удалённом компьютере), который отвечает за удалённые вызовы процедур.
АТАКА DIRTYFRAG
────────────────
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Злоумышленник │───▶│ Модули ядра │───▶│ root shell │
│ (непривилеги- │ │ esp4/esp6/ │ │ на системе │
│ рованный │ │ rxrpc │ │ │
│ пользователь)│ │ (уязвимость) │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
Запуск эксплойта Переполнение буфера Полный контроль
с локальным в сетевом стеке над системой
доступом
В эксплойте опубликованном в открытом доступе используется техника переполнения буфера (когда программа записывает данных больше, чем выделено места — как налить воды больше стакана; избыток «переливается» в соседнюю память и может быть использован для взлома) в сетевом коде ядра. Атакующий создаёт специальным образом сформированные UDP-пакеты (единицы данных передаваемые по сети — как отправить письмо без уведомления о доставке) на порт 4500 (стандартный порт для IPsec NAT-T), что приводит к перезаписи памяти и выполнению произвольного кода.
Код эксплойта содержит 192-байтный шеллкод (крошечная программа которая даёт злоумышленнику доступ к командной строке системы) — минимальный ELF-файл (исполняемый файл в Linux — как .exe в Windows), который запускает /bin/sh с правами root. Автор даже позаботился установить переменную окружения TERM=xterm, чтобы избежать ошибок в bash при запуске шелла.
Затронутые системы
По сути — все. Автор утверждает что уязвимость работает на «всех основных дистрибутивах». Это логично потому что проблема находится в коде ядра Linux, а не в пользовательских приложениях.
Конкретно уязвимы модули:
esp4— обработка ESP для IPv4esp6— обработка ESP для IPv6rxrpc— удалённые вызовы процедур
Если эти модули загружены в ядро — а в большинстве серверных систем они есть по умолчанию — система уязвима.
Что делать прямо сейчас
Патчей нет CVE нет, но кое-что сделать можно.
Автор статьи приводит команду которая отключает уязвимые модули:
sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"
Эта команда делает три вещи:
- Создаёт конфигурационный файл который запрещает загрузку модулей (/etc/modprobe.d/ — системная папка с настройками загрузки модулей ядра)
- Выгружает уже загруженные модули из памяти (
rmmod— команда для выгрузки модуля из работающего ядра Linux) - Игнорирует ошибки если модуль уже выгружен
После этого система защищена, но есть побочный эффект: IPsec и удалённые вызовы процедур работать не будут Для большинства веб серверов это не проблема.
Чего это стоит индустрии
Меня всегда поражает эта гонка Исследователи находят уязвимости пытаются сообщить ответственно дают время на исправление Но иногда эмбарго срывается по разным причинам И в этот момент все системы мира становятся уязвимыми одновременно
Dirtyfrag не первый такой случай и увы не последний На моей памяти были Dirty COW (известная уязвимость Linux 2016 года — тоже позволяла получить root права), Spectre/Meltdown (серьёзные уязовимости процессоров 2018 года затрагивали почти все компьютеры мира), Copy Fail Каждый раз одно и то же: паника спешные патчи перезагрузки серверов посреди ночи
Единственное что можно сделать — иметь план действий И этот план должен включать:
- Мониторинг загрузки модулей ядра
- Возможность быстро отключить уязвимые компоненты
- Регулярное обновление ядра даже если патчей пока нет они скоро появятся
Вместо вывода
Ситуация с Dirtyfrag напоминает старую шутку: «В Linux нет вирусов только пользователи с правами root» Теперь добавим: «И уязвимости которые эти права дают»
Следите за обновлениями Проверяйте свои серверы И держите руку на пульсе потому что в безопасности главное не паранойя, а готовность
Ссылки
- Оригинальное сообщение — обсуждение уязвимости в списке рассылки oss-security
- Коммит — исправление уязвимости в ядре Linux
- Сайт проекта — официальный сайт с деталями об уязвимости
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.