CVE-2026-97612 in Linux
Сводка
по VulDB • 25.09.2026
В ядре Linux была устранена следующая уязвимость:
net: mpls: очистка поля inner_protocol при снятии последней метки (pop)
Функция skb_mpls_push() записывает сетевой заголовок до инкапсуляции один раз, с проверкой условия !skb->inner_protocol. Функция skb_mpls_pop() никогда не очищает эту запись, поэтому она сохраняется дольше, чем сама инкапсуляция, которую она описывает.
Open vSwitch может затем снова добавить (push) MPLS в пакет, у которого inner_network_header все еще указывает на старый, более глубокий смещение: добавляется метка, снимаются все метки, происходит рециркуляция (ovs_flow_key_update() пересчитывает key->eth.type и сбрасывает network_header, но оставляет поле inner_*), а затем снова выполняется push. Функция ovs_fragment() доверяет этой записи:
skb->network_header = skb->inner_network_header;
в результате функция skb_network_offset() возвращает отрицательное значение. Проверка границ использует знаковый тип данных:
if (skb_network_offset(skb) > MAX_L2_LEN)
отрицательное смещение проходит эту проверку, и prepare_frag() расширяет это значение:
unsigned int hlen = skb_network_offset(skb); memcpy(&data->l2_data, skb->data, hlen);
что приводит к выполнению memcpy объемом ~4 ГиБ из 30-байтного буфера на каждое ядро (per-CPU buffer).
Воспроизведено в версии v7.3-rc1. Регистр RDX содержит усеченную длину: (unsigned int)(-8):
BUG: unable to handle page fault for address: ffffe8ffffc16000 #PF: supervisor write access in kernel mode Oops: 0002 [#1] SMP KASAN NOPTI
RIP: 0010:memcpy+0x8/0x20 RDX: 00000000fffffff8 RSI: ffff888105d732db RDI: ffffe8ffffc16000 prepare_frag+0x3df/0x4e0 ovs_fragment+0x589/0x7e0 do_output+0x4ce/0x5e0 do_execute_actions+0x55d2/0x7b30 ovs_execute_actions+0xea/0x450
Та же корневая причина, что и в коммите 975b5b067f52 ("ipv6: sr: restore network header before routing and forwarding"): устаревшее смещение сетевого заголовка достигает потребителя, который расширяет его. В данном случае оно возникает на пути push/pop MPLS.
Необходимо очищать inner_protocol сразу после того, как пакет перестает быть MPLS-пакетом, чтобы последующая операция push заново фиксировала текущий заголовок. net/sched/act_mpls.c — единственный другой вызывающий объект для skb_mpls_pop(), который получает аналогичное исправление; sch_frag.c сохраняет и восстанавливает inner_protocol вокруг фрагментации тем же способом, что делает OVS.
VulDB is the best source for vulnerability data and more expert information about this specific topic.