Skip to main content
Glama

Aether

CI Python 3.10+ Licence: Apache-2.0 Runtime dependencies: none

증거 우선(evidence-first) 바이너리 및 펌웨어 분석.

Aether는 성숙한 엔진들 — Ghidra headless, binwalk — 위에 위치하며, 그들이 제공하지 못하는 것을 제공합니다: 모든 발견이 이를 뒷받침하는 정확한 아티팩트에 연결된 구조화된 주장(claim)인 프로젝트 모델입니다.

자유 형식의 보안 주장은 여기서 단순히 권장되지 않습니다. 그것들은 표현 불가능합니다. 주장은 타입이 지정된 필드를 가진 등록된 술어(predicate)이며, 해당 술어가 요구하는 종류의 아티팩트 ID 없이는 저장될 수 없습니다. "이건 악용 가능해 보인다"라고 쓰려는 에이전트는 문제가 되는 필드를 지목하는 스키마 오류를 받게 됩니다.

Aether는 디스어셈블러나 디컴파일러를 만들지 않으며, 앞으로도 만들지 않을 것입니다. 그 작업은 이미 잘 수행되었습니다; 그 공백은 그 주변의 모든 것입니다.


상태: Phase 0 완료

25개의 게이트 검사가 모두 통과했고, 172개의 테스트가 통과했습니다.

python examples/demo_phase0.py
  [PASS] ELF identified with architecture and word size
  [PASS] functions, xrefs, and decompilation imported
  [PASS] Ghidra converged onto existing artifacts instead of duplicating
  [PASS] nested container chain unpacked (uImage -> gzip -> cpio)
  [PASS] findings attributed to the member file, not the container blob
  [PASS] claim resolves to a string artifact at a concrete location
  [PASS] free-text claim from an agent is refused
  [PASS] two independent analyses produce byte-identical graphs
  [PASS] suite 'elf_sample' passes  -  recall 1.00, 0 false positive(s)
  ...
  25/25 gate checks passed

Phase 1–3(자연어 모드, 다중 에이전트 오케스트레이션, 펌웨어 카토그래피)은 의도적으로 시작되지 않았습니다. 증거 모델은 그 위에 무엇이든 구축되기 전에 입증되기 위해 존재합니다.

Related MCP server: pyghidra-mcp

현재 작동하는 것

기능

상태

프로젝트 모델, SQLite 영속성, 마이그레이션

작동 중

증거 그래프: 11가지 아티팩트 종류, 10가지 주장 술어

작동 중

콘텐츠 주소 지정 ID, 엔진 간 수렴

작동 중, 테스트됨

출처 원장(provenance ledger); 모든 쓰기는 트랜잭션 실행 내에서

작동 중

ELF/PE 트라이지: 헤더, 섹션, 심볼 테이블, 완화 조치

작동 중

문자열 추출(ASCII + UTF-16LE) 및 섹션/주소 매핑

작동 중

규칙 기반 탐지기: 비밀, 구성 요소, 위험한 API

작동 중

펌웨어 언패킹: uImage → gzip → cpio, zip/tar/bzip2/xz 포함

작동 중

Ghidra 내보내기 가져오기: 함수, xref, 디컴파일, 심볼

작동 중, 기록된 내보내기로 테스트됨

Ghidra headless 러너

작성됨, 아직 실제 Ghidra 설치로 실행되지 않음

binwalk 하위 프로세스 경로

작성됨, 아직 실제 binwalk 설치로 실행되지 않음

결정적 Git 친화적 내보내기

작동 중, 테스트됨

MCP stdio 서버, 15개 도구

작동 중, 테스트됨

CLI: init/analyze/query/export/check/doctor/mcp/eval

작동 중

ground-truth 스위트를 갖춘 평가 하네스

작동 중, 재현율 1.00

"아직 실행되지 않음" 두 행은 중요하기 때문에 명확히 명시되었습니다. 양쪽의 변환 계층은 완전히 테스트되었습니다; 실행되지 않은 것은 하위 프로세스 호출뿐입니다. Phase 0이 구축된 머신에는 두 엔진이 모두 설치되어 있지 않기 때문입니다. 전체 엔진 활성화를 참조하세요.

빠른 시작

Python 3.10+ 및 런타임 의존성 없음. 설치할 것이 없습니다:

git clone https://github.com/n-3-0-l-d-3-v/aether-platform.git
cd aether-platform
python examples/demo_phase0.py

프로젝트를 직접 작업:

