跳转到内容

MCP 安全注意事项

当把 MCP(Model Context Protocol)这类外部服务集成到 CrewAI 代理中时,安全性至关重要。 MCP 服务器可以根据其暴露的工具执行代码、访问数据,或与其他系统交互。 你必须理解这些影响,并遵循最佳实践来保护应用和数据。

  • 在代理运行的机器上执行任意代码(尤其是使用 Stdio 传输时,如果服务器可以控制所执行的命令)。
  • 暴露代理或其运行环境中的敏感数据。
  • 以非预期方式操控代理行为,包括代表你发起未经授权的 API 调用。
  • 通过复杂的提示注入技术劫持代理的推理过程(见下文)。

在配置 MCPServerAdapter 连接某个 MCP 服务器之前,请先确认你知道:

  • 谁在运营这台服务器? 它是可信、知名的服务,还是你自己控制的内部服务器?
  • 它暴露了哪些工具? 了解这些工具的能力。若攻击者接管服务器,或者服务器本身恶意,这些工具会被如何滥用?
  • 它访问或处理哪些数据? 你要清楚哪些敏感信息可能会被发送到 MCP 服务器或由其处理。

避免连接未知或未验证的 MCP 服务器,尤其是在代理需要处理敏感任务或数据时。

2. 通过工具元数据进行安全提示注入:“模型控制协议” 风险

Section titled “2. 通过工具元数据进行安全提示注入:“模型控制协议” 风险”

一个重要但隐蔽的风险,是通过工具元数据进行提示注入的可能性。其工作方式如下:

  1. 当 CrewAI 代理连接到 MCP 服务器时,通常会请求可用工具列表。
  2. MCP 服务器会返回每个工具的元数据,包括名称、描述和参数描述。
  3. 代理底层的语言模型(LLM)会使用这些元数据来理解何时以及如何使用这些工具。这些元数据通常会被纳入 LLM 的系统提示或上下文中。
  4. 恶意 MCP 服务器可以在工具元数据(名称、描述)中嵌入隐藏或显式指令。这些指令可作为提示注入,实际上是在告诉你的 LLM 以某种方式行为、泄露敏感信息或执行恶意动作。

关键在于,即使你的代理从未明确决定使用这些工具,只要连接到恶意服务器并列出其工具,这种攻击就可能发生。 仅仅接触这些恶意元数据,就可能足以破坏代理行为。

缓解措施:

  • 对不受信任的服务器保持极端谨慎: 再强调一次:不要连接到你无法完全信任的 MCP 服务器。 元数据注入的风险使这一点尤为重要。

Stdio(标准输入/输出)传输通常用于与运行在同一台机器上的本地 MCP 服务器通信。

  • 进程隔离:虽然通常更安全,因为默认不涉及网络暴露,但仍要确保 StdioServerParameters 运行的脚本或命令来自可信来源,并具有合适的文件系统权限。恶意的 Stdio 服务器脚本仍可能损害你的本地系统。
  • 输入清理:如果你的 Stdio 服务器脚本接受来自代理交互的复杂输入,请确保脚本本身会清理这些输入,以防止脚本逻辑中的命令注入或其他漏洞。
  • 资源限制:要注意,本地 Stdio 服务器进程会消耗本地资源(CPU、内存)。请确保它行为良好,不会耗尽系统资源。

困惑代理问题 是一个经典安全漏洞,在 MCP 集成中也可能出现,尤其是当 MCP 服务器充当其他第三方服务(例如使用 OAuth 2.0 授权的 Google Calendar、GitHub)的代理时。

