BashaarJavaid/MCP-Sentinel

GitHub: BashaarJavaid/MCP-Sentinel

MCP Sentinel 是一款面向 MCP 服务器的构建时安全扫描工具,通过静态分析、GPT 语义审查与 Docker 沙箱动态探测的三层机制,在发布前发现并映射到 OWASP Agentic Top 10 的安全漏洞。

Stars: 0 | Forks: 0

# MCP Sentinel **面向 MCP 服务器的构建时安全扫描。** AI agent 会调用由 MCP server 暴露的工具,而仅一个不安全的工具就可能导致凭据泄露、运行任意命令,或劫持 agent。MCP Sentinel 能在您发布之前发现这些漏洞——它会扫描 MCP server 并报告安全发现,每一项都会映射到一个已知的威胁类别。 它分为三层工作:确定性的静态规则用于寻找候选问题,GPT-5.6 结合上下文对每个问题进行审查,以减少误报并对探测计划进行排序和参数化,最后由 Docker 隔离的沙箱运行四项探测,以确认是否存在可利用或不安全的运行时行为。每一项发现都映射到 OWASP Agentic Top 10(面向 AI agent 的行业威胁列表),并渲染为 console、JSON 或 SARIF —— 这是 GitHub 在其安全选项卡中读取的标准格式。 *想在运行任何东西之前先了解概述?请跳转至[它检查什么](#what-it-checks)以及[架构](#architecture)图。* ## 三分钟内试用 Sentinel 无需检出源代码或提供 OpenAI API key。安装预构建的 wheel,然后运行捆绑的 GPT replay 与真实的 Docker 探测。 ### 1. 下载 wheel 从 [`v0.1.0` GitHub Release](https://github.com/BashaarJavaid/MCP-Sentinel/releases/tag/v0.1.0) 下载 `mcp_sentinel-0.1.0-py3-none-any.whl`,或使用 [直接 wheel 下载](https://github.com/BashaarJavaid/MCP-Sentinel/releases/download/v0.1.0/mcp_sentinel-0.1.0-py3-none-any.whl)。 其 SHA-256 摘要为: ``` 4672e63413e87bf750113c06a21133162d00f1e71ca6259a8394028c22b677aa ``` ### 2. 检查 Docker 使用 Python 3.10、3.11 或 3.12,并在 Linux 上启动 Docker Engine,或在 macOS/Windows 上启动 Docker Desktop。Windows 上的 Docker Desktop 必须使用 Linux 容器。 ``` docker info docker buildx version ``` 首次运行可能会通过 Sentinel 受限的构建网络下载 Docker 镜像和 fixture 依赖项。被扫描的服务器没有运行时网络访问权限。 ### 3. 安装并运行 macOS 或 Linux: ``` cd /path/to/download-directory python3 -m venv sentinel-judge-env source sentinel-judge-env/bin/activate python -m pip install ./mcp_sentinel-0.1.0-py3-none-any.whl sentinel --version sentinel demo --replay-review --verbose ``` Windows PowerShell: ``` cd C:\path\to\download-directory py -3.12 -m venv sentinel-judge-env .\sentinel-judge-env\Scripts\python.exe -m pip install .\mcp_sentinel-0.1.0-py3-none-any.whl .\sentinel-judge-env\Scripts\sentinel.exe --version .\sentinel-judge-env\Scripts\sentinel.exe demo --replay-review --verbose ``` 演示应以退出代码 `0` 结束并显示 `Status: COMPLETE`,评估全部七条静态和四条动态规则,并报告从 `SENT-001` 到 `SENT-011` 的结果。它将经过验证的报告写入: ``` sentinel-demo-results/report.json sentinel-demo-results/report.sarif ``` 在 macOS 或 Linux 上独立验证 SARIF: ``` python -m sentinel.report.validate_sarif sentinel-demo-results/report.sarif ``` 在 Windows PowerShell 上: ``` .\sentinel-judge-env\Scripts\python.exe -m sentinel.report.validate_sarif sentinel-demo-results\report.sarif ``` 当报告有效时,验证器不会产生任何输出并以 `0` 退出。Replay 会被显著标明且不进行任何模型调用;从 GPT-5.6 捕获的已检查响应仍会流经生产解析器、证据和探测计划验证器、所有四个真实的 Docker 探测、合并逻辑以及报告验证。 查看已接受的实时 [`SENT-010` GitHub 代码扫描告警](https://github.com/BashaarJavaid/mcp-sentinel-action-demo/security/code-scanning/10) 以及完整的 [Action 证据](artifacts/phase4-action-evidence.md)。 ## 架构 ``` flowchart LR A[Untrusted MCP repository] --> B[AST + Semgrep rules] B --> C[Canonical candidates] C --> D[GPT-5.6 semantic review] D --> E[Constrained four-probe plan] E --> F[Docker sandbox] F --> G[Reviewed dynamic evidence] D --> H[Deduplication + provenance merge] G --> H H --> I[Console] H --> J[JSON 1.2.0] H --> K[SARIF 2.1.0] K --> L[GitHub code scanning] ``` 静态分析永远不会导入或执行目标代码。动态分析仅在全新的容器中运行本地 Python MCP 目标,且具有只读源代码、受限的构建出口网络、无运行时网络、资源限制以及强制清理。GPT 可以对四个永久的惰性模板进行排序和绑定;它无法发出可执行的探测代码或创建无规则的结果。 ## 它检查什么 每条规则都映射到 OWASP Agentic Top 10 中的一个类别;`ASI0x:2026` 代码是该列表的威胁标识符(例如 `ASI03` 代表 Identity & Privilege Abuse)。 | 规则 | 检测内容 | OWASP | 影响 | |---|---|---|---| | SENT-001 | 过于宽泛的工具权限范围 | ASI03:2026 | High | | SENT-002 | 工具输入触达不安全的执行环境 | ASI05:2026 | Critical | | SENT-003 | 缺少工具输入验证 | ASI02:2026 | Medium | | SENT-004 | 未经清理的工具内容进入 prompt | ASI01:2026 | High | | SENT-005 | 硬编码的凭据 | ASI03:2026 | Critical | | SENT-006 | 缺少或无效的路由身份验证 | ASI03:2026 | High | | SENT-007 | 未经核实的工具清单 | ASI04:2026 | Medium | | SENT-008 | 超出范围的工具执行 | ASI02:2026 | Critical | | SENT-009 | 接受过大的参数 | ASI05:2026 | Medium | | SENT-010 | 执行了注入的 payload | ASI05:2026 | Critical | | SENT-011 | 处理了格式错误的 schema 输入 | ASI02:2026 | Low | 请查阅[规则目录](docs/rules.md)以了解边界、误报风险、证据和修复方案。 ## 人类、Codex 和 GPT 的贡献 人类所有者定义了产品范围、架构、信任边界、威胁模型、阶段关卡和发布决策。 ### Codex 是如何被使用的 Codex 是整个构建过程的实现合作伙伴。其工作模式是设计优先:在任何实施之前,一场漫长的 Codex 会议讨论了范围和架构 —— MVP 与延期功能、发现结果如何映射到 OWASP 类别、发现结果的允许状态转换,以及语义审查是否应该是可选的(不应该;一个标志只会让它变成摆设)。该会议是构建项目其余部分的架构骨干。 此后,Codex 构建了静态规则引擎和 Semgrep 适配器、Docker 沙箱和 probe harness、报告管道、SARIF 验证器、跨平台测试矩阵、制品自动化以及文档。它还调试了较难的跨平台问题 —— Semgrep 输出解析和 Windows 上的运行时文件隔离,以及 GitHub 代码扫描正确渲染报告之前所需的两轮 SARIF 修复。 该仓库附带了一份 [`AGENTS.md`](AGENTS.md),用于约束 Codex 在此代码库中的工作方式:宁可询问也不要假设、不进行投机性的复杂化、不进行无关的编辑、明确成功标准。设计决策仍由人类所有者掌握;Codex 加速了这些决策之后的所有流程。 ### GPT-5.6 是如何被使用的 GPT-5.6 位于发布的产品内部,而不仅仅是构建阶段。它在扫描时承担关键作用:它读取服务器代码,决定哪些静态候选对象是真正的发现结果,并对沙箱运行的四个 probe 进行排序和参数化 —— 关闭它你会得到不同的结果。它不会取代确定性检测器或 Docker 边界。 这些约束本身就是设计:针对带有版本的 schema 的严格 Structured Outputs,`store: false`,经过脱敏和限制的上下文,以及经过宿主机验证的源代码范围,因此模型无法引用不存在的代码行、发明规则集之外的发现结果,或发出可执行的 probe 代码。请参阅 [GPT-5.6 行为与披露](#gpt-56-behavior-and-disclosure) 了解完整的运行时契约,并查看 `artifacts/gpt-ablation.json` 获取针对仅使用规则、经 GPT 审查以及经动态确认的结果的量化比较。 ### Codex 会话记录 用于核心实现的主要 Codex `/feedback` 线程: `019f70e6-a5fb-7f13-8eae-bca041fc37ad`。 辅助实现线程: - `019f7469-e3ed-75a0-9906-7059299b1484` - `019f741f-cf91-7000-b12c-e9aa2a50ff03` - `019f77a1-f2f0-7ab2-9a5d-e72fa1ebc40e` 阶段 5 的 `/feedback` 记录是从上面的主线程提交的。 ## 要求与安装 支持的 CLI 环境是 Linux、macOS 和 Windows 上的 Python 3.10–3.12。完整的扫描和演示需要带 Buildx 的 Docker Engine 或 Docker Desktop。GitHub Action 运行在 Ubuntu 上。 检出开发版本: ``` uv sync --extra dev uv run sentinel --version ``` 兼容 pip 的开发路径是: ``` pip install -e ".[dev]" ``` [`v0.1.0` GitHub Release](https://github.com/BashaarJavaid/MCP-Sentinel/releases/tag/v0.1.0) 提供了由[成功的发布工作流](https://github.com/BashaarJavaid/MCP-Sentinel/actions/runs/29686427335)生成的预构建 wheel。 它通过了 Linux、macOS 和 Windows 测试矩阵、pip 和 pipx 安装冒烟测试,以及已安装 wheel 的 Docker replay。使用任一包前端直接安装该特定的 wheel: ``` python -m pip install mcp_sentinel-0.1.0-py3-none-any.whl # 或 pipx install mcp_sentinel-0.1.0-py3-none-any.whl ``` 该包尚未发布到 PyPI。 ## CLI ``` # 完整 static + GPT + Docker 分析 sentinel scan ./path/to/server # 已验证的 SARIF sentinel scan ./path/to/server --format sarif --output results.sarif # Static analysis 加上必需的 semantic review sentinel scan ./path/to/server --static-only # 当 GPT 不可用时明确允许未审查的候选项 sentinel scan ./path/to/server --static-only --allow-degraded # 默认使用紧凑输出;bounded evidence 为可选 sentinel scan ./path/to/server --verbose # 设置失败阈值;默认为 high sentinel scan ./path/to/server --fail-on critical ``` `--fail-on` 接受 `critical`、`high`、`medium`、`low` 或 `informational`,并决定哪些发现结果会产生退出代码 `1`。 `--color/--no-color` 覆盖显示检测。否则,`NO_COLOR` 会禁用样式,而交互式 TTY 会接收颜色。对于 JSON/SARIF,表示标志会被拒绝,而不是被静默忽略。 正常的扫描需要 `sentinel.target.yaml` 和 `sentinel.permissions.yaml`。`--static-only` 会省略 Docker 和启动配置,但仍需要语义审查。`OPENAI_API_KEY` 仅由 Sentinel 读取;它永远不会被打印、持久化、转发给目标,或被 Responses API 存储。 退出代码是稳定的: | 代码 | 含义 | |---:|---| | 0 | 完成扫描,未达到失败阈值的发现结果 | | 1 | 完成扫描,发现结果达到或超过阈值 | | 2 | 目标或配置错误 | | 3 | GPT、Docker、Semgrep、报告验证或内部失败 | 操作消息使用 `target error:`、`configuration error:` 和 `infrastructure error:` 前缀。`--debug` 添加内部 tracebacks。 ## 评判演示 该 wheel 包含易受攻击和干净的 fixture、schema 以及 GPT cassette。不需要检出源代码。 ``` # 离线 GPT replay 加上真实 Docker probes sentinel demo --replay-review --verbose # 实时 GPT review 加上真实 Docker probes export OPENAI_API_KEY=your-key sentinel demo --verbose ``` 这两个命令都会在 `./sentinel-demo-results/` 下自动刷新经过验证的报告;使用 `--output-dir` 更改位置。预期的漏洞使演示成功,因此完整的演示以 `0` 退出。 录制审查被显著标记,且永远不会被表示为实时调用。请参见[评判 runbook 与叙述](docs/demo.md)。 ## GPT-5.6 行为与披露 生产环境审查器使用 OpenAI Responses API 并具有以下特征: - 请求的模型为 `gpt-5.6-sol` 并记录返回的模型 ID; - `store: false`; - 默认为中等推理努力; - 使用带有版本的审查 schema 的严格 Structured Outputs; - 确定性的上下文选择、脱敏、批处理和候选上限; - 经过验证的源代码范围声明和受限的 probe 计划; - 当前/原始延迟、token、缓存、失败和微美元级的遥测。 Live 模式会调用模型。Replay 模式将已检查的实时响应馈送通过相同的解析器、验证器、合并逻辑、动态探测和报告。降级模式是显式的,将候选对象留在 `needs_review` 中,并且仍然符合 fail-on 条件。被抑制的候选对象连同其推理过程一起,在每份报告中保持可见。 ## GitHub Action ``` name: MCP Sentinel on: pull_request: push: branches: [main] permissions: contents: read security-events: write jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - id: sentinel uses: BashaarJavaid/MCP-Sentinel@ee91e07d0fa78106dbb6d85b60bd8288173abd23 with: target-path: . fail-on: high openai-api-key: ${{ secrets.OPENAI_API_KEY }} ``` 该 Action 在上传前验证 SARIF,并暴露 `sarif-path`、`findings-count` 和 `highest-severity`。Fork 的 pull request 不会接收 secret;它们运行明显降级的分析并跳过代码扫描上传。非 Fork 运行保持 fail-closed。保留的实时证明记录在 [`artifacts/phase4-action-evidence.md`](artifacts/phase4-action-evidence.md) 中。 ## 报告与可重现性 ``` python -m sentinel.schema check python -m sentinel.report.validate_sarif results.sarif make artifacts-check make notices-check ``` `artifacts/example.sarif` 是经过检查的实时报告。 `artifacts/gpt-ablation.json` 在带版本的真理集上比较了仅使用规则、经 GPT 审查和动态确认的结果。日常生成使用 replay 和 Docker;最终的实时刷新有硬性上限: ``` make artifacts MAX_USD=0.50 make artifacts-live ``` ## 许可证 MCP Sentinel 基于 MIT 许可。依赖项许可证和打包的声明文件记录在 [`THIRD_PARTY_NOTICES.md`](THIRD_PARTY_NOTICES.md) 中。
标签:DevSecOps, DLL 劫持, Docker隔离, MCP服务器, SARIF, 上游代理, 图数据库, 大语言模型, 安全扫描, 插件系统, 时序注入, 请求拦截, 逆向工具