studiomeyer-io/mcp-stdio-shellguard

GitHub: studiomeyer-io/mcp-stdio-shellguard

针对 MCP stdio 服务器的纵深防御工具包,通过运行时命令防护包装器和 AST 静态审计扫描封堵 shell 注入类 RCE 漏洞。

Stars: 0 | Forks: 0

# mcp-stdio-shellguard [![npm 版本](https://img.shields.io/npm/v/mcp-stdio-shellguard?style=flat-square&color=cb3837&logo=npm&label=npm)](https://www.npmjs.com/package/mcp-stdio-shellguard) [![npm 下载量](https://img.shields.io/npm/dm/mcp-stdio-shellguard?style=flat-square&color=cb3837&logo=npm&label=installs%2Fmo)](https://www.npmjs.com/package/mcp-stdio-shellguard) ![许可证](https://img.shields.io/github/license/studiomeyer-io/mcp-stdio-shellguard?style=flat-square&color=22c55e&label=license) ![最后提交](https://img.shields.io/github/last-commit/studiomeyer-io/mcp-stdio-shellguard?style=flat-square&color=88c0d0&label=updated) ![GitHub 点赞数](https://img.shields.io/github/stars/studiomeyer-io/mcp-stdio-shellguard?style=flat-square&color=ffd700&logo=github&label=stars) MCP stdio 服务器的深度防御捆绑包。使用允许列表 + 沙箱 + 重放检测封装 `child_process.exec/spawn`,外加一个 AST 审计 CLI (`mcp-shellguard-audit`),可扫描 MCP 服务器源代码中未经处理的 shell 调用。解决了 Ox-Security 披露的 MCP stdio-RCE 漏洞类别(20 万个脆弱服务器,2026 年 5 月披露)。 - **MCP 规范**: 2025-06-18 - **SDK**: `@modelcontextprotocol/sdk` ^1.29.0 - **Node**: >= 20 - **许可证**: MIT - **作者**: Matthias Meyer (StudioMeyer) ## 安装 ``` npm install mcp-stdio-shellguard ``` 或者无需安装直接运行审计 CLI: ``` npx -y -p mcp-stdio-shellguard mcp-shellguard-audit scan ./src ``` ## 功能特性 三层防护,可按需逐层选择启用: 1. **库 API** — 可直接插入您自己的 MCP 服务器调用的 `guardExec` / `guardSpawn`。支持默认拒绝的允许列表、沙箱配置文件和重放窗口。 2. **审计 CLI** — `mcp-shellguard-audit scan ` 遍历 AST,报告从 LOW(`无超时`)到 CRITICAL(`exec(\`...${userInput}...\`)`)的 12 种反模式。 3. **参考 MCP 服务器** — `mcp-stdio-shellguard-demo` 暴露了 8 个工具,以便 MCP Inspector / Claude Desktop 可以直接驱动该捆绑包。 ## 工具 (参考服务器) | 工具 | 类型 | 用途 | |------|------|---------| | `guard_exec` | 破坏性 | 受防御的 `child_process.exec`。强制使用 args[] 向量、允许列表 + 沙箱 + 重放。返回 `stdout`、`stderr`、`exitCode`、`canonicalHash`、`isReplay`、`trustTier`。 | | `guard_spawn` | 破坏性 | 受防御的 `child_process.spawn`。返回 stdout/stderr 的 SHA-256 哈希值而非完整主体。硬性拒绝 `shell:true`。 | | `register_allowlist` | 修改性 | 注册一个工具名称及其可执行文件 + args 正则表达式。如果不注册,则应用默认拒绝规则。 | | `audit_source` | 只读 | 扫描 TS/JS 路径以查找 shell 注入反模式。返回 `AuditFinding[]` 及摘要。 | | `audit_report` | 只读 | 将审计结果格式化为 markdown / json / SARIF 2.1.0。 | | `replay_check` | 只读 | 计算调用的规范 SHA-256 哈希值,并报告它是否已处于重放窗口中。 | | `sandbox_status` | 只读 | 报告活动的沙箱配置文件 + 具体限制 + cgroup-v2 活动标志。 | | `trust_tier` | 只读 | 推断已注册工具的 LOW/MEDIUM/HIGH/CRITICAL 级别并提供改进提示。 | ## 沙箱配置文件 | 配置文件 | 超时时间 | 最大 stdout | 最大 stderr | FD 预算 | cgroup-v2 | |---------|---------|-----------|-----------|-----------|-----------| | `strict` | 5 秒 | 1 MB | 256 KB | 32 | 是 (CPU/内存) | | `standard` (默认) | 30 秒 | 10 MB | 1 MB | 256 | 是 | | `permissive` | 5 分钟 | 100 MB | 10 MB | 1024 | 否 | 调用方可以在每次调用时通过 `timeoutMs` / `fdBudget` 进行收紧。调用方不能扩展超出配置文件的范围。 ## 信任等级 | 等级 | 条件 | |------|-----------| | LOW | 工具未注册 (默认拒绝) | | MEDIUM | 已注册但 `argsPatterns` 为空 (允许任何参数) | | HIGH | 设置了 `argsPatterns`,但沙箱或重放跟踪器未激活 | | CRITICAL | argsPatterns + 沙箱 + 重放均已激活 | 通过注册工具 + 设置 argsPatterns + 运行 `guardExec`/`guardSpawn`(该操作始终会激活沙箱和重放),可将等级从 LOW 提升至 CRITICAL。 ## 库快速入门 ``` import { AllowlistRegistry, ReplayWindow, guardExec, } from "mcp-stdio-shellguard"; const registry = new AllowlistRegistry(); const replay = new ReplayWindow(); registry.register({ toolName: "git-log", executable: "/usr/bin/git", argsPatterns: ["^log$", "^--oneline$", "^-n$", "^\\d+$"], sandboxProfile: "strict", }); const result = await guardExec( { toolName: "git-log", command: "/usr/bin/git", args: ["log", "--oneline", "-n", "10"], }, { registry, replay }, ); console.log(result.stdout); // → commit lines console.log(result.trustTier); // → "CRITICAL" console.log(result.canonicalHash); // → 64-char SHA-256 ``` ## 审计 CLI ``` mcp-shellguard-audit scan ./src mcp-shellguard-audit scan ./src --format sarif --output audit.sarif mcp-shellguard-audit scan ./src --severity-floor HIGH # CI gate ``` 退出代码: - `0` 干净 (没有达到或超过阈值的发现) - `1` 存在发现 - `2` 解析 / IO 错误 ## 反模式库 (12 条规则) | ID | 严重程度 | 触发条件 | |----|----------|-------------| | `exec_template_literal_with_input` | CRITICAL | `child_process.exec(\`ls ${x}\`)` | | `exec_dynamic_string` | CRITICAL | `child_process.exec(cmd)` | | `exec_sync_dynamic_string` | CRITICAL | `child_process.execSync(cmd)` | | `eval_near_child_process` | CRITICAL | `eval(...)` | | `function_constructor_near_child_process` | CRITICAL | `new Function(...)` | | `spawn_dynamic_file_args` | HIGH | `spawn(bin, userArgs)` | | `exec_file_dynamic` | HIGH | `execFile(bin, ...)` | | `shell_true_option` | HIGH | `{ shell: true }` | | `os_system_equivalent` | HIGH | `Deno.run` / `Bun.spawn` | | `spawn_literal_dynamic_args` | MEDIUM | `spawn('git', userArgs)` | | `unbounded_buffer` | LOW | 没有 `maxBuffer` 的 exec | | `missing_timeout` | LOW | 没有 `timeout` 的 exec/spawn | ## 编译指示 - `// shellguard:ignore-next-line` — 抑制一个发现 - `// shellguard:ignore-file` — 抑制整个文件 (极少使用;建议按行抑制) ## 存在的原因 Ox-Security 披露 (2026-05) 有超过 20 万个 MCP stdio 服务器在使用带有直接来自 LLM 工具参数的用户输入的模板字符串来封装 `child_process.exec`。LiteLLM v1.83.6 就是典型的例子 (CVE 已在 1.83.7 版本中修补)。 本捆绑包是防御性安全的对应方案:一个即插即用的防护器和扫描器,从根本上解决了这一类问题。灵感来自 AWS Linux `seccomp` + Chromium 沙箱层。 ## 另请参见 - `HOOK_RECIPES.md` — Claude Code hook 配方,可自动拦截危险的工具调用 - `CHANGELOG.md` — 发布历史 - Ox-Security MCP 审计: - LiteLLM CVE-2026-XXXX: ## 许可证 MIT — 版权所有 (c) 2026 Matthias Meyer (StudioMeyer)
标签:AI安全, AST静态分析, Chat Copilot, CISA项目, CVE-2025-69256, GNU通用公共许可证, Go语言工具, LLM服务器安全, MCP协议, MITM代理, Node.js, npm包, stdio安全, TypeScript, 命令注入, 大模型安全, 安全审计CLI, 安全插件, 暗色界面, 模型上下文协议, 沙盒执行, 深度防御, 漏洞修复, 白名单, 网络安全, 网络安全培训, 自动化攻击, 进程执行控制, 远程代码执行(RCE), 隐私保护