场景:

  1. 一个 MCP 服务器(假设叫做 MCP-Proxy)允许你的代理与 ThirdPartyAPI 交互。
  2. MCP-Proxy 在与 ThirdPartyAPI 的授权服务器通信时,使用其自己的单一静态 client_id
  3. 你作为用户,合法授权 MCP-Proxy 代表你访问 ThirdPartyAPI。在此过程中,ThirdPartyAPI 的授权服务器可能会在浏览器中设置一个 cookie,表示你已同意 MCP-Proxyclient_id
  4. 攻击者构造一个恶意链接。该链接会触发与 MCP-Proxy 的 OAuth 流程,但目的是欺骗 ThirdPartyAPI 的授权服务器。
  5. 如果你点击了这个链接,而 ThirdPartyAPI 的授权服务器看到了你之前为 MCP-Proxyclient_id 授予的同意 cookie,它可能会跳过再次征求你的同意。
  6. MCP-Proxy 随后可能被诱导将 ThirdPartyAPI 的授权码转发给攻击者,或者转发一个攻击者可用于冒充你访问 MCP-Proxy 的 MCP 授权码。

缓解措施(主要针对 MCP 服务器开发者):

  • 使用静态 client ID 连接下游服务的 MCP 代理服务器,必须在启动 OAuth 流程前,针对每个连接的客户端应用或代理,获取明确的用户同意。这意味着 MCP-Proxy 自身应该显示同意页面。

CrewAI 用户的影响:

  • 如果某个 MCP 服务器会将你重定向去完成多个 OAuth 授权,尤其当流程看起来意外或请求的权限过于宽泛时,要格外小心。
  • 优先选择那些能够清晰区分自身身份与其可能代理的第三方服务的 MCP 服务器。

远程传输安全(SSE 与 Streamable HTTP)

Section titled “远程传输安全(SSE 与 Streamable HTTP)”

通过 Server-Sent Events(SSE)或 Streamable HTTP 连接远程 MCP 服务器时,标准的 Web 安全实践必不可少。

a. DNS 重绑定攻击(尤其针对 SSE)

Section titled “a. DNS 重绑定攻击(尤其针对 SSE)”

DNS 重绑定允许攻击者控制的网站绕过同源策略,向用户本地网络上的服务器(如 localhost)或内网发起请求。如果你在本地运行 MCP 服务器(例如用于开发),并且代理运行在类似浏览器的环境中(虽然这在典型的 CrewAI 后端部署中较少见),或者 MCP 服务器位于内部网络中,这就尤其危险。

MCP 服务器实现者的缓解策略:

  • 验证 OriginHost 标头:MCP 服务器(尤其是 SSE 服务器)应验证 Origin 和/或 Host HTTP 标头,以确保请求来自预期的域名/客户端。
  • 绑定到 localhost(127.0.0.1):在本地运行 MCP 服务器进行开发时,应将其绑定到 127.0.0.1,而不是 0.0.0.0。这可以防止同一网络上的其他机器访问它。
  • 身份验证:如果 MCP 服务器不打算公开匿名访问,则应为所有连接要求身份验证。
  • 加密传输中的数据:远程 MCP 服务器的 URL 始终应使用 HTTPS(HTTP Secure)。这会加密 CrewAI 应用与 MCP 服务器之间的通信,防止窃听和中间人攻击。MCPServerAdapter 会遵循 URL 中提供的协议(httphttps)。

这主要是 MCP 服务器开发者需要关注的问题,但理解它有助于选择更安全的服务器。

“令牌透传”指的是 MCP 服务器接受来自 CrewAI 代理的访问令牌(该令牌可能是另一个服务,比如 ServiceA 的令牌),然后未经适当验证就将其直接传递给下游 API(ServiceB)。具体来说,ServiceB(或 MCP 服务器本身)应只接受明确为其签发的令牌(也就是令牌中的 audience claim 与服务器/服务匹配)。

风险:

  • 绕过 MCP 服务器或下游 API 的安全控制(如速率限制或细粒度权限)。
  • 破坏审计轨迹和责任归属。
  • 允许滥用被盗令牌。

缓解措施(针对 MCP 服务器开发者):

  • MCP 服务器绝不应接受未明确为其签发的令牌。它们必须验证令牌的 audience claim。

