
43
Реверс-инжиниринг прошивок позволяет разобрать монолитный бинарный блоб до байта, вытащить файловую систему и исследовать встроенное ПО без паяльника и программатора. Связка утилит Binwalk и Firmware Analysis Toolkit автоматизирует распаковку компонентов и поднимает полноценную виртуализированную лабораторию на базе QEMU.
Анатомия бинарного образа прошивки
Большинство образов для роутеров, IP-камер и IoT-устройств представляют собой склейку из заголовка производителя, загрузчика (чаще всего Das U-Boot), сжатого ядра Linux и корневой файловой системы. Простейший способ понять внутреннее устройство файла перед разбором — провести расчет энтропии.
|
1 2 |
# Анализ энтропии образа binwalk -E firmware.bin |
Участки с низкой энтропией указывают на загрузчики, несжатые таблицы символов и текстовые конфиги. Участки с плоской высокой энтропией (значения около 0.9–1.0) соответствуют сжатым блокам (GZIP, LZMA, SquashFS) либо шифрованным данным. Если весь файл выглядит как сплошной монолитный блок с максимальной энтропией без явных перепадов, прошивка зашифрована, и сначала потребуется отыскать ключ в бутлоадере через физический дамп флеш-памяти.
Распаковка файловой системы через Binwalk
Binwalk сканирует бинарник по сигнатурам (magic bytes), определяет смещения заголовков и вырезает вложенные контейнеры. Для автоматической работы используется режим рекурсивного извлечения «матрешка»:
|
1 2 |
# Рекурсивный поиск и распаковка всех вложенных структур binwalk -Me firmware.bin |
Флаг -M заставляет утилиту рекурсивно парсить все извлеченные архивы, а -e запускает профильные экстракторы (sasquatch, unsquashfs, unlzma, tar). В результате создается каталог _firmware.bin.extracted, внутри которого разворачивается корневая файловая система target-устройства (SquashFS, CramFS, JFFS2 или YAFFS2).
Если вендор модифицировал заголовок файловой системы, стандартный парсер выдаст ошибку. В таком случае срез данных вырезается вручную по смещению:
|
1 2 |
# Ручной карвинг блока через dd (смещение 1048576 байт) dd if=firmware.bin of=rootfs.squashfs bs=1 skip=1048576 |
Статический аудит извлеченного рутфса
После получения структуры каталогов /etc, /bin, /www и /usr начинается фаза быстрого поиска захардкоженных секретов и конфигурационных ошибок.
/etc/passwd и /etc/shadow.*.pem, *.key, *.crt./etc/init.d/ и /etc/rc.local на предмет запуска недокументированных telnet-демонов./www, /htdocs) на наличие уязвимых CGI-скриптов и прямого выполнения системных команд.Быстро вычленить секреты в распакованной папке помогает автоматизированный bash-пайплайн:
|
1 2 3 |
# Поиск приватных ключей, паролей и вызовов system/exec grep -Erio "(password|passwd|admin|secret|API_KEY)" ./squashfs-root/etc/ find ./squashfs-root/ -name "*.pem" -o -name "*.key" |
Динамическая эмуляция через FAT
Статический анализ дает представление о коде, но для поиска переполнений буфера и проверки логических ошибок требуется живое исполнение бинарников. Платформа FAT (Firmware Analysis Toolkit) автоматизирует запуск ядер Firmadyne под нужную архитектуру (MIPS, ARM, PPC) внутри QEMU, настраивает сетевые мосты и патчит обращения к NVRAM.
|
1 2 3 4 |
# Клонирование и инициализация окружения git clone --recurse-submodules https://github.com/attify/firmware-analysis-toolkit cd firmware-analysis-toolkit ./setup.sh |
Конфигурационный файл fat.config должен указывать актуальный путь к Firmadyne и параметры базы данных PostgreSQL. Сам процесс эмуляции запускается одной командой:
|
1 2 |
# Запуск автоматического распознавания архитектуры и эмуляции python3 fat.py firmware.bin |
FAT выполняет следующие действия:
libnvram.so.После завершения скрипт выводит IP-адрес сетевого моста (например, 192.168.0.1). С этого момента к веб-интерфейсу и сетевым службам устройства можно обращаться через браузер или терминал хоста точно так же, как к физическому роутеру.
Защита прошивок от анализа
Разработчикам встраиваемых систем необходимо минимизировать поверхность атаки еще на этапе компиляции.
| Вектор риска | Типовая уязвимость | Метод защиты |
|---|---|---|
| Обновление ПО | Подмена бинарника | Цифровая подпись образов через RSA/ECDSA в U-Boot |
| Секреты в коде | Статические пароли в /etc/shadow | Генерация уникальных учетных данных при первой инициализации |
| Дамп файловой системы | Свободное чтение через Binwalk | Полное шифрование rootfs с хранением ключа в Secure Element |
| Отладка в runtime | Фоновый Telnet / UART | Отключение тестовых консолей и закрытие аппаратных интерфейсов JTAG |
Внедрение механизма аппаратно доверенной загрузки (Hardware Root of Trust) и зачистка отладочных бинарников снижают вероятность компрометации оборудования даже при физическом доступе исследователя к устройству.