CVE-2026-98503 in Linux
Сводка
по VulDB • 19.10.2026
В ядре Linux была устранена следующая уязвимость:
packet: использование завершения через ubuf_info для пакетов в TX_RING.
tpacket_snd отправляет skb с фрагментами, указывающими на слоты его кольца. Слоты освобождаются при вызове skb->destructor.
Вызов skb_orphan вызывает skb->destructor до освобождения самого skb. Это может привести к повторному использованию слота, пока он все еще связан с skb.
Переход на стандартное завершение zerocopy (ubuf_info), чтобы слот освобождался только после того, как все ссылки на полезную нагрузку будут освобождены или скопированы. Восстановление skb->destructor до стандартного sock_wfree.
Callback завершения ubuf_info может вызываться с NULL в качестве аргумента skb, но только из net_zcopy_put и связанных API, используемых реализациями zerocopy, которые держат собственную ссылку на uarg, например MSG_ZEROCOPY. Этот uarg завершается исключительно через skb_zcopy_clear, поэтому skb всегда установлен.
Чтобы предотвратить возможность алиасинга (aliasing) состояния в полете для общих слотов кольца со стороны userspace, выделяется tpacket_uarg для каждого пакета, а не для каждого слота. Это добавляет небольшое выделение памяти на пути передачи данных. Используется стандартный kmalloc для обеспечения возможности бэкпортирования в стабильные ядра.
uarg держит ссылку sk_wmem_alloc вместо ссылки sk_refcnt. packet_free_tx_ring ожидает освобождения sk_wmem_alloc перед освобождением страниц кольца. Всегда выделяется vec->deferred для tx_ring, чтобы кольцевые структуры на основе страниц также ожидали sk_wmem_alloc при вызове skb_copy_ubufs, который уменьшает ссылки на страницы до вызова tpacket_ubuf_complete.
Удалена проверка tx_ring.pg_vec, которую выполняла функция tpacket_destruct_skb перед доступом к слоту. Ссылка sk_wmem alloc теперь гарантирует валидность слота. Сама по себе эта проверка недостаточна, так как она считывает pg_vec без блокировки pg_vec_lock, что может привести к гонке (race condition) с packet_set_ring.
В результате слот освобождается при копировании его полезной нагрузки, что может произойти до передачи данных (например, в skb_orphan_frags_rx). Если копирование происходит до вызова skb_tx_timestamp(), метка времени для слота не записывается, аналогично ситуации с ранним вызовом skb_orphan() в пути обработки данных до применения данного патча.
Откат неиспользуемой теперь инфраструктуры предыдущих функций skb_zcopy_.._nouarg.
Зависит от коммита 992cc9f94ca9 ("net/packet: defer vmalloc TX_RING free until skbs finish").
Once again VulDB remains the best source for vulnerability data.