
Identification et extraction de firmware IoT
Identification et extraction de firmware IoT
moria identifie les fichiers et les structures intégrés dans les firmwares et les images IoT (systèmes de fichiers, noyaux, bootloaders, archives, clés) et décompresse la plupart de ce qu'il trouve, sans root. Il signale chaque découverte avec un décalage en octets, un type et un score de confiance, et il produit du JSON propre afin que les scripts et les agents LLM puissent le piloter aussi facilement que des humains.
upx -d.openat + O_NOFOLLOW (pas de traversée de chemin ni d'évasion par lien symbolique), et la décompression est bornée contre les bombes.-j) pour les outils, avec décalages et confiance sur chaque découverte.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
La compilation nécessite cmake, un compilateur C++20, ainsi que les bibliothèques de développement zlib, liblzma, lz4 et zstd (les décompresseurs utilisés par --extract). Sous Debian/Ubuntu : sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Pour compiler sans l'une d'elles (une compilation minimale ou d'identification seule), configurez avec -DMORIA_OPTIONAL_CODECS=ON et le codec manquant est simplement désactivé.
Le binaire moria est autonome : tous les ensembles de signatures sont intégrés au moment de la compilation, de sorte que le binaire fonctionne partout sans rien d'installé à côté (cp build/moria ~/.local/bin suffit, et un binaire de release téléchargé s'exécute directement). Pour utiliser des signatures externes au lieu de celles intégrées (pour tester un nouveau .toml sans recompiler, par exemple), passez --sigs DIR ou définissez $MORIA_SIGDIR.
La sortie est lisible par un humain par défaut. Passez -j pour du 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 décompresse les formats reconnus sous <file>.extracted/, un répertoire par région (0x<offset>-<type>/), plus un manifest.json associant les offsets aux chemins. Il descend récursivement dans les conteneurs imbriqués automatiquement et reconstruit les images UBI volume par volume. Des garde-fous (--depth, --max-files, --max-bytes, et un plafond de taux de décompression) encadrent les entrées hostiles ; un garde-fou déclenché arrête cette branche et renvoie tout de même tout ce qui a été récupéré.
Décompressé en cours de processus, sans outils externes ni sudo :
.msi, ISO 9660, Android sparse, Android boot.hv)signatures/ est le cœur écrit à la main : systèmes de fichiers de firmware, conteneurs, noyaux et formats courants, chacun avec validation structurelle.signatures-firmware/ contient les magics des conteneurs de firmware constructeurs et se charge par défaut.signatures-generated/ contient ~2,5 k magics de types de fichiers généraux dérivés de la base de magics de file(1) et ne se charge qu'avec --broad.Pour ajouter un format, déposez un .toml dans signatures/. Un petit validateur C++ n'est nécessaire que pour les vérifications que la couche déclarative ne peut pas exprimer, comme les CRC ou les pointeurs inter-blocs. La sémantique des champs (magic_offset, endianness du magic, signatures courtes, contraintes souples, le contrat du validateur) est documentée dans SIGAUTHORING.md.
moria effectue l'identification structurelle, l'extraction et le carving. L'analyse de secrets/identifiants, SBOM, CVE et licences relève d'un outil distinct (mithril).
MIT, voir LICENSE.
Une partie de la gestion des formats sur disque est une réimplémentation propre des algorithmes d'autres projets open source, écrite indépendamment contre la propre couche d'E/S de moria (aucun code source copié) : le décompresseur UCL/NRV2B et les unfilters CTO de UPX/UCL (GPL-2.0, algorithmes uniquement), et la disposition metadata-commit et CTZ skip-list de littlefs (BSD-3-Clause), et la disposition page/objet de SPIFFS (MIT).