python cli/aether.py init ./work
python cli/aether.py -P ./work analyze examples/demo_firmware.bin
python cli/aether.py -P ./work query objects
python cli/aether.py -P ./work query claims --predicate contains_hardcoded_secret
python cli/aether.py -P ./work query claim clm_1284ca2d2406
python cli/aether.py -P ./work export ./work/export

샘플 바이너리는 생성되며 커밋되지 않습니다. examples/demo_phase0.py와 테스트 스위트는 필요 시 이를 빌드합니다; 수동으로 빌드하려면:

python examples/src/build_elf_sample.py examples/firmware_agent.elf
python examples/src/build_firmware_sample.py examples/demo_firmware.bin

설치하면 aether가 PATH에 추가됩니다:

pip install -e .
aether doctor

테스트 실행

python -m pytest              # 172 tests
python -m pytest -q tests/test_evidence_model.py   # the invariants alone

스위트는 첫 실행 시 자체 샘플 바이너리를 생성합니다. PE 특정 테스트는 PE를 생성할 수 없는 호스트에서 깔끔하게 건너뜁니다. Linux의 네이티브 gcc는 샘플을 ELF로 컴파일하므로 컴파일러의 존재만으로는 충분하지 않으며 출력은 MZ 헤더가 있는지 확인됩니다. Linux에서 PE 커버리지를 위해 mingw-w64 크로스 컴파일러를 설치하세요.

CI는 Linux, Windows, macOS에서 Python 3.10 및 3.12에 걸쳐 스위트, 게이트 데모, 내보내기 결정성 검사, 평가 스위트를 실행합니다.

어떻게 보이는가

$ aether analyze demo_firmware.bin
[binwalk] run run_e65361591a1e...
  engine aether-carver   extracted 7 file(s)
    bin/diagnostics.exe                    pe          132.4 KiB
    bin/firmware_agent                     elf         1.8 KiB
    etc/dropbear/dropbear_rsa_host_key.pem certificate 196 B
    etc/telemetry.conf                     data        219 B

