Description
The system-call verifier for i3c_do_ccc() in drivers/i3c/i3c_handlers.c validated the outer struct i3c_ccc_payload, the broadcast ccc.data buffer and the targets.payloads[] array, but did not validate the per-target data buffers those array elements point at. Each struct i3c_ccc_target_payload carries its own data pointer and data_len, and neither was passed through K_SYSCALL_MEMORY() before the payload was handed to z_impl_i3c_do_ccc() and on to the controller driver. The verifier also operated on the caller's live structure rather than a snapshot, so validated fields could be changed by a second user thread between the check and the driver's use — unlike the sibling z_vrfy_i3c_transfer(), which has always copied its message array first.

The defect is only present in CONFIG_USERSPACE builds, where drivers/i3c/i3c_handlers.c is compiled. An unprivileged user-mode thread that has been granted access to the I3C controller device object — the ordinary way an application lets a user thread talk to I3C peripherals — can issue a direct CCC whose target payload data pointer names an arbitrary kernel address. Controller drivers dereference that pointer directly (for example drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c), using rnw to decide direction.

A read CCC therefore causes the kernel-mode driver to write bus-received bytes into an attacker-chosen kernel address for an attacker-chosen length, and a write CCC transmits kernel memory out onto the I3C bus. The result is an out-of-bounds kernel write plus a kernel memory disclosure, i.e. escalation from a user-mode thread to supervisor privilege, defeating the isolation CONFIG_USERSPACE is meant to provide.

The fix introduces copy_ccc_and_do(), which snapshots the payload, copies the target array into kernel memory with k_usermode_alloc_from_copy() (bounding num_targets to fewer than 32), validates each per-target buffer with K_SYSCALL_MEMORY() according to rnw, and copies the driver-written num_xfer and err fields back to the caller.
Published: 2026-10-05
Score: 7.8 High
EPSS: n/a
KEV: No
Impact: Privilege Escalation via Kernel Memory Read/Write
Action: Immediate Patch
AI Analysis

Impact

The vulnerability lies in the i3c_do_ccc system‑call verifier, which checks the outer I3C CCC payload but does not validate the per‑target data pointers. A user‑mode task that has been granted access to the I3C controller device can craft a CCC with a target pointer that resolves to any kernel address. When the driver dereferences that pointer, the kernel may read or write up to the specified length, allowing an out‑of‑bounds write or disclosure. Because the caller can supply arbitrary addresses, an attacker can overwrite kernel data or leak sensitive information, resulting in privilege escalation from the unprivileged task to supervisor mode and breaking the isolation promised by CONFIG_USERSPACE.

Affected Systems

Zephyr Project Zephyr releases that enable CONFIG_USERSPACE and compile the i3c_handlers.c module are affected. The flaw is present in any build where the user‑space i3c do_ccc system call is included, regardless of device type. All such configurations that allow a user thread to open the I3C controller device without additional protective permissions are vulnerable until the patch from commit 35562f22 … is applied.

Risk and Exploitability

The CVSS score of 7.8 places the defect in the high severity category. The EPSS score is not available; however, no known public exploits are listed in CISA KEV. The likely attack vector is a local user‑mode application that has been granted access to the I3C controller; the attacker must craft a malicious CCC payload to target a kernel address. Successful exploitation results in kernel memory read/write, leading to privilege escalation. Because the flaw operates via a user‑space system call, remote exploitation would require a vulnerability that gives an attacker the ability to execute code in the context of a running Zephyr application.

Generated by OpenCVE AI on October 5, 2026 at 09:21 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply the Zephyr kernel patch that introduces copy_ccc_and_do() and updates the i3c controller handlers.
  • Reconfigure I3C driver permissions so that only trusted applications can access the controller device, for example by setting device‑tree node permissions or using Zephyr’s access‑control API.
  • If a patch cannot be applied immediately, disable CONFIG_USERSPACE for the affected build or refrain from including the i3c_handler module in user‑space code.

Generated by OpenCVE AI on October 5, 2026 at 09:21 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 05 Oct 2026 09:45:00 +0000

Type Values Removed Values Added
First Time appeared Zephyrproject
Zephyrproject zephyr
Vendors & Products Zephyrproject
Zephyrproject zephyr

Mon, 05 Oct 2026 08:30:00 +0000

Type Values Removed Values Added
Description The system-call verifier for i3c_do_ccc() in drivers/i3c/i3c_handlers.c validated the outer struct i3c_ccc_payload, the broadcast ccc.data buffer and the targets.payloads[] array, but did not validate the per-target data buffers those array elements point at. Each struct i3c_ccc_target_payload carries its own data pointer and data_len, and neither was passed through K_SYSCALL_MEMORY() before the payload was handed to z_impl_i3c_do_ccc() and on to the controller driver. The verifier also operated on the caller's live structure rather than a snapshot, so validated fields could be changed by a second user thread between the check and the driver's use — unlike the sibling z_vrfy_i3c_transfer(), which has always copied its message array first. The defect is only present in CONFIG_USERSPACE builds, where drivers/i3c/i3c_handlers.c is compiled. An unprivileged user-mode thread that has been granted access to the I3C controller device object — the ordinary way an application lets a user thread talk to I3C peripherals — can issue a direct CCC whose target payload data pointer names an arbitrary kernel address. Controller drivers dereference that pointer directly (for example drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c), using rnw to decide direction. A read CCC therefore causes the kernel-mode driver to write bus-received bytes into an attacker-chosen kernel address for an attacker-chosen length, and a write CCC transmits kernel memory out onto the I3C bus. The result is an out-of-bounds kernel write plus a kernel memory disclosure, i.e. escalation from a user-mode thread to supervisor privilege, defeating the isolation CONFIG_USERSPACE is meant to provide. The fix introduces copy_ccc_and_do(), which snapshots the payload, copies the target array into kernel memory with k_usermode_alloc_from_copy() (bounding num_targets to fewer than 32), validates each per-target buffer with K_SYSCALL_MEMORY() according to rnw, and copies the driver-written num_xfer and err fields back to the caller.
Title Unvalidated user-supplied buffer pointers in the I3C do_ccc system call handler allow kernel memory read/write from user mode
Weaknesses CWE-822
References
Metrics cvssV3_1

{'score': 7.8, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H'}


Subscriptions

Zephyrproject Zephyr
cve-icon MITRE

Status: PUBLISHED

Assigner: zephyr

Published:

Updated: 2026-10-05T08:06:29.874Z

Reserved: 2026-08-06T18:36:11.738Z

Link: CVE-2026-19185

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-05T09:17:13.077

Modified: 2026-10-05T09:17:13.077

Link: CVE-2026-19185

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-05T09:30:10Z

Weaknesses
  • CWE-822

    Untrusted Pointer Dereference