
Identificazione ed estrazione del firmware IoT
Identificazione ed estrazione di 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-identificazione), configura con -DMORIA_OPTIONAL_CODECS=ON e il codec mancante viene semplicemente disabilitato.
Il binario moria è autocontenuto: 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 e basta). Per usare firme esterne invece di quelle incorporate (per testare un nuovo .toml senza ricompilare, ad esempio), passa --sigs DIR o imposta $MORIA_SIGDIR.
L'output è leggibile dall'uomo per impostazione predefinita. Passa -j per il 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 estrae i formati riconosciuti sotto <file>.extracted/, una directory per regione (0x<offset>-<type>/), più un manifest.json che mappa gli offset ai percorsi. Ricorre automaticamente nei contenitori annidati e ricostruisce le immagini UBI volume per volume. Le protezioni (--depth, --max-files, --max-bytes e un limite sul rapporto di decompressione) delimitano l'input ostile; una protezione attivata interrompe quel ramo e restituisce comunque tutto ciò che è stato recuperato.
Estratto in-process, senza strumenti esterni e senza sudo:
signatures/ è il nucleo scritto a mano: filesystem firmware, contenitori, kernel e formati comuni, ciascuno con validazione strutturale.signatures-firmware/ contiene le magic dei contenitori firmware dei vendor e viene caricato per impostazione predefinita.signatures-generated/ contiene ~2.5k magic di tipi di file generici derivate dal database magic di file(1) e viene caricato solo con --broad.Per aggiungere un formato, inserisci un .toml in signatures/. Un piccolo validatore C++ è necessario solo per i controlli che il livello dichiarativo non può esprimere, come CRC o puntatori tra blocchi.
moria esegue identificazione strutturale, estrazione e carving. La scansione di segreti/credenziali, SBOM, CVE e analisi delle licenze sono uno strumento separato (mithril).
MIT, vedi LICENSE.
Parte della gestione dei formati su disco è una reimplementazione pulita degli algoritmi in altri progetti open-source, scritta in modo indipendente rispetto al layer I/O di moria (nessun sorgente copiato): il decompressore UCL/NRV2B e i CTO unfilters 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).