
Identificação e extração de firmware IoT
Identificação e extração de firmware de IoT
moria identifica arquivos e as estruturas embutidas em firmware e imagens de IoT (sistemas de arquivos, kernels, bootloaders, arquivos compactados, chaves) e desempacota a maior parte do que encontra, sem root. Ele reporta cada descoberta com um deslocamento em bytes, um tipo e uma pontuação de confiança, e fala JSON limpo para que scripts e agentes LLM possam conduzi-lo tão facilmente quanto pessoas.
upx -d.openat + O_NOFOLLOW (sem path-traversal ou escape por symlink), e a descompressão é limitada contra bombs.-j) para ferramentas, com deslocamentos e confiança em cada descoberta.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
A compilação precisa de cmake, um compilador C++20 e as bibliotecas de desenvolvimento zlib, liblzma, lz4 e zstd (os descompressores usados por --extract). No Debian/Ubuntu: sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev. Para compilar sem uma delas (uma compilação mínima ou apenas de identificação), configure com -DMORIA_OPTIONAL_CODECS=ON e o codec ausente é simplesmente desabilitado.
O binário moria é autocontido: todos os conjuntos de assinaturas são embutidos em tempo de compilação, então o binário funciona em qualquer lugar sem nada instalado ao lado dele (cp build/moria ~/.local/bin é suficiente, e um binário de release baixado simplesmente executa). Para usar assinaturas externas em vez das embutidas (para testar um novo .toml sem recompilar, por exemplo), passe --sigs DIR ou defina $MORIA_SIGDIR.
A saída é legível por humanos por padrão. Passe -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 desempacota formatos reconhecidos em <file>.extracted/, um diretório por região (0x<offset>-<type>/), mais um manifest.json mapeando deslocamentos para caminhos. Ele recorre automaticamente em contêineres aninhados e reconstrói imagens UBI volume por volume. Guardas (--depth, --max-files, --max-bytes e um limite de taxa de descompressão) limitam entrada hostil; uma guarda acionada interrompe aquele ramo e ainda retorna tudo o que foi recuperado.
Desempacotado em processo, sem ferramentas externas e sem sudo:
signatures/ é o núcleo escrito à mão: sistemas de arquivos de firmware, contêineres, kernels e formatos comuns, cada um com validação estrutural.signatures-firmware/ contém magics de contêineres de firmware de fornecedores e carrega por padrão.signatures-generated/ contém ~2.5k magics de tipos de arquivo gerais derivados do banco de dados de magic do file(1) e carrega apenas com --broad.Para adicionar um formato, coloque um .toml em signatures/. Um pequeno validador C++ só é necessário para verificações que a camada declarativa não consegue expressar, como CRCs ou ponteiros entre blocos.
moria faz identificação estrutural, extração e carving. Varredura de segredos/credenciais, SBOM, CVE e análise de licenças são uma ferramenta separada (mithril).
MIT, veja LICENSE.
Parte do tratamento de formatos em disco é uma reimplementação limpa dos algoritmos em outros projetos de código aberto, escrita de forma independente sobre a própria camada de I/O do moria (nenhum código-fonte copiado): o descompressor UCL/NRV2B e os unfilters CTO do UPX/UCL (GPL-2.0, apenas algoritmos), e o layout de metadata-commit e CTZ skip-list do littlefs (BSD-3-Clause), e o layout de página/objeto do SPIFFS (MIT).