🇰🇷 한글 설명
Linux 커널의 spi-qpic-snand 드라이버에서 SET_FEATURE 명령 실행 시 설정값이 실제 명령보다 한 단계 늦게 적용되는 오프바이원(off-by-one) 오류가 발견되었습니다. 이로 인해 OTP(One-Time Programmable) 모드 설정 시 의도치 않게 OTP 모드가 활성화되어 플래시 메모리가 잠기고 장치가 부팅 불가능한 상태가 될 수 있습니다.
💡 쉬운 설명
기기 내부의 저장 장치에 설정을 저장할 때, 명령 순서가 뒤바뀌어 잘못된 설정이 적용되는 문제입니다. 이 오류로 인해 저장 장치가 잠겨버리면 기기가 아예 켜지지 않을 수 있습니다.
🇺🇸 원문 (English)
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.
📍 영향받는 시스템
Linux kernel (SPI-NAND OTP 지원이 추가된 v6.18 이상 버전 및 관련 퀄컴 SPI 컨트롤러 사용 기기)
⚔️ 공격 벡터
로컬 시스템 권한을 가진 공격자가 OTP 관련 설정(MTD 등록 등)을 유도하여 플래시 메모리를 영구적으로 손상시킬 수 있음
🛡️ 대응 방법
NAND_FLASH_FEATURES에 값을 먼저 기록한 후 명령을 실행하도록 커널 패치를 적용하고, 버퍼 복사 로직을 수정해야 함
🔧 검증 코드
출력된 커널 버전이 v6.18 이상인지 확인하여 해당 취약점의 잠재적 영향 범위에 있는지 판단합니다.