Проблема вызвана некорректной последовательностью операций при проверке контрольной суммы сетевого пакета, позволяющей изменить заголовок IPv4 в момент после проверки корректности информации, но до выполнения действий с ним (TOCTOU — Time-Of-Check-To-Time-Of-Use). При определённых условиях вычисление контрольной суммы выполняется в отложенном режиме, уже после разбора и проверки сетевого пакета, что может привести к изменению уже проверенных данных и чтению до 32 байт из области памяти вне буфера, в котором происходит обработка пакета.
Атака производится через отправку из гостевой системы пакета с флагом CHECKSUM_PARTIAL, при котором контрольная сумма вычисляется не сразу, и специально подобранными значениями skb->csum_start и skb->csum_offset. Пакет проходит проверку в сетевом стеке, так как длина заголовка корректна и равна 20 байт. Завершение вычисления контрольной суммы осуществляется при обработке фрагментации, но из-за некорректных значений csum_start и csum_offset результат записывается в самое начало IPv4-заголовка и изменяет первый байт, хранящий размер, увеличивая его 20 до 60 байт. При дальнейшей обработке ядро считает, что размер заголовка теперь 60 байт, при копировании читает дополнительные 40 байт (c учётом хвостовых служебных 8 байт, читается 32 байта из области вне буфера) и отправляет обратно в составе секции с IP-опциями.
В подготовленном эксплоите утечку 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.
Источник: http://www.opennet.ru/opennews/art.shtml?num=66487
