Публикуван е публичен доказателствен код (proof-of-concept - PoC) за уязвимост от тип „use-after-free“, засягаща подсистемата за мрежов мост (bridge) в ядрото на Linux, по-конкретно нейната имплементация на протокола Spanning Tree (STP) в net/bridge.

Проблемът може да остави таймерите на STP активни след изтриването на мрежовото устройство за мост, което ги притежава, създавайки опасно състояние с безопасността на паметта в slab кеша kmalloc-cg-8k.

Уязвимостта от тип „use-after-free“ възниква, когато STP в ядрото е активиран на административно спрян мрежов мост (bridge) и порт на моста премине в състояние LEARNING.

При това състояние ядрото може да задейства периодични STP таймери, без да проверява флага на интерфейса IFF_UP. Тези таймери поддържат крайния автомат на STP, който предотвратява цикли от слой 2 (Layer 2 loops) чрез управление на състоянията на портовете на моста и промените в мрежовата топология.

Linux съхранява таймери като hello_timer, tcn_timer, topology_change_timer и специфични за портовете таймери в структурата struct net_bridge. Тази структура се намира в частната област за данни на net_device на моста.

В резултат на това таймерите трябва да бъдат премахнати, преди поддържащото мрежово устройство да бъде освободено. Ако те останат на опашката след освобождаването на паметта, ядрото може по-късно да се опита да изпълни функция за обратно извикване (callback) на таймера чрез невалидна препратка към паметта.

Според разкритието на SSD Disclosure, грешката произтича от различното поведение при почистване между нормалното спиране на интерфейса и директното изтриване на мрежовия мост.

По време на стандартен преход от състояние UP към DOWN, пътят ndo_stop достига до br_stp_disable_bridge(), който синхронно отменя STP таймерите чрез del_timer_sync(). Това предотвратява достъпа на чакащи обратно извиквания до освободените данни на моста.

Въпреки това, изтриването на мост чрез пътя delink извиква br_dev_delete() и не задейства същата процедура за почистване на STP. Ако интерфейсът вече е спрян, процесът по дезинсталиране на устройството също може да прескочи ndo_stop.

Това оставя задействаните таймери прикачени към базата от таймери за всеки процесор (per-CPU timer base), въпреки че свързаният net_device впоследствие се освобождава. Когато рутината за обработка на таймери на ядрото по-късно обработи висящия таймер в контекста на софтуерно прекъсване (softirq), тя може да реферира към освободена памет.

Изследователите отбелязват, че контролираното преразпределяне на освободения slab обект потенциално може да превърне грешката в примитив за похищение на контролния поток (control-flow hijacking), увеличавайки въздействието над обикновен срив или отказ от услуга (DoS).

Публичният PoC демонстрира засегнатия жизнен цикъл и подчертава важността на своевременното отстраняване на проблема в среди, които позволяват промени в конфигурацията на мрежовите мостове.

Корекция за сигурност в ядрото на Linux е въведена в commit 2a00517db8de4be7df3d483b215c5544fb30a191. Системите, работещи с ядра преди тази промяна, трябва да се считат за засегнати и да бъдат актуализирани чрез поддържаните пакетни ядра на съответната дистрибуция.

Докато бъдат внедрени коригираните ядра, администраторите трябва да ограничат възможността на недоверени потребители да създават, променят или премахват интерфейси за мостове и да преглеждат работните натоварвания, които използват STP в ядрото.