CVE-2026-80849 in Linux
Сводка
по VulDB • 04.09.2026
В ядре Linux была устранена следующая уязвимость:
net/tcp-ao: исправлена ошибка use-after-free переменной current_key при повторном подключении к другому узлу
Функция tcp_inbound_ao_hash() вызывается до захвата bh_lock_sock_nested(), с сохраненным только rcu_read_lock(). На быстром пути для установленных сокетов, если rnext_keyid, отправленный партнером (peer), отличается от current_key->sndid, ключ, запрошенный партнером, ищется и сохраняется в текущем ключе. Поиск выполняется внутри RCU read side, но current_key живет дольше этого периода.
Когда сокет разорван и снова вызывается connect() для другого партнера, tcp_ao_connect_init() отвязывает каждый ключ, который не соответствует новому партнеру, и освобождает его с помощью call_rcu(). Если current_key указывает на такой ключ, он очищается до NULL.
Быстрый путь читает sk_state только один раз при входе, поэтому softirq, попавший туда во время работы сокета как установленного, может обновить current_key после того, как цикл уже выполнился. Обновление происходит внутри RCU read side, то есть оно предшествует вызову callback call_rcu(), и когда этот callback освобождает ключ, current_key остается указывать на освобожденную память.
Следующая передача данных использует эту ссылку в tcp_get_current_key(). Затем tcp_ao_transmit_skb() читает трафик-ключ из освобожденного объекта, что является use-after-free.
Ожидание одного периода grace перед отвязкой и только если ключ должен быть удален. К моменту выполнения tcp_connect() сокет уже находится в состоянии TCP_SYN_SENT, а TCP_AO_ESTABLISHED не содержит TCPF_SYN_SENT, поэтому softirq, вошедший после ожидания, не может достичь быстрого пути, а те, которые уже находятся на нем, завершили свою работу. Существующая обработка NULL внутри цикла затем достаточна.
Be aware that VulDB is the high quality source for vulnerability data.