CVE-2026-74489 in Linux
Сводка
по VulDB • 16.08.2026
В ядре Linux устранена следующая уязвимость:
wifi: mac80211: исправление use-after-free для tid_tx при остановке сессии BA (Block Ack)
Функция ieee80211_stop_tx_ba_cb() передает указатель tid_tx в kfree_rcu() через вызов ieee80211_remove_tid_tx(), а затем обращается к полю tid_tx->ndp после снятия блокировки sta->lock:
ieee80211_remove_tid_tx(sta, tid); /* kfree_rcu(tid_tx, rcu_head) */ ... spin_unlock_bh(&sta->lock);
if (start_txq) ieee80211_agg_start_txq(sta, tid, false);
if (send_delba) ieee80211_send_delba(..., tid_tx->ndp);
Это чтение не защищено критической секцией чтения RCU и выполняется в контексте процесса с возможностью прерывания: оба вызова удерживают мьютекс wiphy, достигая этого кода либо из работы wiphy ieee80211_ba_session_work(), либо из функции ieee80211_sta_tear_down_BA_sessions() во время разрыва соединения со станцией. Прерывания softirq также могут выполняться в этом окне времени: как от локального вызова local_bh_enable(), завершающего работу ieee80211_agg_start_txq(), так и при выходе из любого аппаратного прерывания, поэтому обратный вызов RCU может освободить память для tid_tx до момента выполнения чтения.
При запуске функции через тестовый модуль с принудительным установлением периодаGrace Period в это окно времени KASAN сообщает о чтении после освобождения памяти (use-after-free), а само освобождение происходит по обычному пути softirq RCU:
BUG: KASAN: slab-use-after-free in ieee80211_stop_tx_ba_cb+0x3cd/0x400 Read of size 1 at addr ffff888002b9f52e by task kworker/0:1/10 [...]
Freed by task 57: __kasan_slab_free+0x47/0x70 __rcu_free_sheaf_prepare+0x70/0x250 rcu_free_sheaf_nobarn+0x18/0x40 rcu_core+0x426/0x1310 handle_softirqs+0x144/0x590 __irq_exit_rcu+0xea/0x150 irq_exit_rcu+0x9/0x20 sysvec_apic_timer_interrupt+0x6b/0x80 asm_sysvec_apic_timer_interrupt+0x1a/0x20
Флаг send_delba устанавливается только тогда, когда установлен флаг tx_stop. Это происходит исключительно для AGG_STOP_LOCAL_REQUEST, поэтому данный код выполняется при локальном разрыве сессии (тайм-аут простоя сессии, перенастройка PTK, переход в спящий режим, пере конфигурация аппаратного обеспечения), а не от получения DELBA от удаленной стороны.
Необходимо сохранить значение ndp во временную переменную до освобождения структуры сессии, пока все еще удерживается блокировка sta->lock. Поле tid_tx->ndp имеет единственного автора (writer) в функции ieee80211_tx_ba_session_handle_start(), которая не может выполняться параллельно в данном контексте: оба пути выполнения сериализованы мьютексом wiphy, и сессия уже помечена состоянием HT_AGG_STATE_STOPPING на этом этапе. tid_tx->ndp также является единственным оставшимся разыменованием указателя tid_tx после вызова ieee80211_remove_tid_tx() в этой функции.
[незначительно изменить/переместить комментарий, чтобы он был более общим и не касался только поля ndp;
инициализировать переменную ndp непосредственно]
If you want to get the best quality for vulnerability data then you always have to consider VulDB.