Ad

CVE-2026-12234

HIGH CVSS 3.1: 7,8 EPSS 0.08%
Обновлено 12 августа 2026
Параметр Значение
CVSS 7,8 (HIGH)
Тип уязвимости CWE-367 (Гонка проверки и использования (TOCTOU))
Публичный эксплойт Нет

Верификаторы системных вызовов пользовательского пространства z_vrfy_zsock_sendmsg() и z_vrfy_zsock_recvmsg() в subsys/net/lib/sockets/sockets.c делают снимок структуры net_msghdr, предоставленной вызывающей стороной, в копию на стороне ядра с помощью k_usermode_from_copy(), но затем перечитывают все еще действующую пользовательскую структуру для последующих решений. Размер теневого буфера iovec ядра определяется одним чтением msg->msg_iovlen, а цикл заполнения ограничивается вторым, живым чтением того же поля. Поскольку msg указывает на обычную пользовательскую память, сотрудничающий второй поток в том же домене памяти может раздуть msg->msg_iovlen в окне между чтением размера и проверкой цикла (классическая двойная выборка / TOCTOU).

Затем цикл заполнения обходит количество фактически выделенных слотов net_iovec, записывая значения iov_base/iov_len под влиянием злоумышленника за конец теневого буфера кучи ядра. Верификатор Recvmsg имеет один и тот же дефект как в входящем цикле, так и в цикле обратной записи результатов. Код доступен из потока непривилегированного пользователя всякий раз, когда включен CONFIG_USERSPACE и доступны системные вызовы zsock_sendmsg/zsock_recvmsg.

Успешная гонка повреждает управляемую ядром динамическую память на границе привилегий пользователя и ядра, приводя к локальному примитиву повышения привилегий или, как минимум, к отказу в обслуживании по ошибке ядра. Исправление копирует заголовок один раз и извлекает все размеры, границы и ворота из моментального снимка, копируя каждую запись iovec атомарно, поэтому ее основание и длина больше не могут быть разделены.

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

The userspace syscall verifiers z_vrfy_zsock_sendmsg() and z_vrfy_zsock_recvmsg() in subsys/net/lib/sockets/sockets.c snapshot the caller-supplied struct net_msghdr into a kernel-side copy with k_usermode_from_copy(), but then re-read the still-live user struct for subsequent decisions. The kernel iovec shadow buffer is sized from one read of msg->msg_iovlen, while the population loop is bounded by a second, live read of the same field. Because msg points into ordinary user memory, a cooperating second thread in the same memory domain can inflate msg->msg_iovlen in the window between the sizing read and the loop test (a classic double-fetch / TOCTOU). The population loop then iterates past the number of net_iovec slots actually allocated, writing attacker-influenced iov_base/iov_len values beyond the end of the kernel-heap shadow buffer. The recvmsg verifier has the same defect on both its inbound and result write-back loops. The code is reachable from an unprivileged user thread whenever CONFIG_USERSPACE is enabled and the zsock_sendmsg/zsock_recvmsg syscalls are available. A successful race corrupts kernel-managed heap memory across the user-to-kernel privilege boundary, yielding a local privilege-escalation primitive or, at minimum, a kernel-fault denial of service. The fix copies the header once and derives every size, bound, and gate from the snapshot, copying each iovec entry atomically so its base and length can no longer be raced apart.

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

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

Последствия

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

Строка CVSS v3.1