
Identificación y extracción de firmware IoT
Identificación y extracción de firmware IoT
moria identifica archivos y las estructuras incrustadas dentro de imágenes de firmware e 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 requiere cmake, un compilador de C++20 y las bibliotecas de desarrollo zlib, liblzma, lz4 y zstd (los descompresores que usa --extract). En Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Para compilar sin una de ellas (una compilación mínima o solo de identificación), configure con -DMORIA_OPTIONAL_CODECS=ON y el códec faltante simplemente se desactiva.
El binario moria es autocontenido: todos los conjuntos de firmas están incrustados 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 versión descargado simplemente se ejecuta). Para usar firmas externas en lugar de las incrustadas (para probar un nuevo .toml sin recompilar, por ejemplo), pase --sigs DIR o establezca $MORIA_SIGDIR.
La salida es legible por humanos de forma predeterminada. 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/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 descomprime los formatos reconocidos en <file>.extracted/, un directorio por región (0x<offset>-<type>/), además de un manifest.json que asigna los offsets a las rutas. Se adentra de forma recursiva en los contenedores anidados automáticamente y reconstruye las imágenes UBI volumen a 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 aun así devuelve todo lo recuperado.
Descomprimido en proceso, sin herramientas externas ni sudo:
.msi, ISO 9660, Android sparse, Android boot.hv)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 los magics de contenedores de firmware de proveedores y se carga por defecto.signatures-generated/ contiene ~2.5k magics de tipos de archivo generales derivados de la base de datos de magics de file(1) y solo se carga con --broad.Para añadir un formato, coloca un .toml en signatures/. Solo se necesita un pequeño validador en C++ para las comprobaciones que la capa declarativa no puede expresar, como los CRC o los punteros entre bloques. La semántica de los campos (magic_offset, endianness del magic, firmas cortas, restricciones blandas, el contrato del validador) está documentada en SIGAUTHORING.md.
moria realiza identificación estructural, extracción y carving. El escaneo de secretos/credenciales, el SBOM, el análisis de CVE y de licencias son una herramienta aparte (mithril).
MIT, véase LICENSE.
Parte del manejo de formatos en disco es una reimplementación limpia de los algoritmos de otros proyectos de código abierto, escrita de forma independiente contra la propia capa de E/S de moria (sin copiar código fuente): el descompresor UCL/NRV2B y los unfiltros CTO de UPX/UCL (GPL-2.0, solo algoritmos), y el diseño de metadata-commit y de lista de saltos CTZ de littlefs (BSD-3-Clause), y el diseño de página/objeto de SPIFFS (MIT).