
Identificación y extracción de firmware IoT
Identificación y extracción de firmware IoT
moria identifica archivos y las estructuras embebidas dentro de firmware e imágenes IoT (sistemas de archivos, kernels, bootloaders, archivos comprimidos, claves) y descomprime la mayor parte de lo que encuentra, sin root. Reporta cada hallazgo con un desplazamiento en bytes, un tipo y una puntuación de confianza, y habla JSON limpio para que los scripts y los agentes LLM puedan manejarlo con la misma facilidad que las personas.
upx -d.openat + O_NOFOLLOW (sin path-traversal ni escape por symlink), y la descompresión está acotada contra bombas.-j) para herramientas, con desplazamientos y confianza en cada hallazgo.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
La compilación necesita cmake, un compilador de C++20, y las bibliotecas de desarrollo zlib, liblzma, lz4 y zstd (los descompresores usados por --extract). En Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Para compilar sin una (una compilación mínima o solo de identificación), configure con -DMORIA_OPTIONAL_CODECS=ON y el códec faltante simplemente se deshabilita.
El binario moria es autocontenido: todos los conjuntos de firmas están embebidos en tiempo de compilación, por lo que el binario funciona en cualquier lugar sin nada instalado junto a él (cp build/moria ~/.local/bin es suficiente, y un binario de release descargado simplemente se ejecuta). Para usar firmas externas en lugar de las embebidas (para probar un nuevo .toml sin recompilar, por ejemplo), pase --sigs DIR o establezca $MORIA_SIGDIR.
La salida es legible por humanos por defecto. Pase -j para 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 descomprime los formatos reconocidos bajo <file>.extracted/, un directorio por región (0x<offset>-<type>/), más un manifest.json que mapea desplazamientos a rutas. Recurre automáticamente en contenedores anidados y reconstruye imágenes UBI volumen por volumen. Las protecciones (--depth, --max-files, --max-bytes, y un límite de ratio de descompresión) acotan la entrada hostil; una protección activada detiene esa rama y aún devuelve todo lo recuperado.
Descomprimido en proceso, sin herramientas externas y sin sudo:
signatures/ es el núcleo escrito a mano: sistemas de archivos de firmware, contenedores, kernels y formatos comunes, cada uno con validación estructural.signatures-firmware/ contiene las magics de contenedores de firmware de proveedores y se carga por defecto.signatures-generated/ contiene ~2.5k magics de tipos de archivo generales derivadas de la base de datos de magics de file(1) y se carga solo con --broad.Para agregar un formato, coloque un .toml en signatures/. Un pequeño validador en C++ solo es necesario para comprobaciones que la capa declarativa no puede expresar, como CRCs o punteros entre bloques.
moria hace identificación estructural, extracción y carving. El escaneo de secretos/credenciales, SBOM, CVE y análisis de licencias son una herramienta separada (mithril).
MIT, ver LICENSE.
Parte del manejo de formatos en disco es una reimplementación limpia de los algoritmos en otros proyectos de código abierto, escrita de forma independiente contra la propia capa de E/S de moria (no se copió código fuente): el descompresor UCL/NRV2B y los unfilters CTO de UPX/UCL (GPL-2.0, solo algoritmos), y el diseño de metadata-commit y CTZ skip-list de littlefs (BSD-3-Clause), y el diseño de página/objeto de SPIFFS (MIT).