Skip to content

DesignWare I2C target driver can be wedged into a permanent stuck state by an on-bus master (DoS)

Low
d3zd3z published GHSA-fj9c-r5qw-3639 Jul 27, 2026

Software

zephyr

Affected versions

>= 4.0.0, <= 4.4.1

Patched versions

4.5.0

Description

In the Synopsys DesignWare I2C driver (drivers/i2c/i2c_dw.c) operating in target/slave mode, the rx_full interrupt handler gates the write_requested() callback on dw->state != CMD_SEND, and dw->state is only reset to READY on a STOP interrupt. The START_DET interrupt, whose handler in i2c_dw_slave_read_clear_intr_bits() would reset the state on every (re)START, was never added to the enabled interrupt mask in i2c_dw_slave_register(), so that recovery path was dead code.

As a result, if the STOP interrupt is lost (bus glitch/reset, or a concurrent master driving STOP) or the bus master issues a legal WRITE-repeated-START-WRITE sequence with the same direction, the driver remains in CMD_SEND permanently and never invokes write_requested() again for the life of the target.

An I2C master on the same physical bus can deliberately trigger this, causing the I2C target function to malfunction for all subsequent write transactions and desynchronizing consumer framing state (e.g. MCTP-over-I2C), a recoverable-by-reset denial of service of the target peripheral.

The fix unmasks START_DET so the state is reset at every bus (re)START. Impact is availability-only over a local board-level bus; no memory corruption results in the in-tree consumer, whose per-byte buffer write is independently bounds-checked.

Affected components

  • drivers/i2c/i2c_dw.c

Affected versions

All releases with I2C_TARGET support on the DesignWare i2c_dw driver (pre-dates v4.4.0)

Fix

Fixed (merged) in 06e2053

Projected fixed version: 4.5.0 (the fix is merged on main but not yet released; this forecast should be confirmed against the actual release).

Introduced by: 6d5ec5a (drivers: i2c: added slave support for DW) — state-gated write_requested() with stop-only reset

Evidence

  • drivers/i2c/i2c_dw.c:619-625 — rx_full handler gates write_requested() on dw->state != I2C_DW_CMD_SEND
  • drivers/i2c/i2c_dw.c:655-662 — dw->state reset to READY only on stop_det
  • drivers/i2c/i2c_dw.c:1223-1226 — start_det handler resets state to READY, but was unreachable without the mask bit
  • drivers/i2c/i2c_dw.c:1166-1169 — the fix: DW_INTR_MASK_START_DET added to the enabled target interrupt mask
  • subsys/pmci/mctp/mctp_i2c_gpio_target.c:18-32 — consumer relies on write_requested() to reset framing state
  • subsys/pmci/mctp/mctp_i2c_gpio_target.c:62-70 — per-byte buffer store is bounds-checked (rx_idx >= rx_pkt->size), so missed reset does not cause OOB write

Patches

Branch Pull request Status
main #107537 merged
v4.4-branch #111415 merged
v4.3-branch #111414 merged

For more information

If you have any questions or comments about this advisory:

embargo: 2026-07-26

Severity

Low

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Physical
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
Low

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:P/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

CVE ID

CVE-2026-10683

Weaknesses

Loop with Unreachable Exit Condition ('Infinite Loop')

The product contains an iteration or loop with an exit condition that cannot be reached, i.e., an infinite loop. Learn more on MITRE.