{"id":30346,"date":"2026-09-29T08:30:59","date_gmt":"2026-09-29T00:30:59","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-16513"},"modified":"2026-09-29T08:30:59","modified_gmt":"2026-09-29T00:30:59","slug":"cve-2026-16513","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-16513","title":{"rendered":"CVE-2026-16513 [HIGH] &#8211; The userspace verifier z_vrfy_rtio_sqe_copy_in_get_handles() in subsys\/rtio\/rtio_syscalls."},"content":{"rendered":"<p>The userspace verifier z_vrfy_rtio_sqe_copy_in_get_handles() in subsys\/rtio\/rtio_syscalls.c (subsys\/rtio\/rtio_handlers.c before v4.3.0) validated the RTIO object handle and the sqes input array, but not the handle out-parameter. On the first loop iteration it executed *handle = sqe, storing the kernel address of the newly acquired submission-queue entry through a pointer taken verbatim from user mode, with no K_SYSCALL_MEMORY_WRITE check in front of it.<\/p>\n<p>Any user-mode thread that has been granted a struct rtio kernel object can invoke the syscall with an arbitrary address in handle. That is the ordinary way an unprivileged thread uses the RTIO API, for example via sensor_read_async_mempool() or the async ADC helpers, which call rtio_sqe_copy_in_get_handles() internally. The store happens in supervisor mode before any submission-entry validation, so it fires regardless of whether the SQE contents are subsequently rejected. Only builds with CONFIG_USERSPACE and CONFIG_RTIO are affected; without CONFIG_USERSPACE the verifier is not compiled and the caller is already privileged.<\/p>\n<p>The write address is fully attacker-chosen and the written value is a pointer into the caller&#8217;s own RTIO ring, whose contents the caller controls (the following *sqe = sqes[i] copies an attacker-supplied struct rtio_sqe into that slot). This yields a write-what-where primitive placing a pointer to attacker-controlled data at any kernel address, sufficient to corrupt kernel function pointers, thread structures, or memory-domain partition tables, and thus to escalate from user mode to kernel mode, defeating the isolation boundary CONFIG_USERSPACE is meant to enforce. At minimum it is a reliable kernel memory-corruption and crash primitive. The reporter reproduced the write on qemu_x86: a K_USER thread changed a supervisor global from NULL to a live kernel SQE pointer.<\/p>\n<p>The fix adds K_SYSCALL_MEMORY_WRITE(handle, sizeof(*handle)) (guarded by the existing optional-NULL semantics) before the loop, so the destination must lie in the calling thread&#8217;s writable memory domain or the thread is terminated by K_OOPS. The neighbouring verifier z_vrfy_rtio_cqe_get_mempool_buffer(), which checked its buff\/buff_len out-parameters only for read although the implementation writes through them, was hardened separately by bea93400138 (&#8220;rtio: syscalls: validate output params as writable&#8221;); that residual was materially weaker, since a read check still confines the target to the caller&#8217;s own memory domain.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The userspace verifier z_vrfy_rtio_sqe_copy_in_get_handles() in subsys\/rtio\/rtio_syscalls.c (subsys\/rtio\/rtio_handlers.c before v4.3.0) validated the RTIO object handle and the sqes input array, but n<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-30346","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/30346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=30346"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=30346"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=30346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}