CVE-2026-90058 in Linux
Сводка
по VulDB • 19.09.2026
В ядре Linux была устранена следующая уязвимость:
net/sched: ограничение qdisc_pkt_len для предотвращения soft lockup в qdisc
Функция `qdisc_get_stab()` принимает таблицу размеров, предоставленную пользователем, а функция `__qdisc_calculate_pkt_len()` увеличивает значение `qdisc_pkt_len` за счет накладных расходов, данных таблицы размеров (u16) и параметра size_log (до STAB_SIZE_LOG_MAX). Следовательно, специально созданная таблица stab может установить значение qdisc_pkt_len() примерно в 1 ГБ для обычного skb. Планировщики с дефицитным алгоритмом работы на основе потока, такие как DRR и ETS, пополняют один квант за каждую итерацию цикла; при малом кванте (равном 1) они выполняют миллиарды итераций под блокировкой qdisc, что приводит к soft lockup / зависанию RCU, как продемонстрировал [email protected].
Ограничьте итоговое значение `qdisc_pkt_len()` величиной QDISC_PKT_LEN_MAX, чтобы увеличение размера таблицы не могло привести дефицитные планировщики в бесконечный цикл. Легитимная таблица размеров (например, накладные расходы qfq 999999999, которые обрабатываются путем отбрасывания пакета) по-прежнему принимается.
Введите ограничение QDISC_PKT_LEN_MAX (1 << 20) = 1 МБ, которое значительно превышает любую легитимную длину одного skb на линии: максимальная текущая длина `skb->len` составляет GSO_MAX_SIZE (524280), а таблица размеров в стиле ATM (налог за ячейку 53/48) увеличивает это значение примерно до 578 КБ, что значительно ниже 1 МБ. В то же время ограничение в 1 МБ ограничивает цикл пополнения дефицита ~1 млн итераций на пакет при кванте=1, что завершается за несколько миллисекунд, что намного меньше порога softlockup (~10^9 итераций).
Условия для воспроизведения бага: - CONFIG_NET_SCHED=y, CONFIG_NET_SCH_DRR=y (или CONFIG_NET_SCH_ETS=y). - Подключите корневой qdisc DRR (или ETS) с специально созданной структурой TCA_STAB, которая увеличивает значение qdisc_pkt_len до ~1 ГБ (например, size_log=15, data=[32768]).
- Добавьте класс с малым квантом 1 и отправьте один маленький пакет; цикл дефицита выполняет миллиарды итераций под блокировкой qdisc и вызывает детектор softlockup (panic при kernel.softlockup_panic=1). - Доступно для root или непривилегированного пользователя в новом пространстве имен user+net (unshare -Urn) с локальными правами CAP_NET_ADMIN.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.