$ aether query claims --predicate contains_hardcoded_secret
id                predicate                  conf  prod  ev  subject             statement
----------------  -------------------------  ----  ----  --  -----------------  --------------------
clm_1284ca2d2406  contains_hardcoded_secret  0.95  1     1   etc/telemetry.conf  {"detector": "rul...
clm_0217e368bbeb  contains_hardcoded_secret  0.98  1     1   etc/dropbear/dro..  {"detector": "rul...

$ aether query claim clm_1284ca2d2406
claim   clm_1284ca2d2406f45deb3f680afb7914f5
schema  aether.claim.contains_hardcoded_secret/1
stated  {"detector": "rule:github-token", "redacted_preview": "ghp_****", "secret_kind": "api_token"}
conf    0.95 (max 0.95 across 1 producer(s))

evidence
role   kind    addr  artifact          name
-----  ------  ----  ----------------  ----------------------------------------
locus  string  0x56  art_6a75100355c5  api_key=ghp_A1b2C3d4E5f6G7h8I9j0K1l2...

모든 발견은 바이트로 거슬러 올라갑니다. 그것이 전부입니다.

모델

세 가지 레코드 유형이 모든 것을 담당합니다.

아티팩트(Artifact) — 구체적이고 위치를 찾을 수 있는 증거 조각: 파일, 함수, 문자열, xref, 섹션, 디컴파일된 본문, 시그니처 히트. 그 ID는 정체성 필드만의 해시이므로 아티팩트를 강화해도 ID는 절대 변경되지 않으며, 두 엔진이 동일한 것을 관찰하면 동일한 행에 도달합니다.

주장(Claim) — 구조화된 주장: 등록된 술어, 타입이 지정된 필드, 그리고 명명된 역할(locus, support, context, counter)로 이를 뒷받침하는 아티팩트. 생산자와 타임스탬프가 없으므로 두 엔진의 동일한 주장은 하나의 주장입니다.

증명(Attestation) — 한 순간에 한 주장을 뒷받침하는 한 생산자, 신뢰도 포함. 신뢰도는 결코 주장의 속성이 아닙니다. 증명에서 파생됩니다 — 생산자 내 최대값, 독립 생산자 간 noisy-OR. 두 엔진이 0.9로 동의하면 0.99가 되며, 두 개의 거의 중복된 발견이 아닙니다.

이 분리는 핵심 설계 결정입니다: ADR 0003.

강제되는 것, 단순히 권장되는 것이 아님

불변식

위치

증거 없는 주장 없음

Claim.create, 저장소, 그리고 하나를 좌초시키는 것을 거부하는 SQLite 트리거

자유 형식 발견 없음

술어 스키마는 선언되지 않은 필드를 거부합니다; 테스트는 어떤 술어도 산문 필드를 선언하지 않음을 주장합니다

증거는 올바른 종류여야 함

contains_hardcoded_secret 주장은 파일이 아닌 문자열을 인용해야 합니다

출처는 결코 선택 사항이 아님

쓰기는 project.run() 블록 내에서만 발생합니다

에이전트는 스스로 인증할 수 없음

MCP로 제출된 주장은 에이전트에 귀속된 proposed로 기록됩니다

부분 분석은 결코 기록되지 않음

각 실행은 하나의 트랜잭션입니다; 충돌한 엔진은 failed 실행 행과 아티팩트 없이 남깁니다

자유 형식 텍스트는 정확히 한 곳에만 존재합니다: 주석(annotations)으로, 자체 테이블과 자체 내보내기 스트림에 있으며, 발견으로 오인될 수 없습니다.

전체 엔진 활성화

Aether는 Ghidra나 binwalk 없이도 실행되며, 깊이가 줄어들고 그렇게 명시합니다. aether doctor는 무엇이 누락되었는지와 각 공백의 비용을 보고합니다:

$ aether doctor
aether 0.1.0  (python 3.12.2)

  ok      triage     0.1.0        built in; no external engine required
  MISSING ghidra     unknown      analyzeHeadless was not found
  MISSING binwalk    unknown      binwalk was not found on PATH

Ghidra

함수 복구, 교차 참조, 디컴파일, 정확히 위치한 문자열을 제공합니다. 없으면 헤더 수준 트라이지가 여전히 실행됩니다.

  1. Ghidra 설치(11.x 권장).

  2. JDK 21 이상을 설치하고 javaPATH에 있는지 확인하거나 JAVA_HOME을 설정하세요. Ghidra headless는 그것 없이는 시작되지 않습니다.

  3. Aether를 설치 위치에 지정하세요:

    export GHIDRA_INSTALL_DIR=/opt/ghidra_11.1.2_PUBLIC     # Linux/macOS
    setx GHIDRA_INSTALL_DIR "C:\ghidra_11.1.2_PUBLIC"       # Windows

    AETHER_GHIDRA_HOMEGHIDRA_HOME도 인식되며, PATHsupport/analyzeHeadless도 작동합니다. 모두 실패하면 Aether는 일반적인 설치 디렉토리를 확인합니다.

  4. 확인하고 실행:

    aether doctor
    aether -P ./work analyze ./target.elf --engine ghidra

Ghidra 결과를 사용하기 위해 로컬에 Ghidra가 필요하지 않습니다. 브리지는 실행과 가져오기를 분리하므로, 어떤 머신에서 생성된 내보내기도 어디서든 가져올 수 있습니다:

# on the machine that has Ghidra
analyzeHeadless /tmp/proj aether -import target.elf \
    -scriptPath aether/adapters/ghidra/scripts \
    -postScript AetherExport.py /tmp/export 40 "" -deleteProject

# anywhere
aether -P ./work import-ghidra /tmp/export --target ./target.elf

AetherExport.py는 Ghidra 자체 인터프리터(Jython 2.7 또는 PyGhidra 아래의 CPython) 내에서 실행되며, 둘 다 수용하는 하위 집합에 머뭅니다.

binwalk

squashfs, jffs2, ubifs 및 벤더 형식을 제공합니다. 없으면 내장 카버가 gzip, bzip2, xz, zip, tar, cpio를 처리하고, 위치만 찾을 수 있는 것은 조용히 건너뛰지 않고 보고합니다.

pip install binwalk
# or: https://github.com/ReFirmLabs/binwalk

전체 추출은 또한 sasquatch, jefferson, ubi_reader를 원하며, 이는 Windows에서 다루기 어렵습니다 — 폴백 카버가 존재하는 이유입니다 (ADR 0005).

MCP

MCP 서버는 미래 에이전트가 작업하는 인터페이스이며, CLI의 동료입니다 — 둘 다 하나의 라이브러리 위의 얇은 프론트 엔드입니다.

aether mcp              # stdio JSON-RPC
aether mcp --read-only  # hide and refuse every write tool

15개의 도구: 인벤토리, 아티팩트 및 주장 쿼리, 문자열 검색, 디컴파일 검색, 그래프 탐색, 스키마 발견, 출처, 그리고 쓰기를 위한 aether_submit_claimaether_annotate. 에이전트가 제출한 주장은 어댑터가 수행하는 것과 정확히 동일한 검증을 거쳐 proposed로 기록됩니다.

Git 친화적 내보내기

aether export는 두 개의 트리를 작성하며, 그 분리가 핵심입니다:

  • graph/ — 아티팩트, 주장, 링크. 콘텐츠 주소 지정, ID로 정렬, 타임스탬프나 실행 ID 없음. 동일한 바이트에 대한 두 개의 독립적인 분석은 바이트 단위로 동일한 파일을 생성합니다. 이것을 커밋하세요; diff는 발견된 것을 보여줍니다.

  • ledger/ — 실행, 증명, 관찰. 출처는 사건의 기록이므로 성장합니다. 그것이 올바릅니다.

평가

Ground truth는 eval/suites/*.json에 있습니다:

$ aether eval
[PASS] elf_sample       required 22/22   recall 1.00   false positives 0
[PASS] firmware_image   required 12/12   recall 1.00   false positives 0

기대값은 신뢰도 하한, 독립 생산자의 최소 수, 그리고 중요하게는 일치하는 주장이 특정 종류의 증거를 인용해야 한다는 것을 요구할 수 있습니다. 파일이 아닌 문자열을 가리키는 contains_hardcoded_secret 주장은 문장이 동일하게 읽히더라도 실패합니다.

재현율은 스위트가 반드시 찾아야 할 것을 열거할 수 있기 때문에 실제 수치입니다. 정밀도는 명시적으로 금지된 패턴에 대해서만 점수가 매겨집니다. 어떤 스위트도 바이너리에 대해 참인 모든 것을 열거할 수 없기 때문입니다. 예상치 못한 주장은 아첨하는 숫자로 접히지 않고 점수가 매겨지지 않은 볼륨으로 보고됩니다. 하네스는 테스트 스위트에 음성 대조군이 있습니다 — 실패할 수 없는 하네스는 아무것도 증명하지 못합니다.

레이아웃

aether/
  canonical.py       deterministic serialization, hashing, id minting
  evidence/          artifact kinds, claim predicates, and their invariants
  project/           SQLite schema, migrations, and the only sanctioned store
  adapters/
    triage/          ELF/PE headers, strings, rule-based detectors
    ghidra/          headless runner, export script, importer
    binwalk/         firmware unpacking with a standard-library fallback
  export/            deterministic JSONL export
  mcp/               stdio MCP server and its tool surface
  eval/              evaluation harness
cli/                 entry point runnable without installing
docs/                architecture and decision records
eval/suites/         ground truth
examples/            sample generators and the gate demonstration
tests/               172 tests

문서

  • 아키텍처 — 계층, 데이터 모델, 그리고 각 조각이 그렇게 형성된 이유

  • 결정 기록 — 합리적인 엔지니어가 "왜 그렇게?"라고 물을 선택:

    • 0001 핵심에 Python, 런타임 의존성 제로

    • 0002 콘텐츠 주소 지정 ID, 그리고 그에서 제외된 것

    • 0003 주장과 증명은 별도의 레코드입니다

    • 0004 MCP 서버는 프로토콜을 직접 말합니다

    • 0005 binwalk가 없을 때 제한된 추출 폴백

샘플 데이터에 대한 참고

examples/src/는 의도적으로 가짜 자격 증명을 포함하는 바이너리를 생성합니다 — AWS의 자체 공개 예제 키(AKIAIOSFODNN7EXAMPLE), 합성 ghp_A1b2C3d4... 토큰, 키 자료가 없는 PEM 헤더, 농담 비밀번호. 그 중 어느 것도 실제가 아니며, 어느 것도 활성 상태가 아닙니다. 평가 스위트가 ground truth를 정확히 알 수 있는 대상을 갖도록 존재합니다.

라이선스

Apache-2.0.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables users to define and run MCP tools using declarative YAML configs with built-in trust enforcement, credential brokering, and tamper-evident audit logging.
    14
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Exposes Ghidra reverse engineering capabilities via MCP, enabling LLMs and agents to analyze binaries, decompile, search, and edit programs headlessly or with GUI integration.
    412
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Exposes angr binary-analysis capabilities (symbolic execution, taint analysis, CFG recovery) as MCP tools for vulnerability exploration and exploit development.
    9
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for reverse engineering Windows executables and related binary formats, offering static analysis, Ghidra-assisted function recovery, plugin-driven tooling, and optional isolated Windows runtime execution.
    7
    238
    MIT

View all related MCP servers

Related MCP Connectors

  • Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi

  • Remote MCP for C2PA intake verifier MCP, structured receipts, audit logs, and reviewer-ready evidenc

  • Production-grade cryptography toolkit with 31 MCP tools for classical, PQC, and KMS workflows.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/n-3-0-l-d-3-v/aether-platform'

If you have feedback or need assistance with the MCP directory API, please join our Discord server