
Идентификация и извлечение прошивок IoT
Идентификация и извлечение прошивок IoT
moria идентифицирует файлы и структуры, встроенные в прошивки и образы IoT (файловые системы, ядра, загрузчики, архивы, ключи), и распаковывает большую часть найденного без root. Она сообщает о каждой находке с байтовым смещением, типом и оценкой достоверности, и выдаёт чистый JSON, так что скрипты и LLM-агенты могут управлять ею так же легко, как и люди.
upx -d.openat + O_NOFOLLOW (без обхода пути или выхода через символические ссылки), а декомпрессия ограничена против бомб.-j) для инструментов, со смещениями и достоверностью для каждой находки.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
Для сборки нужны cmake, компилятор C++20 и библиотеки разработки zlib, liblzma, lz4 и zstd (декомпрессоры, используемые --extract). В Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Чтобы собрать без одной из них (минимальная сборка или сборка только для идентификации), настройте с -DMORIA_OPTIONAL_CODECS=ON, и отсутствующий кодек просто будет отключён.
Бинарный файл moria самодостаточен: все наборы сигнатур встраиваются во время сборки, поэтому бинарник работает где угодно без ничего установленного рядом (cp build/moria ~/.local/bin достаточно, а скачанный релизный бинарник просто запускается). Чтобы использовать внешние сигнатуры вместо встроенных (например, протестировать новый .toml без пересборки), передайте --sigs DIR или установите $MORIA_SIGDIR.
Вывод по умолчанию удобочитаем для человека. Передайте -j для JSON.
moria <file> # identify: a findings tree with offsets, types, and confidence
moria <dir> # scan a tree: a type summary plus the notable files
moria -j <file> # JSON, for tools and agents
moria -e <file> # extract to <file>.extracted/ (-C DIR to choose the output dir)
moria -c <file> # carve raw byte ranges to <file>.carved/ (no parsing)
moria -E <file> # entropy pass: flag unidentified / possibly-encrypted regions
moria --list <archive> # list tar/cpio/zip members without extracting
moria --broad <path> # also load the ~2.5k general file-type signatures
moria --help
-e распаковывает распознанные форматы в <file>.extracted/, по одному каталогу на регион (0x<offset>-<type>/), плюс manifest.json, сопоставляющий смещения с путями. Она автоматически рекурсирует во вложенные контейнеры и пересобирает образы UBI том за томом. Защитные ограничения (--depth, --max-files, --max-bytes и предел коэффициента декомпрессии) ограничивают враждебный вход; сработавшее ограничение останавливает эту ветвь и всё равно возвращает всё восстановленное.
Распаковывается в процессе, без внешних инструментов и без sudo:
signatures/ — это написанное вручную ядро: файловые системы прошивок, контейнеры, ядра и распространённые форматы, каждый со структурной валидацией.signatures-firmware/ содержит магические сигнатуры контейнеров прошивок производителей и загружается по умолчанию.signatures-generated/ содержит ~2.5k магических сигнатур общих типов файлов, полученных из базы магических сигнатур file(1), и загружается только с --broad.Чтобы добавить формат, положите .toml в signatures/. Небольшой валидатор на C++ нужен только для проверок, которые не может выразить декларативный слой, таких как CRC или межблочные указатели.
moria выполняет структурную идентификацию, извлечение и карвинг. Сканирование секретов/учётных данных, SBOM, CVE и анализ лицензий — это отдельный инструмент (mithril).
MIT, см. LICENSE.
Некоторая обработка дисковых форматов является чистой переработкой алгоритмов из других open-source проектов, написанной независимо поверх собственного слоя ввода-вывода moria (исходный код не копировался): декомпрессор UCL/NRV2B и CTO-расфильтры из UPX/UCL (GPL-2.0, только алгоритмы), а также компоновка metadata-commit и CTZ skip-list из littlefs (BSD-3-Clause), и компоновка страниц/объектов из SPIFFS (MIT).