CrewAI 用户的影响:

  • 虽然用户无法直接控制这一点,但这强调了连接设计良好、遵循安全最佳实践的 MCP 服务器的重要性。
  • 验证身份:如果 MCP 服务器提供敏感工具或私有数据访问,则必须实现强身份验证机制来验证客户端(你的 CrewAI 应用)的身份。这可以通过 API key、OAuth 令牌或其他标准方法实现。
  • 最小权限原则:确保 MCPServerAdapter 使用的凭证(如果有)仅具有访问所需工具的必要权限。
  • 输入验证至关重要:MCP 服务器在处理或将输入传给工具之前,必须严格验证来自代理的所有输入。这是防御许多常见漏洞的主要手段:
    • 命令注入: 如果某个工具根据输入构造 shell 命令、SQL 查询或其他解释型语言语句,服务器必须仔细清理这些输入,以防止恶意命令被注入并执行。
    • 路径遍历: 如果某个工具根据输入参数访问文件,服务器必须验证并清理这些路径,以防止访问未授权的文件或目录(例如阻止 ../ 序列)。
    • 数据类型与范围检查: 服务器必须确保输入数据符合预期的数据类型(如字符串、数字、布尔值),并落在可接受范围内,或符合定义好的格式(如 URL 的正则表达式)。
    • JSON Schema 验证: 所有工具参数都应严格按照其定义的 JSON schema 进行验证,这有助于尽早发现格式错误的请求。
  • 客户端侧意识:虽然服务器端验证最为关键,但作为 CrewAI 用户,你也应留意代理会发送给 MCP 工具的数据,尤其是在与较不受信任或新接入的 MCP 服务器交互时。
  • 防止滥用:MCP 服务器应实施速率限制,以防止有意的(拒绝服务攻击)或无意的滥用(例如配置错误的代理发出过多请求)。
  • 客户端重试:如果预期会出现短暂的网络问题或服务器限流,请在 CrewAI 任务中实现合理的重试逻辑,但避免激进重试导致服务器负载进一步恶化。

4. 安全的 MCP 服务器实现建议(针对开发者)

Section titled “4. 安全的 MCP 服务器实现建议(针对开发者)”

如果你正在开发 CrewAI 代理可能连接的 MCP 服务器,除了以上内容,还应考虑以下最佳实践:

  • 遵循安全编码实践:遵守所选语言和框架的标准安全编码原则(例如 OWASP Top 10)。
  • 最小权限原则:确保运行 MCP 服务器的进程(尤其是 Stdio 场景)只拥有最少的必要权限。工具本身也应以完成任务所需的最小权限运行。
  • 依赖管理:保持所有服务端依赖(包括操作系统包、语言运行时和第三方库)为最新版本,以修复已知漏洞。使用工具扫描易受攻击的依赖。
  • 安全默认值:让服务器及其工具默认安全。例如,可能存在风险的功能应默认关闭,或必须显式启用并附带清晰警告。
  • 工具访问控制:实现稳健机制,控制哪些已认证、已授权的代理或用户可以访问特定工具,尤其是那些强大、敏感或会产生费用的工具。
  • 安全错误处理:服务器不应向客户端暴露详细的内部错误信息、堆栈跟踪或调试信息,因为这些信息可能泄露内部实现或潜在漏洞。应在服务端完整记录错误以便诊断。
  • 全面日志与监控:记录安全相关事件的详细日志(例如认证尝试、工具调用、错误、授权变更)。监控这些日志,以发现可疑活动或滥用模式。
  • 遵守 MCP 授权规范:如果实现身份验证和授权,请严格遵循 MCP Authorization specification 以及相关的 OAuth 2.0 security best practices
  • 定期安全审计:如果你的 MCP 服务器处理敏感数据、执行关键操作或面向公网暴露,建议由合格专业人员定期进行安全审计。

如需更详细的 MCP 安全信息,请参考官方文档:

通过理解这些安全注意事项并落实最佳实践,你就能在 CrewAI 项目中安全地利用 MCP 服务器的能力。 这些内容并不穷尽,但涵盖了最常见且最关键的安全问题。 威胁会持续演变,因此持续关注并相应调整安全措施非常重要。