SuperAPI AI 工具集

mcp-sentinel

安全与审计

查看项目

更新于 10-16 02:22

技能介绍

MCP Sentinel 是一个面向 Claude Skills 和 MCP 服务器的安全监控代理。其职责是保护用户免受恶意、存在漏洞或配置错误的技能与 MCP 服务器的影响,方式包括将本地已安装内容与多个威胁情报来源交叉比对,以及直接分析技能文件中的可疑模式。

一、背景与用途 MCP/Skills 生态发展迅速。据资料所述,截至 2026 年初,研究显示约 36% 的 AI 智能体技能存在安全缺陷,已追踪超过 138 个 CVE,并在 ClawHub 等注册表上识别出数千个恶意技能。单个被攻陷的技能即可窃取 API 密钥、注入恶意代码或提升权限。Postmark MCP 事件(2025 年 9 月)是典型案例:一个历经十五个版本均干净可信的技能,在某次单行更新中悄悄将用户发出的每封邮件密送给 phan@giftshop.club,而对原版本的静态扫描无法发现。正因如此,Sentinel v2 增加了第二个实时防护层:在工具调用即将执行时(而非仅在安装时)进行检查的 PreToolUse 钩子。

二、运行时防护层(v2) Sentinel v2 提供两个钩子。PreToolUse 钩子(hooks/sentinel_preflight.py)在每个技能或 MCP 发起工具调用前运行:它从 stdin 读取工具调用 JSON,与内置的 IOC 库(references/iocs.json)以及用户允许列表比对,返回三种决策之一:

  • deny:仅针对已确认的恶意指示器(来自真实事件的已知恶意域名)。此类调用永不抵达目标工具,且不可加入允许列表。
  • ask:针对可疑启发式特征(敏感路径、环境变量、外泄通道、危险命令)。调用被转交到 Claude Code 原生权限提示,由用户决定允许或拒绝,不会被直接拦截。
  • allow:干净调用以及用户已信任的内容静默通过。 第二个 PostToolUse 钩子(hooks/sentinel_postflight.py)实现“批准即记住”。Claude Code 仅在调用确实执行时(即用户已在提示中批准)触发 PostToolUse。此时若涉及被标记的路径或域名,Sentinel 会将具体实体加入 ~/.claude/sentinel-allowlist.json,以免反复询问。若在提示中拒绝则不记忆,下次仍会询问。危险命令模式与敏感环境变量永不自动记忆(否则等同于整体白名单化 curl | bash 之类),用户如需可手动添加。

三、实时可捕获的内容

  • 敏感路径:任何触碰 ~/.ssh/、~/.aws/、~/.env、~/.gnupg/、~/.kube/config、/etc/shadow、credentials.json、*.env 等的读取或 shell 访问。
  • 敏感环境变量:解引用 ANTHROPIC_API_KEY、AWS_SECRET_ACCESS_KEY、GITHUB_TOKEN、STRIPE_SECRET_KEY、DATABASE_URL 以及通用的 *_API_KEY / *_SECRET / *_TOKEN / *_PASSWORD 模式的命令。
  • 已知恶意域名:来自已确认事件的硬编码 IOC,如 giftshop.club(Postmark MCP 后门)。此类不可被允许列表覆盖。
  • 外泄通道:pastebin 类服务(pastebin.com、transfer.sh、0x0.st、file.io、webhook.site、requestbin、ngrok、serveo)以及无域名的裸 IP URL。
  • 危险 shell 模式:curl ... | bash、wget ... | sh、nc -e、bash -i >& /dev/tcp/...、base64 | curl 链、命令起始处的 eval/exec、chmod 777、追加到 ~/.bashrc 等。
  • 恶意软件源主机:与 references/blocklist-feed.txt 精确主机匹配,该文件是从 abuse.ch URLhaus feed 自动更新的当前活跃恶意主机列表。此类为硬拒绝,但与人工维护的事件不同,若 feed 误报可加入允许列表。

四、保持 feed 更新 feed 由 tools/update_blocklist.py 刷新(下载 URLhaus,无需账号)。可按需运行,或安排定时(如每日 cron)保持最新。默认不安装 cron;若用户希望免手动更新,可提议配置。

