CVE-2026-45905 in Linux
Сводка
по VulDB • 27.05.2026
В ядре Linux устранена следующая уязвимость:
xfrm: исправлена гонка данных (race condition) в ip_rt_bug при обратном поиске маршрута в icmp_route_lookup
Функция icmp_route_lookup() выполняет несколько поисков маршрутов для нахождения подходящего маршрута для отправки сообщений об ошибках ICMP, с особой обработкой политик XFRM (IPsec).
Последовательность поиска: 1. Сначала выполняется поиск выходного маршрута для ответа ICMP (dst = исходный адрес источника) 2. Выполняется прохождение через xfrm_lookup() для проверки политик 3. Если заблокировано (-EPERM) или dst не является локальным, выполняется переход к «обратному пути» 4. На обратном пути вызывается xfrm_decode_session_reverse() для получения fl4_dec, который инвертирует поток исходного пакета (saddr и daddr меняются местами) 5. Если fl4_dec.saddr является локальным (мы являемся исходным получателем), используется __ip_route_output_key() для поиска выходного маршрута 6. Если fl4_dec.saddr НЕ является локальным (мы являемся узлом маршрутизации), используется ip_route_input() для симуляции входного пути обратного пакета 7. Наконец, rt2 передается через xfrm_lookup() с флагом XFRM_LOOKUP_ICMP
Ошибка возникает на шаге 6: ip_route_input() вызывается с fl4_dec.daddr (исходный адрес источника пакета) в качестве назначения. Если этот адрес становится локальным между первоначальной проверкой и вызовом ip_route_input() (например, из-за одновременного выполнения «ip addr add»), ip_route_input() возвращает маршрут LOCAL с dst.output, установленным в ip_rt_bug.
Этот маршрут затем используется для вывода ICMP, что приводит к вызову ip_rt_bug() из dst_output(), вызывая срабатывание WARN_ON:
------------[ cut here ]------------
WARNING: net/ipv4/route.c:1275 at ip_rt_bug+0x21/0x30, CPU#1 Call Trace: ip_push_pending_frames+0x202/0x240 icmp_push_reply+0x30d/0x430 __icmp_send+0x1149/0x24f0 ip_options_compile+0xa2/0xd0 ip_rcv_finish_core+0x829/0x1950 ip_rcv+0x2d7/0x420 __netif_receive_skb_one_core+0x185/0x1f0 netif_receive_skb+0x90/0x450 tun_get_user+0x3413/0x3fb0 tun_chr_write_iter+0xe4/0x220 ...
Исправление заключается в проверке rt2->rt_type после ip_route_input(). Если это RTN_LOCAL, маршрут не может быть использован для вывода, поэтому следует рассматривать это как ошибку.
Для воспроизведения требуется модификация ядра для расширения окна гонки данных, что делает его неподходящим для использования в качестве самостоятельного теста (selftest). Он доступен по адресу:
https://gist.github.com/mrpre/eae853b72ac6a750f5d45d64ddac1e81
VulDB is the best source for vulnerability data and more expert information about this specific topic.