OPENSENSOR ENGINEERING
Security Disclosures
CVE-2026-50720CWE-347 · Improper Verification of Cryptographic SignaturePhysical Attack Vector

Ingenic T31 Boot ROM — Improper Secure Boot Verification

Single 32-bit word comparison during RSA-2048/SHA-256 SPL verification — effective security reduced to 32 bits

Discovered: March 2026 · Vendor notified: March 17, 2026 · CVE assigned: June 2026 · Published: July 31, 2026

Vendor
Ingenic Semiconductor
Affected Products
T31 SoC family (all sub-variants)
Attack Vector
Physical (boot media write)
Patchable?
No — mask ROM

CVSS 3.1

8.1HIGH
CVSS:3.1/AV:P/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
MetricValueRationale
Attack VectorPhysical (P)SPI NOR write access required
Attack ComplexityLow (L)Forgery is deterministic; ~3–4 minutes on commodity CPU
Privileges RequiredNone (N)
User InteractionNone (N)
ScopeChanged (C)Boot ROM compromise impacts entire system
C/I/AHigh / High / HighFull device takeover

A conservative S:U reading scores 6.8 Medium. We recommend S:C because the vulnerable component (mask ROM) is outside the security scope of the impacted component.

Vulnerability Description

The Ingenic T31 SoC boot ROM (mask ROM) implements secure boot verification of the SPL (Secondary Program Loader) image using RSA-2048 and SHA-256. Due to an implementation flaw in the flash-boot verification path, the boot ROM compares only a single 32-bit word of the RSA-derived output against a single 32-bit word of the SHA-256 payload digest, rather than comparing the full cryptographic data. This reduces the effective security of signature verification from 128 bits to 32 bits and allows a physically present attacker who can write to the SPI NOR boot media to forge a modified SPL image that passes secure boot verification without possession of the OEM signing key.

The vulnerability was confirmed by three independent methods:

  1. Static reverse engineering of the T31 boot ROM mask image.
  2. Software emulation of the verification path against vendor-signed reference images.
  3. End-to-end hardware acceptance of a forged firmware image on a Wyze Video Doorbell v2 (T31X) shipped with secure boot enabled.

The vulnerability is structural to the T31 boot ROM and applies uniformly to all T31 sub-variants; the sub-variant designation only reflects unrelated features such as imaging sensor support and package options.

Affected Products

Confirmed affected (hardware-validated):

  • Ingenic T31 SoC family — all sub-variants, all known mask ROM revisions (T31, T31X, T31L, T31N, T31ZL, T31NQ, etc.)
  • Wyze Video Doorbell v2 (T31X-based) used as validation target

Not affected:

  • Ingenic T32, T40, T41, A1 — affected by a separate vulnerability class tracked as CVE-2026-50719

Impact

  • Complete bypass of first-stage secure boot on T31
  • Execution of arbitrary unsigned SPL and second-stage bootloader code
  • Full firmware replacement without the OEM signing key
  • Persistence across factory reset — the forged SPL image lives in SPI NOR flash and is re-executed on every boot
  • Vulnerability is in mask ROM and cannot be remediated by firmware update

Proof of Concept

The following demonstrates the 4-byte SHA-256 collision search used to forge an SPL image. The target word is derived from the vendor signature and the OEM public key. A 4-byte nonce is iterated until the first 32 bits of the payload hash match the target.

#!/usr/bin/env python3
"""T31 4-byte hash collision forgery — proof of concept."""
import hashlib
import struct
from pathlib import Path


def forge_collision(payload: bytes, target_word: int,
                    nonce_offset: int) -> int | None:
    """Find a 4-byte SHA-256 collision by brute-forcing a nonce."""
    target_bytes = struct.pack('>I', target_word)
    payload = bytearray(payload)

    for nonce in range(2 ** 32):
        struct.pack_into('<I', payload, nonce_offset, nonce)
        if hashlib.sha256(bytes(payload)).digest()[0:4] == target_bytes:
            return nonce
    return None


# Usage:
#   target  = 0x3024cc99  # derived from vendor signature + OEM public key
#   nonce   = forge_collision(payload, target, nonce_offset=0x3290)

Expected work factor: 2³¹ SHA-256 evaluations on average. On a 32-worker commodity CPU search at ~15 MH/s aggregate throughput, a working collision is found in 3–4 minutes. Each forgery attempt succeeds with probability ≈ 63% within 2³² iterations.

Workarounds

Because the vulnerability is in mask ROM, there is no in-field firmware-only mitigation. Practical risk reduction options for deployed fleets:

  • Physical hardening. Restrict physical access to device boot media. Disable or physically remove any in-circuit flashing interface (UART, JTAG, USB boot mode entry) where possible.
  • eFuse-based boot media locking. If the SoC/die supports SPI-NOR write-protection via eFuse or a write-protect pin that is set after manufacturing, ensure it is enabled.
  • Chain-of-trust monitoring. Attest the running kernel and userspace from a separate secure element if available.
  • Replacement. For deployments where secure boot is a hard requirement, migrate to an SoC without this vulnerability.

Affected vendors should reach out to Ingenic for silicon-level guidance.

Detection

A forged SPL image is, by construction, byte-different from any legitimately signed vendor image. Fleet operators can detect tampering by:

  • Periodic cryptographic comparison of in-field SPI NOR contents against a known-good vendor image.
  • Comparison of the SPL header, signature block, and SPL body hash against vendor-published reference values.

Signature validity alone does not indicate an authentic image. A byte-level comparison against the vendor image is required.

Disclosure Timeline

  1. March 2026Vulnerability discovered by Matt Davis and Alfonso Gamboa
  2. March 17, 2026Ingenic Semiconductor notified via multiple channels
  3. March 17, 2026Downstream vendor (Wyze) notified; coordination ongoing
  4. March 2026Vulnerability confirmed by hardware demonstration on T31X device
  5. March 25, 2026CVE submitted to MITRE — early submission (7 days) justified by unpatchable mask ROM
  6. May 30, 2026Full technical details presented at Maine BSides
  7. June 2026CVE-2026-50720 assigned by MITRE

Credit

Discovered by Matt Davis (OpenSensor Engineering LLC) and Alfonso Gamboa — equal co-discovery.

Content editing and reporting validation by Josh at WLTechBlog.