
Документированные уязвимости безопасности во встроенной файловой системе FatFs с деталями CVE, фаззинг-харнессом, генератором эксплойт-образов дисков и анализом влияния на цепочку поставок в десятках нижестоящих проектов прошивок.
В этом репозитории задокументированы шесть подтверждённых уязвимостей безопасности в FatFs, а также тестовый стенд, фаззер и автономный генератор образов дисков для эксплуатации.
Исходный код FatFs можно найти в каталоге FatFs-R0.16.
Этот проект — возвращение к оценке безопасности 2017 года, когда ручной аудит и многодневный фаззинг выявили в драйвере FatFs несколько простых, но неинтересных багов. Девять лет спустя, в марте 2026 года, мы вернулись к этому проекту, используя Visual Studio Code, GitHub Copilot в режиме «auto» и несколько простых подсказок, без каких-либо специальных циклов, стендов или навыков. Результаты оказались неожиданными — баги, пропущенные при ручном аудите, стало тривиально находить с помощью LLM, автоматически создающего фаззер с новыми входными данными. Эти усилия не только позволили найти интересные баги, но и автоматизировали процесс проверки эксплуатабельности в различных сценариях встраиваемых систем.
Подробные заметки приведены в следующих файлах:
FatFs — это переносимая, бесплатная (royalty-free) библиотека файловой системы FAT/exFAT, написанная на C автором ChaN (elm-chan.org). Она предназначена для встраиваемых систем с ограниченными ресурсами, не зависит от ОС и обычно компилируется непосредственно в прошивку. Поддерживает FAT12, FAT16, FAT32 и exFAT, а также опционально LFN (Long File Name — длинные имена файлов) и GPT-разделы.
Благодаря тому, что FatFs мала, автономна и распространяется по разрешительной лицензии, она стала де-факто стандартной реализацией FAT для прошивок микроконтроллеров. Эта библиотека дословно вендорится в официальные SDK, ОСРВ (RTOS), загрузчики и прикладные фреймворки — то есть одна уязвимость в вышестоящем проекте распространяется на все нижестоящие проекты, скопировавшие ff.c.
В следующих проектах подтверждено наличие уязвимой версии FatFs. Полный анализ, пути распространения по каждому проекту и контактная информация по безопасности приведены в 02_CRITICAL.md.
| Проект | Звёзды | Версия FatFs | Баги |
|---|---|---|---|
| espressif/esp-idf | 17,655 | R0.16 | CVE-2026-6682 |
| STMicroelectronics/stm32-mw-fatfs | все STM32Cube | R0.15 с p2 | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686, CVE-2026-6687 |
| zephyrproject-rtos/zephyr | 14,820 | R0.16 | CVE-2026-6683, CVE-2026-6687, CVE-2026-6688 |
| micropython/micropython | 21,583 | R0.13c (2019) | CVE-2026-6682, CVE-2026-6683, CVE-2026-6684, CVE-2026-6686, CVE-2026-6687 |
| ArduPilot/ardupilot | 14,743 | R0.14b | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686, CVE-2026-6687 |
| RT-Thread/rt-thread | 11,862 | R0.16 | CVE-2026-6683, CVE-2026-6686 |
| nodemcu/nodemcu-firmware | 7,903 | различается | CVE-2026-6688 |
| RIOT-OS/RIOT | 5,701 | R0.15 | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686, CVE-2026-6687 |
| ARMmbed/mbed-os | 4,837 | R0.14b | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686 |
| sbabic/swupdate | 1,780 | R0.16 | CVE-2026-6683 |
| rsta2/circle | 2,222 | уточняется | CVE-2026-6684 |
| hugen79/NanoVNA-H | 695 | R0.15 | CVE-2026-6683 |
| ChibiOS/ChibiOS | 833 | различается | CVE-2026-6688 |
| Samsung/TizenRT | 643 | R0.16 | CVE-2026-6683, CVE-2026-6688 |
| adafruit/tinyuf2 | 447 | уточняется | CVE-2026-6684, CVE-2026-6686 |
| grblHAL/Plugin_SD_card | 475 | R0.16 | CVE-2026-6688 |
| JcZou/StarryPilot | 315 | R0.16 | CVE-2026-6688 |
| KeystoneHQ/keystone3-firmware | 199 | R0.16 | CVE-2026-6682 |
| flysight/flysight | 44 | различается | CVE-2026-6682, CVE-2026-6688 |
| eugene-tarassov/vivado-risc-v | 1,061 | уточняется | CVE-2026-6684 |
| Идентификатор CVE | Краткое название | CWE |
|---|---|---|
| CVE-2026-6682 | Целочисленное переполнение при монтировании тома FAT32 | CWE-190: целочисленное переполнение или зацикливание |
| CVE-2026-6683 | Деление на ноль при синхронизации exFAT | CWE-369: деление на ноль |
| CVE-2026-6684 | Бесконечный цикл при сканировании GPT-разделов | CWE-835: цикл с недостижимым условием выхода |
| CVE-2026-6686 | Использование неинициализированных кластеров после перехода за конец файла | CWE-908: использование неинициализированного ресурса |
| CVE-2026-6687 | Переполнение буфера стека из-за неограниченной длины метки exFAT | CWE-121: переполнение буфера на основе стека |
| CVE-2026-6688 | Переполнение буфера из-за неограниченного копирования имени файла LFN | CWE-120: копирование в буфер без проверки размера входных данных |
У FatFs нет истории CVE, списка рассылки по безопасности и механизма уведомлений о патчах. Каждый нижестоящий проект, вендорящий ff.c, должен самостоятельно обнаруживать, триажировать и исправлять эти уязвимости, обычно не зная, что он затронут. Это означает, что окно между публичным раскрытием и массовым исправлением будет измеряться годами, а не днями. Поэтому практическая поверхность атаки — это не одно приложение или сервис, а десятки миллионов устройств в дюжинах независимых кодовых баз, многие из которых никогда не получат патч.
Архетипичный сценарий эксплуатации — злая SD-карта: злоумышленник, имеющий доступ к устройству на несколько секунд, подменяет носитель данных — от бытовых камер до дронов, 3D-принтеров и тысячи других семейств продуктов. Каждая уязвимость в этом наборе срабатывает при монтировании специально сформированного FAT-образа, что почти всегда происходит автоматически при вставке без какого-либо взаимодействия с пользователем. При этом физический доступ — не единственный путь.
Устройства, которые принимают обновления в формате FAT из сетевого источника — например, через фреймворки OTA-обновлений и обновления загрузчика по принципу drag-and-drop, — эксплуатируемы любым атакующим, способным доставить вредоносный образ в конвейер обновлений. Это может быть компрометация цепочки поставок, AitM-внедрение в незашифрованную HTTP-ленту обновлений или вредоносный образ, размещённый на портале распространения любительских прошивок. Путь через OTA полностью удалённый для любого устройства, в котором отсутствует сквозная аутентифицированная проверка целостности контейнера обновления до его монтирования через FatFs.