В ядре Linux обнаружена уязвимость, связанная с обработкой таймеров протокола покрывающего дерева (STP) в реализации программного сетевого моста. Проблема позволяет локальному пользователю выполнить произвольный код в контексте ядра. Эксплойт для неё уже опубликован, а разработчики выпустили исправление.
Детали уязвимости
Сетевой мост в Linux - это программный механизм, объединяющий несколько сетевых интерфейсов в один логический сегмент. Такие мосты широко применяются в виртуализации, контейнерных средах и при построении сложных сетевых конфигураций. Для предотвращения петель в сети мост может использовать протокол STP, который выбирает активные пути и переводит избыточные порты в блокирующее состояние. Работу протокола обеспечивают периодические таймеры, запускаемые ядром.
Уязвимость относится к категории использования после освобождения (use-after-free), то есть к обращению к уже освобождённой области памяти. Таймеры STP встроены во внутреннюю структуру сетевого устройства моста. Когда мост удаляется, память возвращается в системный пул. Если в этот момент таймеры ещё стоят в очереди на выполнение, при срабатывании ядро обращается к памяти, которой больше не существует.
Причина проблемы - в расхождении двух путей завершения работы устройства. При штатном переводе моста из активного состояния в неактивное ядро вызывает процедуру остановки, которая синхронно удаляет все таймеры STP. Однако если интерфейс уже находится в неактивном состоянии и его удаляют напрямую, эта процедура не выполняется. В результате таймеры остаются в очереди, а само сетевое устройство уничтожается.
Для воспроизведения уязвимости нужно выполнить несколько условий. Мост должен быть административно выключен, но с включённым STP. Один из портов моста необходимо перевести в состояние обучения - режим, при котором порт анализирует входящие кадры, но ещё не передаёт данные. В этом состоянии код STP запускает периодические таймеры, причём проверка активности интерфейса не выполняется. После удаления моста таймеры продолжают оставаться в очереди.
Таймеры в ядре организованы по процессорным очередям: каждый процессор имеет собственный список отложенных задач. Когда таймер ставится в очередь, он привязывается к текущему процессору. При срабатывании ядро ищет функцию обратного вызова по указателю, хранящемуся в структуре таймера. Если структура перезаписана, ядро вызовет произвольный адрес.
Через небольшой промежуток времени обработчик таймеров запускает отложенную функцию. Поскольку структура моста уже освобождена, сработавший таймер обращается к некорректной памяти. Если атакующий разместит в этой области собственные данные и подменит указатель на функцию обратного вызова, он получит контроль над потоком выполнения ядра. Это классический сценарий перехвата управления, который обычно приводит к выполнению произвольного кода.
Локальный пользователь, имеющий возможность создавать и удалять сетевые интерфейсы, а также управлять мостами и портами, может использовать уязвимость для повышения привилегий. В мультитенантных средах, где пользователи имеют ограниченный доступ к сетевым настройкам, такая проблема может стать шагом к побегу из контейнера или виртуальной машины. Атака не требует физического доступа к системе, но предполагает наличие учётной записи в ней.
Проблему обнаружили независимые исследователи n132 и Sven Sze. Они представили её на соревновании TyphoonPWN 2026 и заняли второе место в категории повышения привилегий в Linux. Технические детали раскрытия публиковала организация SSD Secure Disclosure.
Разработчики ядра уже включили исправление в основную ветку. Патч доступен в виде коммита 2a00517db8de4be7df3d483b215c5544fb30a191. Администраторам рекомендуется обновить ядро до версии, содержащей это исправление. Дистрибутивы, поддерживающие собственные ядра, должны выпустить обновлённые пакеты в ближайшее время.
До установки патча стоит избегать конфигураций, в которых мост с включённым STP находится в выключенном состоянии. Однако такая мера не является полноценной защитой, так как администраторы не всегда контролируют все возможные сценарии изменения состояния интерфейсов. Наиболее надёжное решение - своевременное обновление ядра.
Уязвимость затрагивает все версии ядра до выхода исправления. Она привлекает внимание к важности согласованной очистки ресурсов при разных путях удаления сетевых устройств. Ошибки в жизненном цикле структур данных периодически встречаются в сетевой подсистеме, и их устранение требует тщательной проверки всех веток завершения работы. Опубликованный эксплойт делает задачу обновления особенно актуальной для систем, где доступ к сетевым настройкам имеют непривилегированные пользователи.
Ссылки
- https://ssd-disclosure.com/linux-bridge-stp-timer-use-after-free/
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2a00517db8de4be7df3d483b215c5544fb30a191