
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 members without extracting
moria --broad <path> # also load the ~2.5k general file-type signatures
moria --help
-e는 인식된 포맷을 <file>.extracted/ 아래에 풀어내며, 영역별로 하나의 디렉터리(0x<offset>-<type>/)를 만들고, 오프셋을 경로에 매핑하는 manifest.json을 함께 생성합니다. 중첩된 컨테이너로 자동 재귀하며 UBI 이미지는 볼륨별로 재구성합니다. 가드(--depth, --max-files, --max-bytes, 그리고 압축 해제 비율 상한)가 적대적 입력을 제한하며, 가드가 발동하면 해당 분기를 중단하고 복구된 모든 것은 여전히 반환합니다.
외부 도구나 sudo 없이 프로세스 내에서 풀어내는 대상:
signatures/는 직접 작성한 핵심으로, 펌웨어 파일시스템, 컨테이너, 커널, 일반 포맷을 각각 구조적 검증과 함께 담고 있습니다.signatures-firmware/는 벤더 펌웨어 컨테이너 매직을 담고 있으며 기본적으로 로드됩니다.signatures-generated/는 file(1)의 매직 데이터베이스에서 파생된 약 2.5k개의 일반 파일 타입 매직을 담고 있으며 --broad에서만 로드됩니다.포맷을 추가하려면 signatures/에 .toml을 넣으세요. CRC나 블록 간 포인터처럼 선언적 계층으로 표현할 수 없는 검사에만 작은 C++ 검증기가 필요합니다.
moria는 구조적 식별, 추출, 카빙을 수행합니다. 시크릿/자격 증명 스캔, SBOM, CVE, 라이선스 분석은 별도의 도구(mithril)입니다.
MIT, LICENSE 참조.
일부 온디스크 포맷 처리는 다른 오픈소스 프로젝트의 알고리즘을 moria 자체 I/O 계층에 맞춰 독립적으로 작성한 깔끔한 재구현입니다(소스 복사 없음): UPX/UCL의 UCL/NRV2B 압축 해제기와 CTO unfilter(GPL-2.0, 알고리즘만), littlefs의 메타데이터 커밋 및 CTZ 스킵 리스트 레이아웃(BSD-3-Clause), 그리고 SPIFFS의 페이지/오브젝트 레이아웃(MIT)입니다.