Прошивки и встроенные системы

Как устроен образ прошивки 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, скрипты запуска.
  • Частая находка аудита — зашитые пароли, приватные ключи, отладочные сервисы; их ищут грепом по дереву.
  • Защита: не зашивать секреты, уникальные ключи на устройство, подпись прошивки, чистка отладки, самостоятельный аудит образа.
Проверьте себя
1. Что в первую очередь делает инструмент binwalk с образом прошивки?
AРасшифровывает образ подбором ключа
BСканирует файл и по сигнатурам (magic bytes) находит границы известных форматов — ядра, файловой системы и т.п.
CПодключается к устройству по сети и считывает память
DКомпилирует прошивку из исходников
2. Почему зашитый в прошивку приватный ключ (одинаковый для всей серии устройств) — серьёзная проблема?
AОн замедляет загрузку устройства
BОн занимает слишком много флеш-памяти
CКомпрометация ключа на одном устройстве компрометирует всю модель, ведь ключ один на всех
DКлючи нельзя хранить в squashfs по стандарту