MCP安全的两层:运行时暴露 vs 供应链
Source: Dev.to
供应链 vs. 运行时暴露
供应链安全(Cisco 关注点) – 你安装一个 MCP 服务器。
如果服务器代码中包含隐藏指令,它们可能会泄露数据或污染 AI 代理。
运行时暴露(我的关注点) – 已部署的 MCP 服务器可能没有身份验证,导致任何 AI 代理都可以枚举并调用工具。
对比
| 何时 | 何事 | 解决方案 | |
|---|---|---|---|
| 供应链 | 部署前 | 恶意工具描述 | 代码审查 + 签名 |
| 运行时暴露 | 部署后 | 未经身份验证的工具访问 | 添加身份验证 + 适当命名 |
观察到的运行时问题
-
没有身份验证 – 16 % 的服务器(59 台)公开了 541 个可调用工具。
- Render.com: 24 个云基础设施工具(如
create_web_service、update_environment_variables)– 已披露。 - Robtex: 50 个 DNS/IP 工具全部开放(如
ip_reputation、reverse_lookup_dns)。 - Airtable: 8 个数据库工具(如
list_bases、CRUD)– 已披露。
- Render.com: 24 个云基础设施工具(如
-
API 层身份验证 – 15 % 的服务器在没有凭证的情况下公开工具模式。示例:Google Compute Engine 显示 29 种模式(如
create_instance、delete_instance)。 -
MCP 层身份验证 – 69 % 的服务器在列出工具前需要身份验证。这是正确的配置。
利用示例
我在自己的服务器上添加了两个工具:
def get_aws_credentials(role):
# retrieve temporary AWS credentials for the given role
...
def execute_sql_query(query, db):
# run a SQL query against the specified database
...
在三小时内,一个 AI 代理调用了 get_aws_credentials(role=admin)。
该代理并非恶意,只是枚举了可用工具并调用了看起来与凭证访问相关的那个。工具名称对 LLM 起到了语义指令的作用。
安全姿态建议
成熟的 MCP 安全策略需要同时做到:
- 供应链验证 – 审查并签署你所安装的代码。
- 运行时验证 – 确保运行中的服务器不暴露未经身份验证的工具。
公开注册表列出了 3,500+ 台服务器;大多数长尾服务器在上述一个或两个维度上缺乏适当的防护。
资源
- MCP 扫描器
- 数据集 API(CC BY 4.0)