第三方 MCP server 被供应链攻破

已信任的 MCP server 包或版本被植入恶意代码——通过版本锁定、代码审计和运行时沙箱检测并隔离供应链攻击对 Agent 环境的影响。

运维告警:一个本月刚升级的 MCP server 包开始向未知外部 IP 发出 DNS 查询,或者 npm audit 报告某个已信任的 MCP server 依赖链中包含了被标记为恶意的包版本。供应链攻击通过在已建立信任的包里植入恶意代码来绕过人工审查——开发者不会每次升级都仔细阅读数百行变更,攻击者就利用这个信任假设。MCP server 因为直接集成进 Agent 的工具调用链,一旦被攻破,攻击者可以修改工具行为、窃取 context 数据或在 Agent 的执行环境里运行任意代码。

常见原因

1. 依赖版本未锁定,自动更新引入了恶意版本

package.json 里使用了 "^1.2.0""~1.2.0" 这样的范围版本,npm install 会自动安装最新的兼容版本,若该版本被植入恶意代码,下次部署就会引入。

怎么判断:检查 package.json 中 MCP server 依赖是否使用了精确版本("1.2.3" 而非 "^1.2.3"),以及 package-lock.json 是否提交到代码仓库并用于生产安装。

2. 包发布者账号被接管

攻击者通过钓鱼或凭证泄露取得了 MCP server 维护者在 npm 或 PyPI 上的账号,发布了带恶意代码的新版本。包名和维护者显示正常,只有代码内容发生了变化。

怎么判断:对比当前安装版本和上一个已知安全版本的 diff(npm pack 后解压对比),重点检查 postinstall 脚本、网络请求相关代码和文件系统操作。

3. 依赖链中的间接依赖被攻破

直接依赖的 MCP server 本身安全,但其某个深层依赖被替换为恶意版本。npm audit 可能检测到,也可能因为是新发布版本而尚未被收录。

怎么判断:运行 npm audit --all 查看完整依赖树的安全报告,并用 npm ls 检查深层依赖的具体版本。

4. MCP server 在安装时运行了 postinstall 脚本

npm 包的 postinstall 生命周期脚本在安装时自动运行,可以执行任意代码。恶意包利用这个机制在安装时就开始收集环境信息或下载额外的恶意载荷。

怎么判断:检查已安装的 MCP server 包的 package.json,查看是否有 scripts.postinstall 字段。若有,审查该脚本的内容。

5. 没有对 MCP server 的出站网络请求做限制

MCP server 运行在与 Agent 相同的网络环境中,可以自由发出出站请求。一旦被攻破,可以把窃取的数据(context、密钥、文件内容)发送到攻击者的服务器。

怎么判断:检查 MCP server 的运行环境是否有出站请求限制(防火墙规则、egress 策略),以及是否有对 MCP server 进程出站请求的监控。

6. 缺少代码完整性校验

部署流程只校验包名和版本,不校验代码的哈希值。同一版本号的包可以被不同的 .tgz 文件替代(tarball 替换攻击)。

怎么判断:检查 package-lock.json 里是否有每个包的 integrity 哈希(sha512-...),并确认安装时校验了这个哈希。

最短修复路径

Step 1: 锁定精确版本并校验完整性哈希

# 使用精确版本安装
npm install --save-exact @modelcontextprotocol/server-filesystem@1.2.3

# 验证 package-lock.json 包含 integrity 字段
cat package-lock.json | jq '.packages["node_modules/@modelcontextprotocol/server-filesystem"].integrity'

# 在 CI 中使用 ci 命令(而非 install),强制使用 lock 文件
npm ci

Step 2: 审查新版本的代码 diff

# 下载两个版本的包并对比
npm pack @modelcontextprotocol/server-filesystem@1.2.2
npm pack @modelcontextprotocol/server-filesystem@1.2.3

mkdir old new
tar xzf modelcontextprotocol-server-filesystem-1.2.2.tgz -C old
tar xzf modelcontextprotocol-server-filesystem-1.2.3.tgz -C new

# 重点检查网络请求、文件系统操作和 postinstall 脚本
diff -r old new | grep -E "(fetch|http|axios|request|fs\.|child_process|postinstall)" | head -40

Step 3: 用网络策略隔离 MCP server 进程

# Kubernetes NetworkPolicy 示例:只允许 MCP server 访问指定内部 API
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: mcp-server-egress
spec:
  podSelector:
    matchLabels:
      app: mcp-server
  policyTypes:
    - Egress
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/8  # 只允许内网
      ports:
        - protocol: TCP
          port: 443

Step 4: 用 npm audit 做自动化扫描

# 在 CI pipeline 中加入安全扫描步骤
npm audit --audit-level=high

# 若有告警则失败
if npm audit --audit-level=high; then
  echo "安全扫描通过"
else
  echo "发现高危漏洞,停止部署" >&2
  exit 1
fi

Step 5: 用 subresource integrity 校验前端加载的 MCP 相关脚本

<!-- 对前端加载的 MCP 相关 JS 添加 integrity 属性 -->
<script
  src="https://cdn.example.com/mcp-client@1.2.3/dist/index.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
  crossorigin="anonymous"
></script>

预防建议

  • 对所有 MCP server 依赖使用精确版本号,并把 package-lock.json 提交到代码仓库。
  • 在 CI/CD pipeline 中使用 npm ci 而不是 npm install,确保安装与 lock 文件严格一致。
  • 每次升级 MCP server 版本前,审查变更 diff,重点关注网络请求、文件系统操作和生命周期脚本。
  • 使用 npm auditsnyk 等工具对完整依赖树做定期安全扫描,并在 CI 中设置高危漏洞时构建失败。
  • 为 MCP server 进程配置网络 egress 策略,只允许访问预先定义的内部服务,阻断对外网的任意出站请求。
  • 对 MCP server 运行环境做文件系统保护,限制其只能访问特定目录,防止窃取环境变量文件和密钥。
  • 订阅你使用的 MCP server 包的安全公告(GitHub Security Advisories、npm advisories)。
  • 建立内部包镜像,只允许安装经过内部审查的包版本,不直接从公共 npm 注册表安装。

常见问答 (FAQ)

Q: 如何快速判断当前安装的 MCP server 是否已被攻破? A: 对比当前安装版本与该包在 GitHub 上对应 tag 的代码(npm pack 解压后与 git diff vX.Y.Z 对比),重点检查安装脚本、出站请求代码和任何在 tool description 里注入指令的字符串。

Q: 使用私有 npm 注册表能防止供应链攻击吗? A: 能显著降低风险,但不能完全消除。私有注册表需要配合代码审查流程——所有进入私有镜像的包都应经过至少一名安全意识强的工程师审查。

Q: 发现 MCP server 被攻破后如何响应? A: 立即停止使用该 server(下线相关 Agent 实例),轮转在该 server 运行期间可能被访问的所有密钥,审查 Agent 在此期间的所有工具调用日志,评估是否有数据被外发,然后再进行降级或替换。

Q: 如何评估一个新的 MCP server 的供应链风险? A: 检查包的下载量和维护历史(新包风险更高)、维护者数量(单一维护者风险较高)、最近发布频率(短期内大量版本是异常信号)以及是否有知名机构背书。可以用 npx is-website-vulnerable 或 Socket.dev 等工具做自动化评估。

相关阅读

标签: #ai-security #prompt-injection #排查