
Identificazione ed estrazione del firmware IoT
Identificazione ed estrazione del firmware IoT
moria identifica i file e le strutture incorporate all'interno di firmware e immagini IoT (filesystem, kernel, bootloader, archivi, chiavi) ed estrae la maggior parte di ciò che trova, senza root. Riporta ogni risultato con un offset in byte, un tipo e un punteggio di confidenza, e parla un JSON pulito così che script e agenti LLM possano pilotarlo con la stessa facilità con cui lo fanno le persone.
upx -d.openat + O_NOFOLLOW (nessun path-traversal o fuga tramite symlink), e la decompressione è limitata contro le bombe.-j) per gli strumenti, con offset e confidenza su ogni risultato.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
La build richiede cmake, un compilatore C++20 e le librerie di sviluppo zlib, liblzma, lz4 e zstd (i decompressori usati da --extract). Su Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Per compilare senza una di esse (una build minimale o solo di identificazione), configurare con -DMORIA_OPTIONAL_CODECS=ON e il codec mancante viene semplicemente disabilitato.
Il binario moria è autonomo: tutti i set di firme sono incorporati al momento della build, quindi il binario funziona ovunque senza nulla installato accanto (cp build/moria ~/.local/bin è sufficiente, e un binario di release scaricato funziona direttamente). Per usare firme esterne invece di quelle incorporate (ad esempio per testare un nuovo .toml senza ricompilare), passare --sigs DIR o impostare $MORIA_SIGDIR.
L'output è leggibile dall'uomo per impostazione predefinita. Passare -j per 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/cab/CE-ROM members without extracting
moria --broad <path> # also load the ~2.5k general file-type signatures
moria --unpack-executables # unpack executables inside other extracted output (cfbf/msi files)
moria --help
-e estrae i formati riconosciuti in <file>.extracted/, una directory per regione (0x<offset>-<type>/), più un manifest.json che mappa gli offset ai percorsi. Ricorre automaticamente nei container annidati e ricostruisce le immagini UBI volume per volume. I limiti di sicurezza (--depth, --max-files, --max-bytes e un tetto al rapporto di decompressione) delimitano input ostili; un limite superato interrompe quel ramo e restituisce comunque tutto ciò che è stato recuperato.
Estratto in-process, senza strumenti esterni e senza sudo:
.msi, ISO 9660, Android sparse, Android boot.hv)signatures/ è il nucleo scritto a mano: filesystem firmware, container, kernel e formati comuni, ciascuno con validazione strutturale.signatures-firmware/ contiene le magic dei container firmware dei vendor e viene caricato per impostazione predefinita.signatures-generated/ contiene ~2,5k magic di tipi di file generici derivate dal database delle magic di file(1) e viene caricato solo con --broad.Per aggiungere un formato, inserisci un file .toml in signatures/. Un piccolo validatore C++ è necessario solo per i controlli che il livello dichiarativo non può esprimere, come i CRC o i puntatori tra blocchi. La semantica dei campi (magic_offset, endianness della magic, firme corte, vincoli soft, il contratto del validatore) è documentata in SIGAUTHORING.md.
moria esegue identificazione strutturale, estrazione e carving. La scansione di segreti/credenziali, l'SBOM, l'analisi CVE e delle licenze sono strumenti separati (mithril).
MIT, vedi LICENSE.
Parte della gestione dei formati su disco è una reimplementazione pulita degli algoritmi di altri progetti open-source, scritta in modo indipendente sul layer I/O di moria (nessun codice copiato): il decompressore UCL/NRV2B e i CTO unfilter da UPX/UCL (GPL-2.0, solo algoritmi), e il layout metadata-commit e CTZ skip-list di littlefs (BSD-3-Clause), e il layout page/object di SPIFFS (MIT).