intel_dsi_vbt: MIPI sequence execution walks the kmemdup'd VBT blob with no end bound β heap OOB read via i2c/spi/delay/gpio elements and the operation loop
Summary
exec_sequence iterates elements until a 0x00 byte with no bound against the end of the kmemdup'd blob - vbt.dsi.size is stored precisely for this but never consumed. Every element handler dereferences past the blob on a truncated/desynced VBT: i2c reads *(data+6) and skips up to 262B, spi reads *(data+5), delay reads a u32, gpio reads 2-3 bytes; v1/v2 walks silently re-sync on garbage. Parse-time walkers are partial and v3 sizes are FIXME-unchecked - execution is the last line of defense and has none. Crafted-VBT model (DF-1770..1773/4121..4123 class); crash DoS holding mode_config mutex, no direct disclosure. Thread-the-end-pointer fix.
Discussion (0)
PoC verification
Evidence pack
findings/poc/DF-4626 Β· 1 files| File | Type | Description | Size | |
|---|---|---|---|---|
| verdict.json | file | 1.2 KB | view raw |
Fix verification
not_testablenot_testable: hardware-gated (no Intel DSI panel / no mpt HBA on guest)
fix in finding markdown
Confirmed kernel references
Detail
Exploit chain
[]
Evidence (decisive lines)
Crafted-VBT walk unbounded until a zero byte: i2c/spi skip sizes (up to 262B) jump arbitrarily far; parse-time walkers partial, v3 sizes explicitly FIXME-unchecked. Distinct from DF-1771 (send_packet len) and DF-4123 (parse overread). Thread-the-end-pointer fix.
Verdict
not_run: no Intel GPU on guest; execution is the last line of defense and has no bound (vbt.dsi.size stored but never consumed)
No comments yet.