CVE-2026-80712
nicheLinux kernel spi-qpic-snand driver applies SET_FEATURE writes one operation late
The Linux kernel's Qualcomm QPIC SPI-NAND driver (spi-qpic-snand) executes SET_FEATURE commands before writing the intended value into the NAND_FLASH_FEATURES register, so the chip is programmed with a stale register value and the intended value only takes effect on the next SET_FEATURE operation. The defect surfaced with v6.18, which added SPI-NAND OTP support plus OTP entries for ESMT chips: during MTD registration, an OTP enable/disable sequence leaves the chip permanently in OTP mode, so every array read returns the OTP area (UBI reports an empty device) and all writes fail with -EIO. The practical impact is loss of the flash device and an unbootable system rather than remote compromise, consistent with the local attack vector of the 8.4 CVSS score. Affected systems are boards using the Qualcomm QPIC SPI-NAND controller under mainline Linux, confirmed on a TP-Link Archer AX55 v1 (IPQ5018, ESMT F50L1G41LB). Exploitation status: no public PoC, not in CISA KEV, and EPSS estimates only a 0.1% probability of exploitation in the next 30 days.
What to do: Apply the upstream spi-qpic-snand fix (write the feature value into NAND_FLASH_FEATURES as part of the same transaction before NAND_EXEC_CMD) as soon as it reaches the stable kernel series you track. Until then, avoid v6.18-based kernels with SPI-NAND OTP support on QPIC boards with ESMT flash, or backport the patch, and keep a known-good flash dump for boards such as the Archer AX55 v1. Devices already stuck in OTP mode (empty UBI, -EIO on writes) will need reflashing/recovery via the bootloader.
| Linux kernel spi-qpic-snand driver (Qualcomm QPIC SPI-NAND controller) | exact affected range not stated in the data; the severe OTP-related failure mode is triggered by kernels carrying the v6.18 SPI-NAND OTP support and ESMT OTP en |
| Qualcomm IPQ5018 SoC (QPIC SPI-NAND platform, as reproduced on affected hardware) | hardware platform; other IPQ boards using the same driver are plausibly affected (not enumerated in the data) |
| ESMT F50L1G41LB SPI-NAND flash | confirmed affected part on the reproduced board; other SPI-NAND parts are exposed to the generic off-by-one SET_FEATURE behavior |
| TP-Link Archer AX55 v1 (running mainline Linux with spi-qpic-snand) | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In the Linux kernel, the following vulnerability has been resolved: spi: spi-qpic-snand: write the feature value before executing SET_FEATURE qcom_spi_send_cmdaddr() programs NAND_FLASH_CMD/NAND_EXEC_CMD and submits the descriptors, which makes the controller execute the command immediately. For SPINAND_SET_FEATURE the value to be written is only placed into NAND_FLASH_FEATURES afterwards, by qcom_spi_io_op(), in a second submission - so the chip is programmed with whatever that register happened to hold from a previous operation, and the intended value is only applied by the *next* SET_FEATURE. Measured on a TP-Link Archer AX55 v1 (IPQ5018, ESMT F50L1G41LB): writing 0x40 to the configuration register (0xb0) leaves the chip at 0x00, and the subsequent write of 0x00 leaves it at 0x40 - every write lands one operation late. This stayed unnoticed until v6.18 added SPI-NAND OTP support together with OTP entries for ESMT chips. spinand_otp_rw() enables OTP mode, reads, and disables it again, and mtd_otp_nvmem_add() does this during MTD registration. With the off-by-one, the "disable" write actually applies the previously requested value, so CFG_OTP_ENABLE ends up set: the chip stays in OTP mode, every subsequent array read returns the OTP area instead of the array (UBI reports an empty device) and all writes fail with -EIO because the OTP area is write protected. On this board that makes the whole flash unusable and the device unbootable. Write the feature value into NAND_FLASH_FEATURES as part of the same transaction, before NAND_EXEC_CMD. While at it, copy only the bytes the operation actually carries - the previous code dereferenced a 4-byte pointer on a one-byte buffer (spinand->scratchbuf). With this patch the flash contents read back bit-identical to a known-good dump of the same board taken under the vendor firmware (md5-verified across partitions), and writes work.
- Vector
- CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.