NONE

CVE-2026-23074

Обновлено 5 февраля 2026

В ядре Linux устранена следующая уязвимость: net/sched: обеспечить, чтобы teql можно было использовать только как корневой qdisc. Целью разработки teql является то, что его можно использовать только как корневой qdisc. Нам нужно проверить это ограничение. Хотя это не важно, я опишу сценарий, который раскопал это вопрос для любопытных. Ганмин Ким <[email protected]> сумел придумать следующий сценарий: КОРНЕВОЙ диск 1:0 (QFQ) ├── класс 1:1 (вес=15, lmax=16384) нетем с задержкой 6,4с └── класс 1:2 (вес=1, lmax=1514) текл GangMin отправляет пакет, который ставится в очередь 1:1 (netem). Любой вызов удаления из очереди с помощью QFQ из этого класса не вернет пакет. до тех пор, пока не пройдет 6,4 с. Тем временем отправляется второй пакет и он попадает на 1:2. очередь teql вернет успех, и это активирует класс 1:2. Основная проблема заключается в том, что teql обновляет только родительский видимый qlen (sch->q.qlen). в очереди. Поскольку QFQ вызовет удаление из очереди только в случае успешного просмотра (и команда teql peek всегда возвращает NULL), удаление из очереди никогда не будет вызываться и, следовательно, qlen останется равным 0. Учитывая это, когда GangMin обновляет значение lmax 1:2, класс qfq_change_class вызывает qfq_deact_rm_from_agg. Поскольку дочерний диск qlen не был увеличен, qfq не может деактивировать класс, но все же освобождает свои указатели от агрегата. Итак, когда первый пакет перепланировано через 6,4 секунды (задержка netem), висячий указатель доступ к которому вызывает GangMin, вызывающий UAF.

Показать оригинальное описание (английский)

In the Linux kernel, the following vulnerability has been resolved: net/sched: Enforce that teql can only be used as root qdisc Design intent of teql is that it is only supposed to be used as root qdisc. We need to check for that constraint. Although not important, I will describe the scenario that unearthed this issue for the curious. GangMin Kim <[email protected]> managed to concot a scenario as follows: ROOT qdisc 1:0 (QFQ) ├── class 1:1 (weight=15, lmax=16384) netem with delay 6.4s └── class 1:2 (weight=1, lmax=1514) teql GangMin sends a packet which is enqueued to 1:1 (netem). Any invocation of dequeue by QFQ from this class will not return a packet until after 6.4s. In the meantime, a second packet is sent and it lands on 1:2. teql's enqueue will return success and this will activate class 1:2. Main issue is that teql only updates the parent visible qlen (sch->q.qlen) at dequeue. Since QFQ will only call dequeue if peek succeeds (and teql's peek always returns NULL), dequeue will never be called and thus the qlen will remain as 0. With that in mind, when GangMin updates 1:2's lmax value, the qfq_change_class calls qfq_deact_rm_from_agg. Since the child qdisc's qlen was not incremented, qfq fails to deactivate the class, but still frees its pointers from the aggregate. So when the first packet is rescheduled after 6.4 seconds (netem's delay), a dangling pointer is accessed causing GangMin's causing a UAF.