Прошивки и встроенные системы
Как устроен образ прошивки IoT-устройства и почему в нём так часто находят зашитые пароли — разбираем глазами того, кто проверяет свои устройства.
Прошивка (firmware) — это программное обеспечение, зашитое в устройство (роутер, камеру, умную розетку): загрузчик, ядро, файловая система с программами и настройками. Реверс прошивки — извлечение этого образа и разбор его на составные части, чтобы понять устройство и найти проблемы безопасности.
Зачем это знать защитнику
Встроенные устройства печально известны слабой безопасностью: зашитые пароли, забытые отладочные сервисы, приватные ключи прямо в образе. Если вы разрабатываете или эксплуатируете IoT-устройства, анализ собственной прошивки — это аудит: вы находите то же, что нашёл бы атакующий, и закрываете дыры до релиза. Даже как пользователь вы можете легально исследовать СВОЁ устройство, чтобы оценить риски. Ключевое слово — своё: разбирать чужие устройства и обходить их защиту без разрешения недопустимо.
Откуда берётся образ
Легальные источники прошивки для аудита своего устройства: файл обновления с официального сайта производителя (часто это просто .bin), образ из вашего репозитория сборки, либо считывание с флеш-памяти устройства, которым вы владеете, через отладочные интерфейсы. Самый простой и безопасный путь для начинающего — взять официальный файл обновления своего роутера и разобрать его на диске, ничего не вскрывая физически.
Подход binwalk: что внутри образа
Образ прошивки — это склейка частей: заголовок, иногда сжатое ядро, образ файловой системы, может быть несколько разделов. binwalk — инструмент, который сканирует бинарный файл и по сигнатурам (magic bytes) распознаёт известные форматы: где начинается gzip-поток, где squashfs, где заголовок ядра. Это рабочая лошадка аудита прошивок, применяется к своему образу:
# обзор: какие форматы и по каким смещениям нашлись (свой образ)
binwalk firmware.bin
Типичный вывод — карта содержимого образа:
DECIMAL HEXADECIMAL DESCRIPTION
----------------------------------------------------------
0 0x0 uImage header, kernel
14528 0x38C0 LZMA compressed data
1048576 0x100000 Squashfs filesystem, little endian
По этой карте видно, что с адреса 1 МБ начинается файловая система squashfs. Дальше извлекают именно её, чтобы получить файлы устройства. binwalk умеет распаковывать рекурсивно, но принцип важнее команды: найти границы → выделить файловую систему → смонтировать/распаковать → читать файлы.
Файловые системы прошивок
Во встроенных системах ради экономии флеш-памяти используют компактные, обычно сжатые и доступные только для чтения файловые системы:
| ФС | Особенность |
squashfs | сжатая read-only, самая частая в роутерах/камерах |
cramfs | старая сжатая read-only |
jffs2 / ubifs | для NAND-флеша, поддерживают запись |
После извлечения файловой системы вы получаете привычное дерево Linux: /etc с конфигами, /bin и /sbin с программами (часто это busybox), /etc/init.d со скриптами запуска. Дальше анализ — это чтение файлов, а не магия.
Поиск ключей и учёток — в своей прошивке
Главная находка аудита — секреты, по ошибке оставленные в образе. Что проверяют в распакованной файловой системе СВОЕГО устройства:
- Файлы паролей.
/etc/passwdи/etc/shadow— есть ли захардкоженные пользователи, не пустой ли пароль у root. - Приватные ключи и сертификаты. Файлы
.pem,.key,id_rsa— если приватный ключ зашит в прошивку, он одинаков на всех устройствах модели. - Конфиги с секретами. Токены облака, пароли Wi-Fi по умолчанию, строки подключения в
/etc. - Отладочные сервисы. Включённый telnet, открытый порт диагностики, бэкдор-аккаунт «для поддержки».
Технически это поиск строк и греп по дереву — иллюстрация метода на своих файлах:
# поиск похожих на секреты строк в распакованной ФС (свой образ)
grep -rInE "BEGIN (RSA|OPENSSH) PRIVATE KEY|password=|api[_-]?key" rootfs/
Если такой поиск находит приватный ключ или непустой пароль root — это и есть та уязвимость, которую нужно устранить до выпуска устройства.
Как это работает под капотом
binwalk не «понимает» прошивку — он сопоставляет байты с базой сигнатур. У многих форматов есть характерные magic bytes в начале: например, squashfs начинается с hsqs (или sqsh в зависимости от порядка байт), gzip — с 1f 8b, LZMA/uImage имеют свои заголовки. Инструмент идёт по файлу и на каждом смещении проверяет, не совпадает ли там известная сигнатура; совпадения и становятся «картой» образа. Дальше распаковка опирается уже на структуру конкретного формата: для squashfs читается суперблок (размер, метод сжатия, смещения таблиц инодов и каталогов), затем разворачиваются сжатые блоки и восстанавливается дерево файлов. Поэтому реверс прошивки — это не взлом шифра, а распознавание форматов и распаковка стандартных структур; именно по этой причине секреты, лежащие внутри файлов, оказываются доступны после обычной распаковки.
Как защититься
Чек-лист разработчика встроенного устройства.
- Никаких захардкоженных учёток и ключей. Пароль root не пустой и не одинаковый для всей серии; приватные ключи генерируются на устройстве при первом запуске, а не зашиваются в образ.
- Уникальные секреты на устройство. Если ключ один на все экземпляры, компрометация одного компрометирует всю модель.
- Уберите отладку из релиза. Никакого включённого telnet, диагностических бэкдоров и «сервисных» аккаунтов в продакшн-прошивке.
- Подпись и проверка прошивки. Устройство должно проверять цифровую подпись обновления (secure boot / signed firmware), чтобы не принимать подменённый образ.
- Шифруйте чувствительные данные, а не прячьте. Конфиденциальные настройки храните зашифрованными ключом, недоступным из образа, а не просто «закопанными» в файловой системе.
- Аудит своего образа перед релизом. Прогоните по прошивке binwalk и поиск секретов сами — найдите дыры раньше атакующего.
Юридическое напоминание: анализировать и модифицировать можно только свои устройства или устройства с разрешения владельца; несанкционированный доступ и нарушение работы чужих систем наказуемы.
Итоги
- Прошивка — склейка загрузчика, ядра и файловой системы; реверс начинается с извлечения образа (лучше из официального обновления своего устройства).
- binwalk по сигнатурам находит границы форматов; типичная цель — выделить и распаковать файловую систему (часто squashfs).
- После распаковки это обычное дерево Linux: конфиги в
/etc, программы в/bin, скрипты запуска. - Частая находка аудита — зашитые пароли, приватные ключи, отладочные сервисы; их ищут грепом по дереву.
- Защита: не зашивать секреты, уникальные ключи на устройство, подпись прошивки, чистка отладки, самостоятельный аудит образа.