Опубликован рабочий эксплойт для уязвимости GRO Frag в ядре Linux, дающий root непривилегированному пользователю

linux

В открытом доступе появился код эксплуатации ранее неизвестной уязвимости в ядре Linux, которая позволяет любому локальному пользователю без специальных привилегий повысить свои права до root. Проблема затрагивает ядра начиная с версии 6.0 и присутствует в реализации механизма GRO (Generic Receive Offload - общая разгрузка приёма), используемого для ускорения обработки сегментированных сетевых пакетов. CVE-идентификатор пока не присвоен, а исправление уже существует в виде патча, который 20 мая был опубликован в списке рассылки разработчиков ядра, а 21 мая принят в основную ветку. Однако стабильные корректирующие выпуски ядра с этим исправлением пока не вышли.

Атака возможна на системах, где включена подсистема ввода-вывода io_uring (параметр io_uring_disabled=0, что является значением по умолчанию). Кроме того, для работы эксплойта требуется наличие в системе любого исполняемого файла, доступного на чтение и имеющего флаг SUID-root (то есть такого, который запускается с правами владельца-суперпользователя). В большинстве дистрибутивов такие файлы есть - например, стандартная утилита su.

Как работает уязвимость

Корень проблемы - ошибка в реализации механизма так называемого нулевого копирования (zerocopy) внутри функции skb_gro_receive(). Эта функция отвечает за объединение пакетов в рамках GRO и напрямую изменяет данные в страничном кэше, чтобы избежать лишнего копирования. При определённых условиях, а именно когда установлен флаг SKBFL_MANAGED_FRAG_REFS, система пропускает сохранение ссылки на освобождаемые страницы памяти в специальном поле shinfo->frags. После этого данное поле присоединяется к другому сетевому буферу (skb) без корректировки счётчика ссылок на страницы. В результате происходит обращение к памяти после её освобождения (use‑after‑free). Злоумышленник может манипулировать указателем на буфер io_uring и тем самым перезаписывать данные в страничном кэше.

Сценарий эксплуатации

Автор эксплойта описал сложную, но рабочую цепочку действий, которая в итоге позволяет подменить содержимое файла /etc/passwd в страничном кэше. Вкратце алгоритм выглядит так:

  • Злоумышленник добивается, чтобы база пользователей (/etc/passwd) оказалась в страничном кэше (то есть была прочитана и кэширована).
  • Затем он подставляет в этот кэш строку "hax::0:0::/root:/bin/sh" - запись о новом пользователе hax с правами root и пустым паролем.
  • После этого он запускает команду su hax. Оболочка обращается к /etc/passwd, но вместо оригинального файла с диска получает изменённую копию из кэша, в которой уже есть подставная запись. Так как пароля нет, команда su сразу даёт доступ от имени root.

Для достижения такого эффекта используются сетевые ухищрения: создаётся пара виртуальных Ethernet-интерфейсов veth, между ними устанавливается TCP-соединение с задержкой через эмулятор сетевых условий netem. Эксплойт отправляет специальные пакеты с включённым флагом MSG_MORE, используя системный вызов io_uring SEND_ZC (отправка с нулевым копированием). Из-за ошибки в GRO часть страниц памяти освобождается раньше времени, и через механизм каналов (pipe) злоумышленник получает возможность перехватить эти страницы, записать в них поддельные записи таблицы страниц (PTE) и таким образом обратиться к физической странице, где хранится /etc/passwd, минуя проверки виртуальной памяти. Метод протестирован на Ubuntu 24.04.

Последствия и рекомендации

Эта уязвимость представляет серьёзную угрозу для всех систем, где разрешён локальный доступ обычным пользователям - например, на серверах, в VPS, в образовательных или корпоративных окружениях. Получение root-доступа позволяет атакующему полностью скомпрометировать систему, установить бэкдоры, украсть данные или нарушить работу сервисов.

На данный момент единственным способом защиты является применение патча, принятого в основную ветку ядра. Пока стабильные обновления не выпущены, администраторам следует рассмотреть возможность отключения подсистемы io_uring, если она не используется. Для этого нужно установить параметр ядра io_uring_disabled=2 в конфигурации загрузчика (например, в /etc/default/grub для дистрибутивов, использующих GRUB). Также можно ограничить доступ к исполняемым файлам с SUID-битом, но это может нарушить работу некоторых программ.

Специалистам по безопасности стоит внимательно следить за выходом корректирующих выпусков ядра и как можно скорее установить обновление. Поскольку эксплойт уже опубликован, в ближайшее время следует ожидать появления автоматизированных сканеров и использования этой техники злоумышленниками в реальных атаках.

Ссылки

 

Комментарии: 0