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.