
Identification et extraction de firmware IoT
Identification et extraction de firmware IoT
moria identifie les fichiers et les structures intégrées 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 rapporte chaque découverte avec un décalage en octets, un type et un score de confiance, et il parle un 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 des décalages et une 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, et les bibliothèques de développement zlib, liblzma, lz4 et zstd (les décompresseurs utilisés par --extract). Sur 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, donc 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 members without extracting
moria --broad <path> # also load the ~2.5k general file-type signatures
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 décalages aux chemins. Il récurse automatiquement dans les conteneurs imbriqués et reconstruit les images UBI volume par volume. Des garde-fous (--depth, --max-files, --max-bytes, et un plafond de taux de décompression) bornent les entrées hostiles ; un garde-fou déclenché arrête cette branche et renvoie quand même tout ce qui a été récupéré.
Décompressé en cours de processus, sans outils externes et sans sudo :
signatures/ est le cœur écrit à la main : systèmes de fichiers de firmware, conteneurs, noyaux et formats courants, chacun avec une validation structurelle.signatures-firmware/ contient les magics de conteneurs de firmware de fournisseurs 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 données 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.
moria effectue l'identification structurelle, l'extraction et le carving. L'analyse des secrets/identifiants, le SBOM, les CVE et l'analyse de licences relèvent 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).