CVE-2026-99134 in LinuxИнформация

Сводка

по VulDB • 28.10.2026

В ядре Linux была устранена следующая уязвимость:

mac802154: исправлена гонка данных (race condition) и разыменование нулевого указателя в local->assoc_dev

local->assoc_dev используется совместно путем ассоциации и воркером обработки ответа без общей синхронизации.

Функция mac802154_perform_association() сохраняет указатель на координатор и ожидает ответ. Пути тайм-аута и ошибки очищают этот указатель и возвращают управление в mac802154_associate(), которая может затем освободить объект координатора. Тем временем mac802154_rx_mac_cmd_worker() может обнаружить установленный бит ассоциации (associating bit) и перейти к функции mac802154_process_association_resp(), которая выполняет разыменование assoc_dev.

Проверка бита воркером и разыменование указателя обработчиком не являются атомарными относительно операции очистки. Очистка может обнулить assoc_dev между этими операциями, что приведет к разыменованию нулевого указателя (NULL deref), или освободить координатор в то время, когда обработчик ответа все еще использует этот указатель.

Зафиксированный результат подвержен той же самой гонке данных. Поля assoc_status и assoc_addr записываются обработчиком, но читаются путем ассоциации, пока установлен бит ассоциации; поэтому второй ответ на тот же запрос — например, злонамеренный (malicious) — может заменить их между операциями чтения, оставив вызывающую сторону с несогласованной парой статуса и адреса.

Обработчику ответа требуется только расширенный адрес координатора. Замените assoc_dev кэшированным адресом, убрав зависимость от времени жизни указателя. Защитите кэшированный адрес и бит ассоциации с помощью отдельного спинлока (spinlock). Пара READ_ONCE()/WRITE_ONCE() не гарантирует атомарный доступ __le64 на всех 32-битных архитектурах.

wpan_dev->association_lock нельзя использовать здесь: nl802154_associate() удерживает его в течение rdev_associate(), то есть всего периода mac802154_perform_association(), включая ожидание ответа. Обработчик ответа, захватывающий этот мьютекс, получит доступ только после того, как ассоциация уже откажется от ожидания.

Сбросите событие завершения (completion), опубликуйте кэшированный адрес и установите бит ассоциации, удерживая блокировку. Обработчик ответа захватывает эту блокировку, повторно проверяет бит и кэшированный адрес, записывает ответ, сбрасывает бит и только затем сигнализирует о завершении ожидания (completes the waiter). Таким образом, очистка не может произойти между проверкой состояния обработчиком и его завершением, а 64-битное значение в кеше не будет повреждено (tear) при чтении.

Обработчик сбрасывает бит перед вызовом завершения, а не пробужденный поток ожидания: иначе complete() был бы выполнен под блокировкой, и второй ответ (например, злонамеренный) мог бы захватить ее раньше потока ожидания и заменить результат. Поэтому ожидание, возвращающее успех, подразумевает, что бит уже сброшен, а пути успешного завершения и обработки отрицательного ответа завершаются напрямую. Пути ошибки передачи данных и тайм-аута все еще сбрасывают его под assoc_lock, который сериализует любую гонку между ответом и очисткой в то время, как вызов возвращает уже выбранную ошибку. Оба пути делают снимок (snapshot) значений assoc_status и assoc_addr под одной блокировкой.

Обе функции выполняются в контексте процесса, поэтому достаточно обычного спинлока. Блокировка не удерживается во время ожидания завершения события.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

Ответственный

Linux

Резервировать

25.09.2026

Раскрытие

28.10.2026

Модерация

принято

Вход

VDB-427912

EPSS

0.00000

KEV

Нет

Деятельности

Очень низкий

Источники

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!