copyleftdev/mimir
GitHub: copyleftdev/mimir
基于数学理论构建的确定性GraphQL安全审计工具,可系统探索API状态空间并以统计方法证明发现结果。
Stars: 0 | Forks: 0
mimir
基于经过验证的数学理论构建的确定性 GraphQL 安全审计工具。
16 个 crate ·
299 个测试 ·
约 13,000 行 Rust 代码 ·
5.7MB 二进制文件 ·
MIT
在北欧神话中,**Mimir** 守卫着世界之树尤克特拉希尔深处的智慧之泉。奥丁挖出自己的眼睛并将其投入泉中,以获取对万物的知识。**mimir** 从你的 GraphQL schema 中汲取信息,并告诉你它发现了什么。
```
mimir sweep https://api.example.com/graphql
```
## 为什么存在 mimir
市场上每一个 GraphQL 安全工具都是一堆启发式规则的集合——按顺序运行的一系列已知错误配置检查。它们只能找到它们已经知道要查找的东西,除此之外别无他法。它们不可组合、不可重现、也没有数学基础。
**mimir 与众不同。** 它将你的 GraphQL API 建模为一个形式系统——一个带有状态转换的类型有向图——并使用经过验证的数学技术来系统地探索其状态空间。
在现有工具运行检查清单的地方,mimir 带来了:
| 技术 | 作用 |
|-----------|-------------|
| **MDP 探索** | 策略性选择的操作序列,而非随机模糊测试 |
| **香农熵** | 可量化的信息泄露测量 |
| **图论中心性** | 按结构重要性对类型进行风险排序 |
| **覆盖数组** | 多项式测试用例的数学覆盖保证 |
| **SPRT 提前停止** | 证据充分时停止,而非检查 N 次后停止 |
| **Fisher 精确检验** | 认证边界差异的统计显著性 |
| **Lamport 排序** | 并发突变中的形式化竞态条件检测 |
| **马尔可夫稳态分布** | 按实际可利用性加权发现结果 |
| **贝叶斯网络** | 跨发现结果的复合漏洞推理 |
| **Hughes 收缩** | 最小化复现序列,而非 200 个操作的追踪 |
结果:一个单一的静态二进制文件,能够发现任何检查清单都无法发现的东西,用统计方法证明其发现,并从种子确定性复现每一个发现。
## 快速开始
```
# 从发布版安装
curl -sSL https://github.com/copyleftdev/mimir/releases/latest/download/mimir-$(uname -s)-$(uname -m) -o mimir
chmod +x mimir
# 或从源码构建
cargo install --path crates/mimir-cli
# 完整安全扫描
mimir sweep https://api.example.com/graphql
# 获取并检查 schema
mimir introspect https://api.example.com/graphql
# 图论分析
mimir analyze https://api.example.com/graphql
# 生成测试查询(不执行)
mimir generate https://api.example.com/graphql
```
## 命令
### `sweep` -- 完整安全扫描
运行完整的探索循环:内省、分析、生成、执行和评估。
```
mimir sweep https://api.example.com/graphql \
--seed 42 \
--max-ops 500 \
--max-depth 4 \
--strategy ucb1 \
--auth-header "Authorization:Bearer eyJhbG..." \
--timeout 10 \
--format pretty
```
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--seed` | `0` | 确定性探索的种子。相同种子 = 相同结果。 |
| `--max-ops` | `1000` | 停止前执行的最大操作数。 |
| `--max-depth` | `3` | 最大查询嵌套深度。 |
| `--strategy` | `ucb1` | 探索策略:`ucb1`、`epsilon-greedy`、`thompson`。 |
| `--auth-header` | -- | 认证头,格式为 `Key:Value`。可重复使用多个头。 |
| `--timeout` | `10` | 每个请求的超时时间(秒)。 |
| `--format` | `pretty` | 输出格式:`pretty`、`json`、`sarif`。 |
| `--execute-mutations` | `false` | 实际发送突变。**注意:会修改服务器状态。** |
### `introspect` -- Schema 内省
通过标准内省查询获取 schema 并显示它。
```
mimir introspect https://api.example.com/graphql
mimir introspect https://api.example.com/graphql --format json
```
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--format` | `pretty` | 输出格式:`pretty` 或 `json`。 |
### `analyze` -- 图论分析
计算 schema 类型图上的结构度量:中心性、强连通分量、环、可达深度。
```
mimir analyze https://api.example.com/graphql --top-k 15
```
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--format` | `pretty` | 输出格式:`pretty` 或 `json`。 |
| `--top-k` | `10` | 按中心性分数显示的顶部类型数量。 |
### `generate` -- 测试查询生成
从 schema 生成查询和突变,而不执行它们。可用于审查、导出到其他工具或试运行检查。
```
mimir generate https://api.example.com/graphql --seed 42 --max-depth 4
```
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--seed` | `0` | 确定性生成的种子。 |
| `--max-depth` | `3` | 最大查询嵌套深度。 |
## 数学原理
这是 mimir 的核心。十个数学框架,每个都解决启发式规则无法解决的特定问题。
| # | 数学家 | 框架 | 替代方案 | 实现功能 |
|---|--------------|-----------|----------|---------|
| 1 | **克劳德·香农** (1948) | 信息熵 | "错误消息看起来很详细" | 可量化的信息泄露:`H(X) = -Sum p(x) log2 p(x)`。高熵错误消息是测量得出的,而非猜测的。 |
| 2 | **理查德·贝尔曼** | 马尔可夫决策过程 | 随机模糊测试 | 通过 UCB1/Thompson 采样的策略性探索。选择操作以最大化新状态的发现。 |
| 3 | **莱昂哈德·欧拉** | 图论 | 手动 schema 审查 | 介数中心性、强连通分量、环检测、最小顶点割。schema *就是*攻击面。 |
| 4 | **D. Richard Kuhn** | 覆盖数组 | "测试所有东西" | t 方式组合覆盖。2 方式数组用约 100 个测试用例就能捕获约 70% 的 bug,而非 100,000 个。 |
| 5 | **亚伯拉罕·瓦尔德** (1945) | 序贯概率比检验 | "运行 N 次检查,然后停止" | 基于证据的提前停止。一旦达到统计置信度就立即停止——对脆弱目标更快,对安全目标更彻底。 |
| 6 | **罗纳德·费舍尔** (1922) | Fisher 精确检验 | "这些响应看起来不同" | 认证边界的统计显著性。报告 p 值,而非感觉。p=0.003 意味着 0.3% 的巧合概率。 |
| 7 | **约翰·休斯** (2000) | 状态收缩 | 200 个操作的 bug 报告 | 最小化复现:47 个操作的追踪收缩为关键的 3 个操作。可操作,而非铺天盖地。 |
| 8 | **莱斯利·兰波特** (1978) | 先发生排序 | "我们不测试并发" | 形式化竞态检测。使用因果排序测试并发突变的 TOCTOU 违规。 |
| 9 | **安德烈·马尔可夫** (1906) | 稳态分布 | 等权重发现 | 按可利用性加权发现结果。高概率状态(用户和攻击者实际所在的位置)会被优先考虑。 |
| 10 | **托马斯·贝叶斯** (1763) | 贝叶斯网络 | 严重性 = 感觉 | 复合漏洞推理。"内省启用 + 无速率限制 + 弱认证" 有计算出的概率,而非直觉的严重性。 |
## 架构
### Crate 地图
```
mimir/
crates/
mimir-schema Schema parser, type graph, introspection client
mimir-graph Graph theory (centrality, SCC, paths, cuts)
mimir-gen Query/mutation generator (grammar-aware, covering arrays)
mimir-mdp MDP state machine, exploration strategies (UCB1, Thompson)
mimir-entropy Information theory (Shannon entropy, NCD, differential)
mimir-oracle Security invariant checker (LTL properties)
mimir-dst Deterministic simulation engine (seed-driven, reproducible)
mimir-transport HTTP client, request/response capture, replay
mimir-report SARIF / JSON / pretty output, finding deduplication
mimir-cli CLI interface (the `mimir` binary)
mimir-wald Wald's SPRT for early stopping
mimir-shrink Hughes-style stateful shrinking of attack sequences
mimir-fisher Fisher exact test for differential significance
mimir-lamport Happens-before race detection for concurrent mutations
mimir-markov Steady-state analysis of the API state space
mimir-bayes Bayesian vulnerability network
```
### 依赖图
```
mimir-schema ─────┬──> mimir-graph
|
├──> mimir-gen ──> mimir-mdp
| |
| v
mimir-transport ──┴──> mimir-dst ──> mimir-oracle
|
mimir-entropy ─────────────────────────┘
|
mimir-wald ─────────┤
mimir-fisher ───────┤
mimir-lamport ──────┤
mimir-markov ───────┤
mimir-bayes ────────┤
mimir-shrink ───────┘
|
v
mimir-report
|
v
mimir-cli
```
### 关键设计决策
1. **Schema 优先。** 一切都从内省的 schema 开始。类型图是所有分析的基础。
2. **默认确定性。** 每次运行都可以通过种子重现。DST 引擎通过单个 PRNG 控制所有随机性。
3. **关注点分离。** 生成、执行和评估是独立的。生成测试用例而不执行它们。评估记录的流量而不生成新查询。
4. **属性驱动。** 安全属性在 LTL 中声明,而非硬编码。针对你的特定 API 的自定义属性。
5. **单一二进制文件。** 一个静态二进制文件。无 Python,无运行时,无依赖。|
## 输出格式
### Pretty(默认)
ANSI 彩色终端输出。为交互使用而设计的人类可读格式。
```
mimir sweep https://api.example.com/graphql --format pretty
```
### JSON
用于脚本和集成的机器可读结构化输出。
```
mimir sweep https://api.example.com/graphql --format json
```
### SARIF v2.1.0
静态结果交换格式。可直接与 GitHub Code Scanning、Azure DevOps 和任何 SARIF 兼容的查看器集成。
```
mimir sweep https://api.example.com/graphql --format sarif > results.sarif
```
## 示例输出
```
mimir sweep v0.1.0
Target: https://api.example.com/graphql
Seed: 42 | Strategy: UCB1 | Max ops: 1000 | Max depth: 3
Schema
======
Types: 87
Queries: 24
Mutations: 18
Graph Analysis
==============
Nodes: 87 | Edges: 214 | Cycles: yes
SCC count: 3 | Largest SCC: 12 types
Top centrality: User (0.3842), Account (0.2917), Organization (0.2103)
Exploration
===========
Operations executed: 347 / 1000 (SPRT early stop)
States discovered: 23
Unique responses: 41
Findings (2)
============
[MEDIUM] Information Leakage via Error Messages
Location: mutation { updateUser(id: "...", input: {...}) }
Evidence: Error response entropy H=4.72 bits (threshold: 3.0)
Response contains: type name, field name, internal ID format
Confidence: p=0.0041 (Fisher exact test)
Reproduce: mimir sweep https://api.example.com/graphql --seed 42
[LOW] Introspection Enabled in Production
Location: __schema query
Evidence: Full schema returned (87 types, 42 operations)
Confidence: deterministic (always reproducible)
Summary
=======
2 findings | 0 high | 1 medium | 1 low | 0 info
Scan completed in 12.4s
```
## 从源码构建
```
git clone https://github.com/copyleftdev/mimir
cd mimir
cargo test
cargo build --release
# 二进制文件位于 target/release/mimir(约 5.7MB 去除符号)
strip target/release/mimir
```
需要 Rust 2024 版(1.85+)。
## CI 集成
```
# GitHub Actions 示例
- name: Run mimir
run: |
mimir sweep ${{ secrets.GRAPHQL_ENDPOINT }} \
--auth-header "Authorization:Bearer ${{ secrets.API_TOKEN }}" \
--format sarif \
> mimir-results.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: mimir-results.sarif
```
## 许可证
MIT
## 名称由来
在北欧神话中,Mimir 守卫着世界之树尤克特拉希尔深处的智慧之泉。奥丁牺牲了自己的眼睛,喝下泉水以获取对万物的知识。**mimir** 从你的 GraphQL schema 中汲取信息,并告诉你它发现了什么。
标签:API安全, GraphQL安全, JSON输出, meg, Rust, 二进制安全, 云安全监控, 信息安全, 信息熵, 可视化界面, 图论, 形式化方法, 数学模型, 测试框架, 网络流量审计, 贝叶斯网络, 通知系统, 静态分析, 马尔可夫链