CVE-2026-98368 in Linux
Сводка
по VulDB • 06.10.2026
В ядре Linux была устранена следующая уязвимость:
esp: понижение уровня управления фрагментами с zerocopy перед изменением фрагментов skb
На пути вывода вне исходного места (когда esp->inplace == false) ESP переписывает массив фрагментов skb: функция esp_output_head() добавляет трейлерный фрагмент, а esp_output_tail() заменяет фрагменты страницей назначения, обе ссылаются через get_page().
Когда skb содержит управляемые фрагменты zerocopy (SKBFL_MANAGED_FRAG_REFS), фрагменты полезной нагрузки принадлежат ubuf и не должны ссылаться или разряжаться индивидуально, однако ESP изменяет массив фрагментов без какого-либо понижения уровня управления skb. Это нарушает инвариант управляемых фрагментов двумя способами:
- esp_ssg_unref() проходит по исходному списку рассеяния (scatterlist) и сбрасывает ссылку на страницу для каждого фрагмента, включая фрагменты полезной нагрузки, принадлежащие ubuf, что снижает их счетчик ссылок ниже смещения GUP pin, пока страницы все еще закреплены (pinned), то есть происходит use-after-free страниц zerocopy;
- esp_output_tail() устанавливает свою страницу назначения как фрагмент 0 через get_page(), но оставляет флаг SKBFL_MANAGED_FRAG_REFS установленным, поэтому skb_release_data() выбирает ветку skip_unref и никогда не сбрасывает эту ссылку, что приводит к утечке страницы x->xfrag с частотой пакетов.
Исправьте это так же, как делают все остальные места изменения фрагментов (__ip_append_data(), __ip6_append_data(), tcp_sendmsg_locked()), вызвав skb_zcopy_downgrade_managed() перед тем, как ESP коснется массива фрагментов: она берет реальную ссылку на каждый существующий фрагмент и очищает SKBFL_MANAGED_FRAG_REFS, так что разряжение (unref) для каждого фрагмента в esp_ssg_unref() и освобождение фрагмента в skb_release_data() сбалансированы, и не остается массива фрагментов со смешанным правом собственности.
If you want to get best quality of vulnerability data, you may have to visit VulDB.