В ядре Linux устранена следующая уязвимость:
spi: spi-qpic-snand: записать значение функции перед выполнением SET_FEATURE
qcom_spi_send_cmdaddr() программирует NAND_FLASH_CMD/NAND_EXEC_CMD и отправляет
дескрипторы, которые заставляют контроллер выполнять команду
немедленно. Для SPINAND_SET_FEATURE необходимо записать только значение
помещенный в NAND_FLASH_FEATURES впоследствии с помощью qcom_spi_io_op() в
вторая подача - значит чип запрограммирован каким то регистром
произошло сохранение от предыдущей операции, и предполагаемое значение составляет только
применяется *следующим* SET_FEATURE. Измерено на TP-Link Archer AX55 v1 (IPQ5018, ESMT F50L1G41LB): запись
0x40 в регистр конфигурации (0xb0) оставляет чип в 0x00, и
последующая запись 0x00 оставляет его в 0x40 - каждая запись приводит к одному
операция поздно.
Это оставалось незамеченным до тех пор, пока в версии 6.18 не была добавлена поддержка SPI-NAND OTP.
с записями OTP для чипов ESMT. spinand_otp_rw() включает режим OTP,
читает и снова отключает его, а mtd_otp_nvmem_add() делает это во время
Регистрация МТД. При выключении на единицу действительно пишет "отключить"
применяет ранее запрошенное значение, поэтому CFG_OTP_ENABLE в конечном итоге устанавливается:
чип остается в режиме OTP, каждое последующее чтение массива возвращает OTP
область вместо массива (UBI сообщает о пустом устройстве) и все пишет
сбой с -EIO, поскольку область OTP защищена от записи. На этой доске
это делает всю флэш-память непригодной для использования и устройство не загружается.
Запишите значение функции в NAND_FLASH_FEATURES как часть того же
транзакция до NAND_EXEC_CMD. При этом копируйте только байты
операция действительно выполняется — предыдущий код разыменовал 4-байтовый
указатель на однобайтовый буфер (spinand->scratchbuf). С помощью этого патча содержимое флэш-памяти считывается побитно идентично
заведомо исправный дамп той же платы, взятый под вендорскую прошивку
(проверено md5 на всех разделах), и запись работает.
Показать оригинальное описание (EN)
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.
Характеристики атаки
Последствия
Строка CVSS v3.1