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, 二进制安全, 云安全监控, 信息安全, 信息熵, 可视化界面, 图论, 形式化方法, 数学模型, 测试框架, 网络流量审计, 贝叶斯网络, 通知系统, 静态分析, 马尔可夫链