hackwither/reap

GitHub: hackwither/reap

REAP 是一款面向 AI Agent 协议端点的黑盒侦察工具,通过只读不调用的安全方式枚举暴露的能力面并审计认证与传输安全态势。

Stars: 1 | Forks: 0

REAP logo

REAP

Agent 协议的侦察与枚举

Go version License

**REAP 是针对 AI agent endpoint 的黑盒侦察工具。** 将其指向一个您已授权测试的 URL,它会识别正在运行的 agent 协议,枚举暴露给调用者的能力面(capability surface),并报告其周围的认证和传输安全态势,而绝不调用它发现的任何内容。 ## 为什么会有 REAP 您的团队在上个 sprint 发布的 MCP 网关。漏洞赏金项目刚刚纳入范围的 agent endpoint。某人在负载均衡器后面搭建并设置了 `allowedOrigins: ["*"]` 却被遗忘的内部服务。这就是 REAP 的作用:从真实攻击者的角度,对实时的 agent endpoint 进行外部的、未经身份验证的黑盒侦察。 ## 它有何不同 **它只读取,从不调用** 这是通过架构强制执行的,而非依靠约定。探针(probe)只能获得一个 `Session`,而 `Session` 没有暴露任何调用工具的方法。REAP 中没有任何代码路径会发送 `tools/call`,无论是通过哪种传输方式,或是来自任何内置探针或用户提供的模板。一个在 agent endpoint 上执行其发现内容的扫描器就不是扫描器了,而是一个 agent。有关此边界,请参阅 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。 **它是为 agent 量身定制的** 任何人都可以将 nuclei 指向某个 endpoint 并检查 TLS 和 CORS。REAP 检查的是那些只有在您知道在与 agent 通信时才有意义的事情:完整的工具清单是否对匿名调用者开放,握手阶段的 `instructions` 字段是否泄露了操作者的 prompt 内容,动态调度的工具是否隐藏了比 `tools/list` 所呈现的要大得多的能力面。 **专为流水线和 CI 打造** 为人类提供文本,为流水线提供 NDJSON,为 GitHub Advanced Security 及所有其他代码扫描摄入点提供 SARIF 2.1.0。单个静态 Go 二进制文件,零第三方依赖,无需 API key,无遥测,除了您要求的请求外,不会从您的机器发送任何其他内容。 **其设计旨在超越 MCP 的生命周期** 目前 MCP 是唯一受支持的协议,它是正确的首个目标。但这种架构(协议注册表、每个协议的 session、声明式检查)假定未来还会出现其他协议。 ## 安装 ``` go install github.com/hackwither/reap/cmd/reap@latest ``` 或者从源码构建: ``` git clone https://github.com/hackwither/reap cd reap && go build -o bin/reap ./cmd/reap ``` 需要 Go 1.21+。无其他依赖。 ## 快速开始 扫描单个 endpoint: ``` reap -t https://your-host/mcp --authorized ``` 使用凭证,查看已认证调用者能看到的内容: ``` reap -t https://your-host/mcp --auth-header "Bearer $TOKEN" --authorized ``` 机器可读格式,写入文件: ``` reap -t https://your-host/mcp --authorized --output json --out results/report.json ``` 并发的完整作用域列表,格式为 NDJSON: ``` cat scope.txt | reap --authorized --output json --concurrency 10 ``` 在 CI 中,格式为 SARIF: ``` reap -t "$MCP_ENDPOINT" --authorized --output sarif --out reap.sarif ``` ``` # .github/workflows/agent-recon.yml - name: Upload REAP findings uses: github/codeql-action/upload-sarif@v3 with: sarif_file: reap.sarif ``` ## 检查内容 检查结果映射到 OWASP Agentic Security Initiative 类别 (ASI01-ASI10)。 ### 能力面:这个 endpoint 愿意告诉陌生人什么? | 检查项 | 发现的内容 | |---|---| | `mcp-unauth-tools-list` | `tools/list` 对未认证调用者的响应 | | `mcp-tool-capability-surface` | 报告的完整工具清单,用于资产跟踪和跨运行差异对比 | | `mcp-resources-prompts-exposure` | 未认证的 `resources/list` 和 `prompts/list` | | `mcp-dynamic-dispatch` | 调度/搜索工具模式,暗示存在比 `tools/list` 报告的更大的隐藏能力面 | | `mcp-instructions-exposure` | 握手阶段的 `instructions` 泄露了操作者的 prompt 内容 | ### 认证与 session 态势 | 检查项 | 发现的内容 | |---|---| | `mcp-oauth-metadata-posture` | OAuth 元数据 endpoint 缺少 Bearer 挑战或 PKCE 声明 | | `mcp-redirect-uri-laxity` | 过于宽松或通配符的 OAuth 重定向 URI 注册 | | `mcp-session-id-entropy` | 微弱或可预测的 session 标识符 | | `mcp-host-header-validation` | 服务器在 `initialize` 期间未验证 `Host` | ### 传输态势 | 检查项 | 发现的内容 | |---|---| | `mcp-plaintext-transport` | 通过明文 HTTP 提供服务的 endpoint | | `mcp-transport-downgrade` | 同一主机同时接受明文 MCP 流量 | | `mcp-tls-cert-health` | 证书有效性、主机名不匹配、弱协议和密码选择 | | `mcp-cors-wildcard` | 通配符 CORS,以及通配符与凭证跨域访问的结合 | | `mcp-rate-limit-absence` | 成功响应中缺少标准速率限制标头 | `reap --list-probes` 会打印当前生效的集合。使用 `--include` / `--exclude` 进行选择。 ## 编写自定义检查 在 `templates/` 目录中放入一个 JSON 模板,无需 Go,无需重新构建: ``` { "id": "mcp-custom-header-leak", "protocol": "mcp", "severity": "medium", "request": { "method": "tools/list" }, "matchers": { "condition": "all", "rules": [ { "type": "status_code", "values": [200] }, { "type": "header", "name": "X-Internal-Service", "present": true } ] } } ``` 匹配器:`status_code`、`header`、`body_contains`、`json_path`,通过 `any` / `all` 组合。 模板被严格限制**不能**链式请求、根据响应数据进行分支,或调用发现的工具。前两者是路线图上的待办事项。第三者永远不会实现。如果您的检查需要真正的逻辑,请在 `internal/probe//checks.go` 中编写 Go 探针,详见 [`CONTRIBUTING.md`](CONTRIBUTING.md)。 ## 路线图 已计划,尚未发布: - **更多传输方式**:传统的 HTTP+SSE、stdio、WebSocket,都将位于相同的 `Session` 接口和相同的禁止调用边界之后。 - **有界范围发现**:扫描操作者提供的主机和端口列表以查找 agent endpoint。 - **更多协议**:A2A,以及任何其他达到部署规模的协议。 欢迎就上述任何内容提交 Issue 和 PR。 ## 贡献 请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)。唯一不可妥协的一点:合并到 REAP 的任何内容都不会调用被发现的能力。每个新的协议、传输方式、探针和模板都必须遵守该边界,并且 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) 解释了如何在类型系统中而不是通过审查来强制执行此边界。 ## 许可证 MIT。请参阅 [`LICENSE`](LICENSE)。 由 [@hackwither](https://github.com/hackwither) 构建。
标签:AI代理, AI安全, Chat Copilot, EVTX分析, GitHub, Go, GraphQL安全矩阵, LNA, Ruby工具, 安全扫描器, 实时处理, 密码管理, 日志审计, 黑盒测试