Skip to main content
Glama

Aether

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

以证据为先的二进制与固件分析。

Aether 构建在成熟的引擎之上——Ghidra headless、binwalk——并贡献了它们所没有的东西:一个项目模型,其中每一条发现都是一个结构化声明,链接到支持它的确切工件

自由文本的安全声明在这里不仅不受鼓励,而且是不可表示的。声明是一个已注册的谓词,带有类型化字段,如果没有该谓词所要求的工件 ID,就无法存储。试图写入“这看起来可利用”的代理会得到一个指出违规字段的架构错误。

Aether 不构建反汇编器,也不构建反编译器,而且永远不会。这项工作已经做得很好;缺口在于它周围的一切。


状态:阶段 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

阶段 1–3(自然语言模式、多代理编排、固件制图)刻意尚未开始。证据模型的存在是为了在构建任何东西之前先得到验证。

Related MCP server: pyghidra-mcp

目前可用的功能

能力

状态

项目模型、SQLite 持久化、迁移

可用

证据图:11 种工件类型,10 个声明谓词

可用

内容寻址 ID,跨引擎收敛

可用,已测试

来源账本;每次写入都在事务性运行内

可用

ELF/PE 分类:头部、节、符号表、缓解措施

可用

字符串提取(ASCII + UTF-16LE),带节/地址映射

可用

基于规则的检测器:秘密、组件、风险 API

可用

固件解包:uImage → gzip → cpio,以及 zip/tar/bzip2/xz

可用

Ghidra 导出导入:函数、交叉引用、反编译、符号

可用,已针对记录的导出进行测试

Ghidra headless 运行器

已编写,尚未针对真实 Ghidra 安装运行

binwalk 子进程路径

已编写,尚未针对真实 binwalk 安装运行

确定性、Git 友好的导出

可用,已测试

MCP stdio 服务器,15 个工具

可用,已测试

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

可用

带真实基准套件的评估框架

可用,召回率 1.00

两行“尚未运行”被明确说明,因为它们很重要。两端的转换层都已完全测试;尚未执行的是子进程调用,因为阶段 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...

每一条发现都能追溯到字节。这就是全部要点。

模型

三种记录类型承载一切。

工件 — 一个具体、可定位的证据片段:文件、函数、字符串、交叉引用、节、反编译体、签名命中。其 ID 是仅基于身份字段的哈希,因此丰富工件永远不会改变其 ID,两个引擎观察到同一事物会落在同一行。

声明 — 一个结构化断言:已注册的谓词、类型化字段,以及以命名角色(locussupportcontextcounter)支持它的工件。它不携带生产者或时间戳,因此来自两个引擎的相同断言是一个声明。

证明 — 一个生产者在某一时刻支持一个声明,并带有置信度。置信度从来不是声明的属性;它从证明中推导——生产者内部取最大值,独立生产者之间取噪声或。两个引擎以 0.9 达成一致得到 0.99,而不是两个近乎重复的发现。

这种分离是核心设计决策:ADR 0003

强制执行,而非仅仅鼓励

不变量

位置

没有证据就没有声明

Claim.create、存储以及一个拒绝孤立声明的 SQLite 触发器

没有自由文本发现

谓词模式拒绝未声明的字段;一个测试断言没有谓词声明散文字段

证据必须是正确的种类

contains_hardcoded_secret 声明必须引用字符串,而不是文件

来源永远不是可选的

写入只发生在 project.run() 块内

代理不能自我认证

MCP 提交的声明以 proposed 状态落地,归属于代理

部分分析永远不会落地

每次运行是一个事务;崩溃的引擎留下 failed 运行行,且没有工件

自由文本只有一个归宿:注释,在它们自己的表和自己的导出流中,永远不会被误认为是发现。

启用完整引擎

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 也会被识别,PATH 上的 support/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

完整提取还需要 sasquatchjeffersonubi_reader,这些在 Windows 上很麻烦——这就是回退雕刻器存在的原因(ADR 0005)。

MCP

MCP 服务器是未来代理工作的接口,它与 CLI 是同级——两者都是同一个库的薄前端。

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

十五个工具:清单、工件和声明查询、字符串搜索、反编译检索、图遍历、模式发现、来源,以及用于写入的 aether_submit_claimaether_annotate。代理提交的声明会经过与适配器完全相同的验证,并以 proposed 状态落地。

Git 友好的导出

aether export 写入两棵树,分离就是重点:

  • graph/ — 工件、声明、链接。内容寻址,按 ID 排序,没有时间戳或运行 ID。对相同字节的两次独立分析产生字节相同的文件。提交这个;差异显示发现了什么。

  • ledger/ — 运行、证明、观察。来源是事件的记录,所以它会增长。这是正确的。

评估

真实基准位于 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 头,以及玩笑密码。这些都不是真实的,也不是活跃的。它的存在是为了让评估套件有一个真实基准完全已知的目标。

许可证

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