Ad

CVE-2026-12365

MEDIUM CVSS 3.1: 5,8 EPSS 0.10%
Обновлено 26 августа 2026
Параметр Значение
CVSS 5,8 (MEDIUM)
Тип уязвимости CWE-416 (Использование памяти после освобождения)
Публичный эксплойт Нет

Use-after-free существует в рабочей очереди Zephyr второго поколения (kernel/work.c) при обработке отложенных тайм-аутов работы. Когда тайм-аут отложенного рабочего элемента исключен из очереди и его обработчик work_timeout() находится в работе (заблокирован при получении спин-блокировки рабочей очереди), параллельная отмена не ожидает завершения этого обработчика. В unschedule_locked() код префикса, называемый z_abort_timeout(), который для уже объявленной записи возвращает -EINVAL без ее удаления; cancel_async_locked() затем отслеживает работу как бездействующую, поэтому даже k_work_cancel_delayable_sync() и k_work_flush_delayable() возвращаются без блокировки в летном обработчике.

Поскольку это API-интерфейсы, которые документированы в заголовке ядра как безопасный способ отмены перед освобождением k_work_delayable, вызывающая сторона, которая освобождает объект сразу после успешной отмены синхронизации, может участвовать в гонке все еще ожидающего обработчика. work_timeout() впоследствии разыменовывает освобожденную запись: она читает to->dticks через z_is_timeout_handler_canceled() и, если освобожденный слот был повторно использован, поэтому проверка освобождения не удалась, выполняет чтение-изменение-запись wp->flags (K_WORK_DELAYED_BIT) и отправляет работу по устаревшему указателю очереди dw-> — чтение и запись с использованием после освобождения. API k_work работает только в режиме ядра (без точки входа __syscall), поэтому это внутренний дефект параллелизма ядра, а не повышение привилегий пользовательского пространства. Для его запуска требуется сборка SMP и подсистема, которая планирует, а затем освобождает (или перепланирует) отложенный рабочий элемент в узком окне, пока объявляется его тайм-аут; Злоумышленник, способный повлиять на время такого отключения (например, с помощью таймеров подсистемы управления отключением соединений), имеет правдоподобный, но вероятностный путь.

Воздействием является повреждение памяти ядра или сбой (отказ в обслуживании). Исправление заставляет unschedule_locked() ждать, вращая z_try_abort_timeout(), возвращая -EAGAIN при освобождении и повторном получении рабочей блокировки, пока любой текущий обработчик не завершится перед возвратом, и переключает work_timeout() на атомарное владение K_WORK_DELAYED_BIT. Это закрывает как «использование после освобождения», так и связанную с ним гонку с ранним перепланированием.

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

A use-after-free exists in the Zephyr second-generation work queue (kernel/work.c) in the handling of delayable work timeouts. When a delayable work item's timeout has been dequeued and its handler work_timeout() is in flight (blocked acquiring the work-queue spinlock), a concurrent cancellation does not wait for that handler to finish. In unschedule_locked() the pre-fix code called z_abort_timeout(), which for an already-announcing record returns -EINVAL without removing it; cancel_async_locked() then observes the work as idle, so even k_work_cancel_delayable_sync() and k_work_flush_delayable() return without blocking on the in-flight handler. Because those are the APIs the kernel header documents as the safe way to cancel before freeing a k_work_delayable, a caller that frees the object immediately after a successful sync cancel can race the still-pending handler. work_timeout() subsequently dereferences the freed record: it reads to->dticks via z_is_timeout_handler_canceled() and, if the freed slot has been reused so the bail check fails, performs a read-modify-write of wp->flags (K_WORK_DELAYED_BIT) and submits work against a stale dw->queue pointer — a use-after-free read and write. The k_work API is kernel-mode only (no __syscall entry point), so this is a kernel-internal concurrency defect rather than a userspace privilege escalation. Triggering it requires an SMP build and a subsystem that schedules and then frees (or reschedules) a delayable work item in the narrow window while its timeout is announcing; an attacker able to influence the timing of such teardown (for example via connection churn driving subsystem timers) has a plausible but probabilistic path. The impact is kernel memory corruption or crash (denial of service). The fix makes unschedule_locked() wait, by spinning on z_try_abort_timeout() returning -EAGAIN while releasing and re-acquiring the work spinlock, until any in-flight handler completes before returning, and switches work_timeout() to atomic K_WORK_DELAYED_BIT ownership. This closes both the free-then-handler use-after-free and the related reschedule early-fire race.

Характеристики атаки

Способ атаки
Локальный
Нужен локальный доступ
Сложность
Высокая
Сложно эксплуатировать
Нужны права
Низкие
Нужны базовые права
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Низкое
Частичная утечка данных
Целостность
Низкое
Частичная модификация данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1