
IoT 펌웨어 식별 및 추출
IoT 펌웨어 식별 및 추출
moria는 펌웨어 및 IoT 이미지 내부에 포함된 파일과 구조(파일시스템, 커널, 부트로더, 아카이브, 키)를 식별하고, 발견한 대부분의 항목을 root 권한 없이 압축 해제합니다. 각 발견 항목을 바이트 오프셋, 유형, 신뢰도 점수와 함께 보고하며, 깔끔한 JSON을 출력하므로 스크립트와 LLM 에이전트가 사람만큼 쉽게 구동할 수 있습니다.
upx -d를 무력화하기 위해 헤더가 0으로 채워지거나 변조된 스텁도 표시합니다.openat + O_NOFOLLOW를 통해 이루어지며(경로 순회나 심볼릭 링크 탈출 불가), 압축 해제는 폭탄 공격에 대비해 제한됩니다.-j)을 제공하며, 모든 발견 항목에 오프셋과 신뢰도를 표시합니다.cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
cmake --install build --prefix ~/.local # or /usr/local (needs sudo)
빌드에는 cmake, C++20 컴파일러, 그리고 zlib, liblzma, lz4, zstd 개발 라이브러리(--extract에서 사용하는 압축 해제기)가 필요합니다. Debian/Ubuntu에서는 sudo apt install cmake g++ zlib1g-dev liblzma-dev liblz4-dev libzstd-dev를 실행하세요. 하나 없이 빌드하려면(최소 빌드 또는 식별 전용 빌드), -DMORIA_OPTIONAL_CODECS=ON으로 구성하면 누락된 코덱은 단순히 비활성화됩니다.
moria 바이너리는 자체 포함되어 있습니다. 모든 시그니처 세트가 빌드 시점에 내장되므로, 바이너리는 함께 설치된 것이 아무것도 없는 환경에서도 어디서든 동작합니다(cp build/moria ~/.local/bin이면 충분하며, 다운로드한 릴리스 바이너리는 그냥 실행됩니다). 내장된 시그니처 대신 외부 시그니처를 사용하려면(예를 들어 재빌드 없이 새로운 .toml을 테스트하려면), --sigs DIR을 전달하거나 $MORIA_SIGDIR을 설정하세요.
출력은 기본적으로 사람이 읽을 수 있는 형식입니다. JSON을 원하면 -j를 전달하세요.
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는 인식된 포맷을 <file>.extracted/ 아래에 풀어내며, 리전별로 하나의 디렉터리(0x<offset>-<type>/)를 만들고, 오프셋을 경로에 매핑하는 manifest.json을 함께 생성합니다. 중첩된 컨테이너로 자동 재귀하며 UBI 이미지는 볼륨 단위로 재구성합니다. 가드(--depth, --max-files, --max-bytes, 그리고 압축 해제 비율 상한)가 악의적인 입력을 제한하며, 가드에 걸리면 해당 분기를 중단하고 복구된 모든 것은 그대로 반환합니다.
외부 도구나 sudo 없이 프로세스 내에서 압축을 해제합니다:
.msi, ISO 9660, Android sparse, Android boot.hv)signatures/는 직접 작성한 핵심으로, 펌웨어 파일시스템, 컨테이너, 커널, 일반 포맷을 포함하며 각각 구조적 검증을 수행합니다.signatures-firmware/는 벤더 펌웨어 컨테이너 매직을 보유하며 기본적으로 로드됩니다.signatures-generated/는 file(1)의 magic 데이터베이스에서 파생된 약 2.5k개의 일반 파일 타입 매직을 보유하며 --broad 옵션에서만 로드됩니다.포맷을 추가하려면 signatures/에 .toml 파일을 넣으면 됩니다. CRC나 블록 간 포인터처럼 선언적 계층으로 표현할 수 없는 검사에만 소규모 C++ 검증기가 필요합니다. 필드 의미(magic_offset, magic 엔디언, 짧은 시그니처, 소프트 제약, 검증기 계약)는 SIGAUTHORING.md에 문서화되어 있습니다.
moria는 구조적 식별, 추출, 카빙을 수행합니다. 시크릿/자격 증명 스캔, SBOM, CVE, 라이선스 분석은 별도의 도구(mithril)입니다.
MIT, LICENSE 참조.
일부 온디스크 포맷 처리는 다른 오픈소스 프로젝트의 알고리즘을 moria 자체의 I/O 계층에 맞춰 독립적으로 작성한 깔끔한 재구현입니다(소스 코드 복사 없음): UPX/UCL의 UCL/NRV2B 압축 해제기와 CTO 언필터(GPL-2.0, 알고리즘만), littlefs의 메타데이터 커밋 및 CTZ 스킵 리스트 레이아웃(BSD-3-Clause), 그리고 SPIFFS의 페이지/오브젝트 레이아웃(MIT)입니다.