PwnEscape - уязвимость в сетевом стеке ядре Linux, позволяющая обойти изоляцию гипервизоров и контейнеров - QubStore

PwnEscape — уязвимость в сетевом стеке ядре Linux, позволяющая обойти изоляцию гипервизоров и контейнеров

В ядре Linux обнаружена опасная уязвимость CVE-2026-99999 под названием PwnEscape — она позволяет выбраться из гостевой системы в хост-окружение.

Проблема кроется в обработке IPv4-пакетов. Если атакующий находится внутри виртуальной машины или контейнера, он может выполнить код с правами ядра на стороне хоста. Уязвимость продемонстрировали на KVM, но поскольку корень зла — не в гипервизоре, а в самом сетевом стеке Linux, эксплоит вполне может быть переработан и под другие системы изоляции, использующие штатный стек.

Механизм атаки строится на несоответствии момента проверки и момента использования — классический TOCTOU. При определённых условиях контрольная сумма пакета считается не сразу, а отложенно, уже после того как пакет разобран и признан корректным. Это позволяет изменить заголовок IPv4 после проверки. Гость отправляет пакет с флагом CHECKSUM_PARTIAL и специально подобранными значениями skb->csum_start и skb->csum_offset. Пакет проходит валидацию, ведь длина заголовка — честные 20 байт. Досчёт контрольной суммы происходит при фрагментации, но из-за кривых значений запись попадает в начало IPv4-заголовка и меняет первый байт — размер. Вместо 20 байт там оказывается 60. Дальше ядро копирует лишние 40 байт, из которых 32 — за пределами буфера.

В готовом эксплоите эта утечка 32 байт превращается в контролируемую перезапись 64 байт в памяти ядра. Итог — выполнение кода с правами root на хосте. Исследователи пока не раскрывают технические детали финальной стадии и не публикуют код эксплоита, чтобы дать время на обновление. Предполагается, что утечка сначала помогает восстановить раскладку памяти ядра в обход KASLR, затем создаются условия для выделения нужной структуры с указателем сразу за буфером пакета, и запускается действие, меняющее данные в секции IP-опций за границей буфера.

Дыру уже закрыли во вчерашних выпусках ядра Linux: 7.2.11, 6.18.57, 6.12.113, 6.6.159, 6.1.190, 5.15.223 и 5.10.272.

Ссылка на основную публикацию