Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain SPI host-controller control over SHI bus
-
DeliverySend well-formed first SHI request
-
ExploitDe-assert CS and inject header with data_len=0xFFFF
-
ExecutionWin race before thread reads packet length
-
ImpactLeak ~64KiB adjacent EC memory or fault controller
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V15 - Secure Coding and Architecture Concurrency control, locking
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a device running Zephyr with the ITE IT8xxx2 SHI host-command backend (ec_host_cmd_backend_shi_ite.c) active as the EC host-command transport. The attacker must control the SPI host controller - i.e., a compromised host OS driving chip-select and clock, or physical access to the SPI lines - and must win a timing race: after a valid first request, de-assert chip select (returning the driver to ready and re-enabling the FIFO) and start a second transaction carrying a header with data_len=0xFFFF, landing those 8 bytes in in_msg during the window before the host-command thread executes args.input_buf_size = rx_header->data_len. Meaningful disclosure further depends on the registered command handler copying or echoing input_buf_size bytes. Limiting factors: local bus access only (no network vector), high attack complexity due to the race, and the fact that the pre-patch bug needs interrupts accepted in states other than SHI_STATE_DISABLED; note the fix leaves a residual bounded race (an end-of-transaction interrupt still resets to ready while the buffer is owned), unlike the NPCX backend which parks in SHI_STATE_CNL_RESP_NOT_RDY. |
| Impact | This is a genuine but access-gated vulnerability rather than a high-urgency internet-facing one. The CVSS 3.1 vector (AV:L/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:H, 6.7 Medium) is internally consistent with the description: the attack is LOCAL because it requires driving the inter-processor SHI/SPI bus, and AC:H correctly reflects that exploitation hinges on winning a timing race against the host-command thread. PR:N is technically accurate - there is no authentication on the SHI bus itself - but this should not be read as 'remote unauthenticated' in the network sense; the attacker must already be the SPI controller (a compromised host OS or physical SPI-line access), which is a substantial precondition. There is no EPSS score, no CISA KEV listing, and no public POC provided, so exploitation status is 'no public exploit identified at time of analysis.' The race is retryable indefinitely by the SPI controller, which somewhat offsets the AC:H difficulty for a determined local attacker. Impact is real: C:H reflects disclosure of up to ~64 KiB of adjacent embedded-controller memory, and A:H reflects a controller fault when the read runs past SRAM. No key signals are in direct conflict; the main caveat is that the high C/A impact is only reachable by an attacker already positioned on the inter-processor bus, so prioritization should weigh the deployment's threat model (is the host OS trusted?) heavily. |
| Exploit ScenarioDerived | An attacker who has compromised the host operating system (or has physical access to the SPI lines) acts as the SHI/SPI controller, sends a well-formed host-command request, then immediately de-asserts chip select and begins a second transaction whose 8-byte header declares data_len = 0xFFFF. If the second header lands in the window before the embedded-controller host-command thread reads rx_header->data_len, the framework hands a registered command handler a 65535-byte input length over a 256-byte buffer, producing an out-of-bounds read that leaks adjacent EC memory back to the host or faults the controller. No public exploit code is identified, but the SPI controller can retry the race indefinitely until it wins. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 09, 2026
Out-of-bounds read of up to roughly 64 KiB in Zephyr's ITE IT8xxx2 SHI host-command backend allows an attacker who drives the SPI host controller to disclose adjacent embedded-controller SRAM to the host, or to fault the controller by reading past the end of SRAM. The root cause is a race: the 8-byte host-command header is copied from the SPI Rx FIFO directly into the shared in_msg buffer before the protocol version and derived packet length are validated, so a second transaction carrying data_len = 0xFFFF can deposit its header into a buffer that verify_rx() has already accepted; if those bytes land before the host-command thread assigns args.input_buf_size = rx_header->data_len, a registered handler is handed a 65535-byte length over a 256-byte buffer. Exploitation requires local control of the inter-processor SHI bus (a compromised host OS driving chip select and clock, or physical access to the SPI lines) plus a timing race the host can retry indefinitely, and is unauthenticated per the CVSS vector (PR:N); no public exploit code or confirmed active exploitation was identified at time of analysis.
RemediationAI
Primary fix: apply the upstream Zephyr commit 0636e65c825e810ad97f154606365870152d402f (advisory GHSA-4x98-6536-cwjv), which parses the host-command header into a local struct ec_host_cmd_request_header, copies it into in_msg only after the length is bounded by sizeof(data->in_msg), and rejects chip-select and RVLI interrupts outside SHI_STATE_READY_TO_RECV/SHI_STATE_RECEIVING; because the input only confirms patch availability from the vendor and a commit reference, an exact patched release tag is not independently confirmed, so track the advisory for the supported release that carries the change. If patching must be deferred: audit every registered host-command handler and remove or wrap any that copy or echo input_buf_size bytes into the response, which removes the memory-disclosure path but not the underlying out-of-bounds read or the fault-on-SRAM-overrun; treat the host OS as untrusted and avoid granting it a host-command channel over the SHI bus, understanding this breaks normal EC management; and enforce physical protection of the SPI lines, since physical access alone is sufficient to exploit the race. Note the side effects and residual risk: the fix does not eliminate a bounded race in which a valid second request can still overwrite an in-flight request's buffer, because the ITE backend does not park in a buffer-in-use state equivalent to the NPCX backend's SHI_STATE_CNL_RESP_NOT_RDY; fully disabling the SHI ITE backend removes exposure but eliminates EC host-command transport on that SoC.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Zephyr's embedded-controller host command framework (subsys/mgmt/ec_host_cmd) lets a host processor issue structured commands to an EC over a transport backend; on ITE IT8xxx2 SoCs that transport is the SPI-based SHI interface implemented in subsys/mgmt/ec_host_cmd/backends/ec_host_cmd_backend_shi_ite.c. Each request starts with a fixed 8-byte struct ec_host_cmd_request_header carrying prtcl_ver, data_len, checksum, cmd_id and cmd_ver; verify_rx() in ec_host_cmd_handler.c validates the checksum and the framework then derives args.input_buf_size from rx_header->data_len before dispatching to the registered command handler. The vulnerable code wrote the header from the Rx FIFO straight into the long-lived shared buffer data->in_msg and only then bounded the length, and the interrupt handler accepted a chip-select assertion and an Rx-valid-length (RVLI) interrupt in any driver state other than SHI_STATE_DISABLED, so a new header could be parsed while the host-command thread was still consuming the previous request from that same buffer. This is a classic CWE-362 concurrent-execution-on-a-shared-resource flaw: a check (verify_rx and the version/length validation) is performed on a buffer that can be rewritten afterwards, producing a TOCTOU-style oversized length (CWE-362) that surfaces as an out-of-bounds read and a possible SRAM access fault. The fix parses the header into a local struct ec_host_cmd_request_header, memcpy's it into in_msg only after the length is bounded by sizeof(data->in_msg), and restricts chip-select and RVLI interrupt handling to SHI_STATE_READY_TO_RECV/SHI_STATE_RECEIVING; a residual bounded race remains because an end-of-transaction interrupt can still reset the state to ready while the host-command thread owns the buffer, unlike the NPCX backend which parks in SHI_STATE_CNL_RESP_NOT_RDY.
Know when Zephyr gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:H
AV:L because the attacker must drive the inter-processor SHI/SPI bus; AC:H for the required timing race; PR:N as the bus has no auth; C:H/A:H for ~64KiB memory disclosure and controller fault, I:N.
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
DescriptionCVE.org
The ITE IT8xxx2 SHI host-command backend (subsys/mgmt/ec_host_cmd/backends/ec_host_cmd_backend_shi_ite.c) copied the 8-byte host-command request header from the SPI Rx FIFO directly into the shared receive buffer data->in_msg and only afterwards checked the protocol version and the derived packet length. The interrupt handler also accepted a chip-select assertion and an Rx-valid-length (RVLI) interrupt in any driver state other than SHI_STATE_DISABLED, so a new header could be parsed while the host-command thread was still processing the previous request out of the very same buffer.
The host processor is the SPI controller and drives both chip select and the clock. After sending a well-formed request it can immediately de-assert chip select - which returns the driver to the ready state and re-enables the FIFO - and start a second transaction carrying a header with data_len = 0xFFFF. Those eight bytes are written into in_msg before the oversized length is rejected, so they land in a buffer whose contents verify_rx() in subsys/mgmt/ec_host_cmd/ec_host_cmd_handler.c has already validated. If this lands in the window before the host-command thread executes args.input_buf_size = rx_header->data_len, the framework hands the registered command handler a 65535-byte input length over a 256-byte buffer.
The result is an out-of-bounds read of up to roughly 64 KiB beyond the request buffer: command handlers that copy or echo input_buf_size bytes disclose adjacent embedded-controller memory back to the host or overflow the response buffer, and a read past the end of SRAM faults the controller. The same race also allows cmd_id and cmd_ver to be swapped after checksum verification and after handler lookup. Exploitation requires the ability to drive the inter-processor SHI bus (a compromised host OS or physical access to the SPI lines) and winning a timing race, which the SPI controller can retry indefinitely.
The fix parses the header into a local struct ec_host_cmd_request_header and copies it into in_msg only after the length has been bounded by sizeof(data->in_msg), and ignores chip-select and RVLI interrupts outside SHI_STATE_READY_TO_RECV/SHI_STATE_RECEIVING. A residual, bounded race remains: an end-of-transaction interrupt still resets the state to ready while the host-command thread owns the buffer, so a valid second request can still overwrite the in-flight request's contents, unlike the NPCX backend which parks in SHI_STATE_CNL_RESP_NOT_RDY while the buffer is in use.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
A buffer overflow occurs when a program writes more data to a memory buffer than it was allocated to hold, causing the excess data to spill into adjacent memory regions.
Race conditions occur when multiple concurrent requests exploit the brief time gap between checking a condition and acting upon it (TOCTOU - Time of Check, Time of Use).
Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),
An out-of-bounds write in the Zephyr RTOS DNS resolver (dns_unpack_name()) lets a crafted DNS response corrupt memory on
Possible variant of CVE-2021-3434 in function le_ecred_reconf_req. Rated critical severity (CVSS 9.8), this vulnerabilit
Unchecked user input length in /subsys/net/l2/wifi/wifi_shell.c can cause buffer overflows. Rated critical severity (CVS
Potential buffer overflow vulnerability in the Zephyr CAN bus subsystem. Rated critical severity (CVSS 9.8), this vulner
Integer Underflow in 6LoWPAN IPHC Header Uncompression in Zephyr. Rated critical severity (CVSS 9.8), this vulnerability
Buffer overflow in Zephyr USB DFU DNLOAD. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitable
DOS: Incorrect 802154 Frame Validation for Omitted Source / Dest Addresses. Rated critical severity (CVSS 9.8), this vul
zephyr-rtos version 1.12.0 contains a NULL base pointer reference vulnerability in sys_ring_buf_put(), sys_ring_buf_get(
Potential buffer overflow vulnerabilities n the Zephyr Bluetooth subsystem. Rated critical severity (CVSS 9.6), this vul
The documentation specifies that the BT_GATT_PERM_READ_LESC and BT_GATT_PERM_WRITE_LESC defines for a Bluetooth characte
Potential buffer overflows in the Bluetooth subsystem due to asserts being disabled in /subsys/bluetooth/host/hci_core.c
EUVD-2026-95527
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB