CVE-2026-99191 in LinuxИнформация

Сводка

по VulDB • 28.10.2026

В ядре Linux была устранена следующая уязвимость:

calipso: сохранение корректного значения payload_len для больших пакетов TCP в функции calipso_skbuff_setattr()

Функция calipso_skbuff_setattr() корректирует значение payload_len на длину опции, которую она вставляет или изменяет:

payload = ntohs(ip6_hdr->payload_len); ip6_hdr->payload_len = htons(payload + len_delta);

GRO (Generic Receive Offload) может формировать большие пакеты TCP размером более IPV6_MAXPLEN и сохраняет для них payload_len == 0; затем ipv6_payload_len() выполняет возврат к значению skb->len. Для такого пакета, перенаправленного в пункт назначения с маппингом CALIPSO, приведенный выше код записывает len_delta (или 65536 + len_delta при уменьшении размера) в payload_len, и ipv6_payload_len() больше не выполняет возврат к значению skb->len. Модули nf_tables, conntrack и sch_cake зависят от этого поведения.

Та же арифметическая операция приводит к переполнению (wrap-around), когда пакет превышает размер IPV6_MAXPLEN; большой пакет TCP, который уменьшается до размера меньше IPV6_MAXPLEN, должен восстановить свое реальное значение длины.

Установите payload_len на основе длины skb с помощью функции ipv6_set_payload_len(), которая сохраняет 0 для значений выше IPV6_MAXPLEN и реальную длину в остальных случаях, аналогично тому, как это делает ipv6_gro_complete(). Заголовок сетевого уровня был только что сброшен до значения skb->data, поэтому skb->len - sizeof(*ip6_hdr) представляет собой длину полезной нагрузки.

Тестирование проводилось на одном ядре (arm64, QEMU) с режимом SELinux permissive, минимальной политикой, сгенерированной mdp (network_peer_controls=1), командой "netlabelctl calipso add pass doi:16" и маппингом NetLabel fd00:2::/64 в CALIPSO DOI 16. Функция calipso_skbuff_setattr() вызывалась через netlbl_skbuff_setattr() из тестового хука debugfs (не входящего в состав данного патча), добавляющего только уровень метки; значение payload_len после вызова:

case before fix after fix real length 1000, unlabeled 1016 1016 1016 70000 GSO, payload_len 0 16 0 70016 65530 GSO, grows past MAXPLEN 10 0 65546 65540 GSO with a 24 byte hop header, shrinks below MAXPLEN 65528 65532 65532 1000 with a 24 byte hop header 992 992 992

(Значение 0 означает, что ipv6_payload_len() возвращает реальную длину.) На пути передачи данных (forward path), при клиенте, внедряющем немаркированные UDP-пакеты через маршрутизатор на сервер, маршрутизатор добавляет опцию CALIPSO, и сервер доставляет все дейтаграммы (Udp6InDatagrams 5, Ip6InTruncatedPkts 0) с данным патчем.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Ответственный

Linux

Резервировать

25.09.2026

Раскрытие

28.10.2026

Модерация

принято

Вход

VDB-427954

EPSS

0.00000

KEV

Нет

Деятельности

Очень низкий

Источники

Interested in the pricing of exploits?

See the underground prices here!