JasonTofte/sanctum-mcp
GitHub: JasonTofte/sanctum-mcp
Sanctum 是一个架构级强化的 Windows 取证 MCP 服务器,通过证据完整性保护和提示注入防御机制,让 AI agent 安全可靠地进行自主事件响应分析。
Stars: 0 | Forks: 0
# Sanctum — 面向 AI agent 的强化版取证服务器
**状态:** 0.4.1。快速入门可以端到端运行。六个解析器以真实模式发布(Amcache、ShimCache、BAM、UserAssist、Prefetch、Sysmon)。`claim_finding` 门控已上线。
**专为构建:** SANS `FIND EVIL!` 黑客松(截止日期 2026-06-15)。
**范围:** 仅限 Windows 执行证据 — 证明*运行了哪些程序*。网络、浏览器、云、电子邮件和内存工件在设计上不在此范围内。专注于一项工作的深度胜过对多项工作的浅层覆盖。
## 这是什么
Sanctum 允许 AI agent 搜索 Windows 机器以寻找入侵者的迹象。它阻止 agent 被证据欺骗或破坏证据。Sanctum 是一个 Model Context Protocol (MCP) 服务器:它向 agent 提供一小部分固定的取证工具,除此之外别无其他。
AI agent 以两种方式在这项工作上失败。Sanctum 阻止了这两种情况。
**1. 它们自信地陈述错误的发现。** 证据是由攻击者编写的。恶意软件名称、日志行和注册表值可以隐藏劫持 AI 读取它们的文本。2025 年 8 月,Sygnia 展示了攻击者如何让 AI 将 Mimikatz 凭据盗窃报告为*“计划内的维护任务”*。Sanctum 将每个工具结果包装为不受信任的,首先剔除已知的注入文本,并通过一个类型化的函数 `claim_finding` 路由发现。该函数拒绝无法追溯到真实证据的声明,并将单源发现标记为草稿,而不是已确认的结果。在机器速度下,一个自信的错误答案比诚实的“尚未证实”更糟糕。
**2. 它们销毁证据。** Sanctum 无法运行破坏性命令,因为其中不存在这样的工具。没有 shell。证据在操作系统级别以只读方式挂载。每次工具调用都会被哈希处理并写入仅追加的日志中。即使 agent 被劫持,它也无法更改其旨在调查的案件。
## 为什么这是内置的,而不是提示词
2025 年 11 月,Anthropic 报告称攻击者通过角色扮演越狱击败了基于提示词的安全规则,自动化率高达 90% ([GTG-1002](https://www.anthropic.com/news/disrupting-AI-espionage))。黑客松提出了一个正确的问题:*护栏是内置于系统中的,还是仅仅写在提示词中?*
提示词中编写的规则在越狱告诉模型忽略它的那一刻就失败了。由*不存在的函数*强制执行的规则是无法通过言语绕过的。Sanctum 的保证存在于服务器中,而不是提示词中。
## 门控如何工作
一项发现需要一个以上的来源。要声明“程序 X 已运行”,agent 必须引用**至少两个独立的证据族**。Windows 在五个位置记录程序执行,每个位置由系统的不同部分拥有:
| 族 | 它存在的位置 | 所有者 |
|---|---|---|
| AppCompat | ShimCache, Amcache | Application Experience 服务 |
| Explorer | UserAssist | `explorer.exe` + 用户注册表 |
| Background service | BAM | `bam.sys` 驱动程序 |
| Kernel ETW | Sysmon / Event 4688 | 事件日志 + Sysmon |
| SysMain | Prefetch | SysMain 服务 |
因为每个族由 Windows 的不同部分编写,所以伪造一个会保持其余部分完好无损。篡改表现为不一致。`claim_finding` 计算声明背后不同的族并对其进行评级:
- **DRAFT** — 一个族。一个假设,尚未成为证据。
- **CORROBORATED** — 两个或更多族一致。
- **FINAL** — 三个或更多族一致。
- **DRAFT_TAMPER_SUSPECTED** — 存在反取证痕迹,因此无论有多少族一致,门控都拒绝显得自信。
共享注册表配置单元的两个族(BAM 和 AppCompat)被标记为较弱。时间戳伪造检查可以在族对程序运行*时间*存在分歧时降低层级。数学原理和威胁模型详见 [`docs/THREAT_MODEL_TRIANGULATION.md`](docs/THREAT_MODEL_TRIANGULATION.md)。
门控是服务器边界处的一个普通函数([`src/sanctum/finding.py`](src/sanctum/finding.py))。无论模型相信什么或被告知得出什么结论,它的运行方式都是一样的。任何提示词都无法将其关闭。
## 架构
参考客户端是带有 Opus 4.7 的 Claude Code,但保证是在服务器中强制执行的,并且适用于任何标准 MCP 客户端(Cline、Claude Desktop、OpenAI MCP shim)。请参阅 [`docs/LLM_AGNOSTIC.md`](docs/LLM_AGNOSTIC.md)。
```
┌──────────────────────────────────────────────┐
│ AI agent (reference client: Claude Code) │
│ reaches Sanctum over MCP stdio. No shell. │
└───────────────────────┬───────────────────────┘
▼
┌──────────────────────────────────────────────┐
│ sanctum-mcp (this repo) │
│ │
│ Typed tools only. No shell passthrough. │
│ Every result is stripped of injection text │
│ and wrapped as . │
│ │
│ Execution-evidence tools (6, real mode): │
│ get_amcache get_userassist │
│ get_shimcache get_bam │
│ get_prefetch get_sysmon_4688 │
│ │
│ Finding gate: │
│ claim_finding(hypothesis, audit_ids[]) │
│ needs >= 2 independent families │
│ │
│ Audit log: │
│ append-only JSONL, HMAC-SHA-256 chained │
│ every tool call -> audit_id │
│ optional RFC 3161 timestamp │
└───────────────────────┬───────────────────────┘
▼
┌──────────────────────────────────────────────┐
│ Evidence, mounted read-only │
│ /cases//evidence (OS-level ro) │
└──────────────────────────────────────────────┘
```
基于内存的工具(进程列表、网络连接、代码注入标记)计划在 v2 中推出。它们目前还没有证据族,因此无法为门控提供数据。
有关信任边界流、模块映射、三层门控以及每层的威胁模型,请参阅 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。
## 它如何满足评审标准
| 标准 | Sanctum 如何应对 |
|---|---|
| **约束实现** | 内置于服务器中:不存在 shell 工具,证据是只读的,所有输入和输出都经过哈希处理和记录。Prompt hook 是额外的,不是保证。绕过测试:[`tests/test_bypass.py`](tests/test_bypass.py)。 |
| **IR 准确性** | 在相同问题上,准确率为 99.2%,而纯模型为 16.3%([`docs/ACCURACY.md`](docs/ACCURACY.md)),加上上面独立的 NIST 检查。发现已评级;单源声明保持为 DRAFT。 |
| **审计追踪** | 每个发现都引用了必须解析为真实日志条目的 `audit_ids`。HMAC 链阻止任何人事后编辑日志。 |
| **自主执行** | 门控是 agent 的外部检查。单源声明返回 DRAFT,这会推动 agent 在确认之前寻找第二个族。 |
| **广度和深度** | 全部五个 Windows 执行证据族,且具有深度。内存工件将在 v2 中提供。 |
| **可用性和文档** | 一条命令快速入门,锁定的依赖项,Docker 路径。 |
## 它不能做什么
这些是 v1 的限制,在此明确说明,以便评审和操作员判断其适用性。
- **模型仍然可能会误读正确的证据。** Sanctum 控制 agent 看到的证据以及发现的引用方式。它不控制模型如何读取正确的结果。这取决于模型(Opus 4.7),并已在 [`docs/ACCURACY.md`](docs/ACCURACY.md) 中单独测量。
- **注入过滤器是已知模式的列表。** 它能捕获 Sygnia 2025 集和常见的 Unicode 技巧。它无法捕获没人见过的模式。这是深度防御,而不是保证。请参阅 [`docs/THREAT_MODEL_SANITIZATION.md`](docs/THREAT_MODEL_SANITIZATION.md)。
- **准确性基准是团队从 DFIR-Metric 编写的一个子集。** 外部问题集会更有说服力。解析器层现在已根据独立的 NIST 证据(见结果)进行了检查,这弥补了部分差距。
- **实时证据覆盖范围有限。** NIST 检查是在 Windows 7 映像上运行的,其中只有五个族中的三个存在(BAM 和 Sysmon 在更高版本的 Windows 中才出现)。完整的五族运行需要配备 Sysmon 的现代主机。
- **同时伪造多个族的内核 rootkit 在设计上会破坏计数。** v1 在此层级依赖于篡改检测层和签名日志。请参阅 [`docs/THREAT_MODEL_TRIANGULATION.md`](docs/THREAT_MODEL_TRIANGULATION.md#scope-and-threat-model-boundary)。
## 5 分钟内试用
查看门控触发,无需 SIFT VM 或下载的磁盘映像:
```
python3 -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
python3 scripts/quickstart.py
```
快速入门会启动 MCP 服务器,列出类型化工具(表明不存在 shell 工具),调用 `get_amcache`,然后使用该单一来源调用 `claim_finding`。预期结果是 **DRAFT** — 门控拒绝确认单族声明。如果安装正常,它将以 `PASS — gate fired correctly.` 结束。不需要 LLM。
有关 DRAFT → CORROBORATED 的完整多族运行以及显示门控拒绝虚假引用的内容,请参阅 [`scripts/dfir_investigation.py`](scripts/dfir_investigation.py)。
## 安装与开发
```
# Python 3.10+
python3 -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
python -m sanctum.server # run the MCP server (stdio)
pytest # run the tests
```
在设置 `SANCTUM_CASES_ROOT`、`SANCTUM_OUTPUT_ROOT`、`SANCTUM_LEDGER_PATH` 和 `SANCTUM_LEDGER_HMAC_KEY` 之前,服务器**拒绝启动**(对于未挂载的测试目录,添加 `SANCTUM_SKIP_MOUNT_CHECK=1`)。`scripts/quickstart.py` 会为您设置这些;对于真实的 MCP 客户端,请参阅 [`docs/CLAUDE_SETTINGS_REFERENCE.md`](docs/CLAUDE_SETTINGS_REFERENCE.md) 和 [`docs/LLM_AGNOSTIC.md`](docs/LLM_AGNOSTIC.md)。
操作员使用哈希锁定的 wheel 包进行安装:`pip install -r requirements.txt --require-hashes`。包括 SIFT VM 在内的完整设置位于 [`docs/REPRODUCTION.md`](docs/REPRODUCTION.md) 中。
## 数据集
仅使用或重新分发具有许可证安全的数据:**NIST CFReDS**(公共领域)作为主要基准事实,以及 **DFRWS** 挑战。引用了 M57-Patents、Ali Hadi 和 CyberDefenders 案例,但未重新分发。
## 先前工作
- **Valhuntir** (Steve Anson / AppliedIR) — 最接近的同类产品,也是简报中的参考。其 README 警告说,告诉它“find evil”将“极有可能产生幻觉”。Sanctum 是架构上的答案:门控的正确性是类型化函数的属性,而不是模型的属性。Sanctum 提供了一个更窄、更深的切片,包含 Valhuntir 的 README 未声称的三个原语 — 双族印证门控、哈希锁定安装,以及捕获插入、删除和重新排序的 HMAC 链式日志。
- **Protocol SIFT** (teamdfir) — 此概念验证在此基础上进行了扩展,其本身没有服务器边界。
- **Sygnia, "When Your Logs Lie to You"** (2025 年 8 月) — Sanctum 的过滤器旨在防御的注入攻击。
- 支持该设计的研究:Greshake 等人(间接注入)、Huang 等人 ICLR 2024(模型无法可靠地从内省中进行自我纠正),以及 Kamoi 等人 TACL 2024(门控使用的外部信号纠正)。完整列表见 [`docs/ACCURACY.md`](docs/ACCURACY.md) 和威胁模型文档。
## 许可证
MIT — 详见 [`LICENSE`](LICENSE)。
标签:AI代理, HTTPS请求, MCP服务器, Windows取证, 库, 应急响应, 提示注入防御, 数字取证, 时序数据库, 源代码安全, 自动化脚本, 请求拦截, 逆向工具