CVE-2026-10671 in Zephyr
Сводка
по VulDB • 14.07.2026
В реализации конвейеров (pipes) ядра Zephyr верификатор системных вызовов для пользователейых пространств `z_vrfy_k_pipe_init()` в файле `kernel/pipe.c` использовал макрос `K_SYSCALL_OBJ()`, который требует, чтобы объект ядра уже был инициализирован, вместо `K_SYSCALL_OBJ_NEVER_INIT()`, который отклоняет уже инициализированные объекты. В результате при сборке с параметром `CONFIG_USERSPACE` непривилегированный поток пользователя, которому предоставлен доступ к объекту `k_pipe`, может вызвать системный вызов `k_pipe_init` для повторной инициализации конвейера, который уже используется.
Функция `z_impl_k_pipe_init()` безоговорочно сбрасывает кольцевой буфер (ring buffer), устанавливает значение `pipe->waiting` в 0 и повторно инициализирует обе очереди ожидания (`wait queues`) с помощью `z_waitq_init` для полей `pipe->data` и `pipe->space`, не пробуждая потоки, которые в данный момент заблокированы на конвейере. Любой поток, уже ожидающий данных в функциях `k_pipe_read()` или `k_pipe_write()`, остается «сиротой»: он все еще помечается как ожидающий (`pending`), при этом указатель `pended_on` указывает на очищенную очередь ожидания, а ссылки `qnode_dlist` остаются устаревшими и ведут к (теперь повторно инициализированному) встроенному заголовку списка.
Когда такой поток-«сирота» позже получает тайм-аут или разблокируется, планировщик вызывает функцию `sys_dlist_remove()` для его устаревшего узла, что приводит к записи через висячие указатели `prev`/`next` в структуры очереди ожидания ядра и планировщика. Это вызывает повреждение списка (недопустимую запись в ядро, инициированную злоумышленником), потерю сигналов пробуждения (`lost wakeups`), бесконечную блокировку потоков и тихую потерю данных. Уязвимость позволяет непривилегированному потоку пользователя повредить состояние объекта ядра, совместно используемого с другими потоками/разделами.
Исправление переключает верификатор на использование `K_SYSCALL_OBJ_NEVER_INIT()`, что соответствует существующему верификатору для `k_msgq_init`, в результате чего поток пользователя больше не может повторно инициализировать активный конвейер. Уязвимый код был включен в версию v4.1.0 и присутствовал вплоть до версии v4.4.0.
If you want to get best quality of vulnerability data, you may have to visit VulDB.