五、成本与失败模式 正常运行时零 LLM token 消耗。钩子为本地 Python,每次调用约 30–80ms。仅在确实拦截时,才向上下文添加一条简短消息。失败模式为 fail-open:若 IOC 文件缺失、stdin 格式错误或钩子崩溃,决策默认放行,以免 Sentinel 本身破坏 Claude Code。这是有意的权衡。

六、安装与卸载 安装运行时钩子: 用户作用域(全局,推荐):bash hooks/install_hooks.sh --user 仅项目作用域:bash hooks/install_hooks.sh --project 在原生 Windows 或没有 bash 和 jq 的机器上,改用跨平台安装器(仅需 Python 标准库,无外部工具): python hooks/install_hooks.py --user(或 --project;--uninstall 卸载) 两个安装器均为幂等,校验现有 JSON,保留 settings.json 的时间戳备份,注册全部三个钩子(PreToolUse + PostToolUse + 一个 SessionStart 配置扫描),并保留用户已有的其他钩子。它们按脚本文件名对 Sentinel 自身条目去重,混合使用不会重复注册。 卸载:bash hooks/uninstall_hooks.sh --user(或 --project)。仅移除 Sentinel 的钩子条目,用户注册的其他 PreToolUse 钩子予以保留。

七、允许列表配置 用户可在 .security/sentinel-allowlist.json(项目)或 ~/.claude/sentinel-allowlist.json(全局)中白名单化路径、域名和命令,格式示例: { "paths": ["/home/me/project/.env.local"], "domains": ["api.mytrustedservice.com"], "commands": ["curl -X POST https://api.mytrustedservice.com/webhook"] } 用户允许列表与内置 iocs.json 允许列表(涵盖 api.anthropic.com、github.com、api.github.com、raw.githubusercontent.com、registry.npmjs.org、pypi.org、files.pythonhosted.org)叠加。已确认事件的已知恶意域名永不可覆盖。

八、拦截后的处理 当 deny 触发时,Claude Code 显示 “🛡️ MCP Sentinel blocked a <tool> call.”。这仅发生于已确认的恶意指示器,不可加入允许列表。此时应:用通俗语言解释原因,尽可能指出发起调用的技能/MCP,并建议用户(a)卸载相关技能或(b)用 v1 深度扫描进一步调查。不要建议加入允许列表。 当 ask 触发时,Claude Code 显示原生权限提示并附 “🛡️ MCP Sentinel flagged a <tool> call” 原因。用户选择允许或拒绝。应帮助判断:解释检测到什么以及是哪个技能/MCP 发起调用。若用户批准且涉及路径或域名,PostToolUse 钩子会自动加入允许列表,不再询问,因此主动批准即是信任决定。若拒绝则不记忆,下次再问。绝不施压要求批准;对任何不熟悉的内容,拒绝是安全默认。

九、核心工作流 步骤 1:发现已安装内容。扫描项目与系统中的技能和 MCP 服务器,位置包括项目级的 .claude/settings.json(MCP 配置)、.claude/skills/(已安装技能)、.mcp.json(备选 MCP 配置),以及用户级的 ~/.claude/settings.json、~/.claude/skills/。对每个技能/MCP 提取名称与版本、来源、请求的权限、嵌入 .md 文件中的 shell 命令,构建清单并展示给用户。 步骤 2:比对威胁情报来源(对每种扫描模式均为强制步骤)。即使已看到恶意代码,仍需检索外部来源,因为可能存在关于该技能的已知事件、CVE 或社区报告。比对来源包括 GitHub Advisory Database、漏洞数据库(vulnerablemcp.info、mcpscan.ai)、Snyk / 安全研究、社区预警(Reddit r/ClaudeAI)、通用 CVE 检索。 步骤 3:技能文件静态分析。读取每个技能的 SKILL.md 及捆绑脚本,标记关键、高风险、中风险模式。 步骤 3b:一致性分析——判断技能中的一切都与其声称用途相符吗。这是最强力的检测方法之一,可发现单纯模式匹配遗漏的攻击。方法:识别技能声明的目的;对每个动作询问“这对该目的是否合理”(重点检查网络请求、文件访问范围、数据流向、权限级别、依赖项),并给出一致性表格。 步骤 3c:更新差异分析——判断自上次以来发生了什么变化,用于捕获供应链投毒,即技能长期安全后在某次更新中夹带恶意代码。