
IoT-Firmware-Identifikation und -Extraktion
Identifikation und Extraktion von IoT-Firmware
moria identifiziert Dateien und die in Firmware und IoT-Images eingebetteten Strukturen (Dateisysteme, Kernel, Bootloader, Archive, Schlüssel) und entpackt das meiste, was es findet, ohne Root-Rechte. Es meldet jeden Fund mit einem Byte-Offset, einem Typ und einem Konfidenzwert und spricht sauberes JSON, sodass Skripte und LLM-Agenten es genauso einfach steuern können wie Menschen.
upx -d zu umgehen.openat + O_NOFOLLOW (kein Path-Traversal oder Symlink-Escape), und die Dekompression ist gegen Bomben begrenzt.-j) für Tools, mit Offsets und Konfidenz bei jedem Fund.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
Der Build benötigt cmake, einen C++20-Compiler und die Entwicklungsbibliotheken zlib, liblzma, lz4 und zstd (die von --extract verwendeten Dekompressoren). Unter Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Um ohne eine davon zu bauen (ein minimaler oder nur identifizierender Build), konfigurieren Sie mit -DMORIA_OPTIONAL_CODECS=ON, und der fehlende Codec wird einfach deaktiviert.
Die moria-Binärdatei ist in sich geschlossen: Alle Signatursätze sind zur Build-Zeit eingebettet, sodass die Binärdatei überall funktioniert, ohne dass etwas daneben installiert ist (cp build/moria ~/.local/bin reicht aus, und eine heruntergeladene Release-Binärdatei läuft einfach). Um externe Signaturen anstelle der eingebetteten zu verwenden (um beispielsweise eine neue .toml ohne Neukompilierung zu testen), übergeben Sie --sigs DIR oder setzen Sie $MORIA_SIGDIR.
Die Ausgabe ist standardmäßig menschenlesbar. Übergeben Sie -j für 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 entpackt erkannte Formate unter <file>.extracted/, ein Verzeichnis pro Region (0x<offset>-<type>/), plus eine manifest.json, die Offsets auf Pfade abbildet. Es rekursiert automatisch in verschachtelte Container und baut UBI-Images Volume für Volume neu auf. Schutzmechanismen (--depth, --max-files, --max-bytes und eine Obergrenze für das Dekompressionsverhältnis) begrenzen feindselige Eingabe; ein ausgelöster Schutz stoppt diesen Zweig und liefert dennoch alles Wiederhergestellte zurück.
Im Prozess entpackt, ohne externe Tools und ohne sudo:
signatures/ ist der handgeschriebene Kern: Firmware-Dateisysteme, Container, Kernel und gängige Formate, jeweils mit struktureller Validierung.signatures-firmware/ enthält Hersteller-Firmware-Container-Magics und wird standardmäßig geladen.signatures-generated/ enthält ~2,5k allgemeine Dateityp-Magics, die aus der Magic-Datenbank von file(1) abgeleitet sind, und wird nur mit --broad geladen.Um ein Format hinzuzufügen, legen Sie eine .toml in signatures/ ab. Ein kleiner C++-Validator ist nur für Prüfungen nötig, die die deklarative Ebene nicht ausdrücken kann, wie CRCs oder blockübergreifende Zeiger.
moria führt strukturelle Identifikation, Extraktion und Carving durch. Secret-/Credential-Scanning, SBOM-, CVE- und Lizenzanalyse sind ein separates Tool (mithril).
MIT, siehe LICENSE.
Einige On-Disk-Format-Behandlungen sind eine saubere Neuimplementierung der Algorithmen anderer Open-Source-Projekte, unabhängig gegen morias eigene I/O-Schicht geschrieben (kein Quellcode kopiert): der UCL/NRV2B-Dekompressor und CTO-Unfilter aus UPX/UCL (GPL-2.0, nur Algorithmen), und das Metadata-Commit- und CTZ-Skip-List-Layout von littlefs (BSD-3-Clause), und das Page-/Object-Layout von SPIFFS (MIT).