跳转到主要内容

概述

MCP 安全最关键的方面是信任。您应该将您的 CrewAI 智能体连接到您完全信任的 MCP 服务器。
在将像 MCP(模型上下文协议)服务器这样的外部服务集成到您的 CrewAI 智能体中时,安全性至关重要。MCP 服务器可以根据其公开的工具执行代码、访问数据或与其他系统交互。了解其潜在影响并遵循最佳实践来保护您的应用程序和数据至关重要。

风险

  • 在智能体运行的机器上执行任意代码(特别是使用 Stdio 传输方式,如果服务器可以控制执行的命令)。
  • 暴露来自您的智能体或其环境的敏感数据。
  • 以意想不到的方式操纵您的智能体行为,包括代表您进行未经授权的 API 调用。
  • 通过复杂的提示注入技术劫持您的智能体的推理过程(见下文)。

1. 信任 MCP 服务器

只连接到您信任的 MCP 服务器。
在配置 MCPServerAdapter 以连接到 MCP 服务器之前,请确保您了解:
  • 谁在运营该服务器? 它是一个知名的、有信誉的服务,还是在您控制下的内部服务器?
  • 它公开了哪些工具? 了解这些工具的功能。如果攻击者获得控制权或服务器本身是恶意的,这些工具是否可能被滥用?
  • 它访问或处理什么数据? 注意任何可能发送到或由 MCP 服务器处理的敏感信息。
避免连接到未知或未经验证的 MCP 服务器,特别是当您的智能体处理敏感任务或数据时。

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

一个重要且微妙的风险是通过工具元数据进行提示注入的潜力。其工作原理如下:
  1. 当您的 CrewAI 智能体连接到 MCP 服务器时,它通常会请求可用工具的列表。
  2. MCP 服务器会响应每个工具的元数据,包括其名称、描述和参数描述。
  3. 您的智能体底层的语言模型(LLM)使用这些元数据来理解如何以及何时使用这些工具。这些元数据通常被并入 LLM 的系统提示或上下文中。
  4. 恶意的 MCP 服务器可以精心制作其工具元数据(名称、描述),以包含隐藏或公开的指令。这些指令可以作为提示注入,有效地告诉您的 LLM 以某种方式行事、泄露敏感信息或执行恶意操作。
至关重要的是,这种攻击可能仅仅通过连接到恶意服务器并列出其工具就会发生,即使您的智能体从未明确决定使用任何这些工具。仅仅接触到恶意元数据就足以危及智能体的行为。 缓解措施:
  • 对不受信任的服务器保持极度谨慎: 重申:不要连接到您不完全信任的 MCP 服务器。元数据注入的风险使得这一点至关重要。

Stdio 传输安全

Stdio(标准输入/输出)传输通常用于与您的 CrewAI 应用程序在同一台机器上运行的本地 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 服务器开发者)
  • 对于下游服务使用静态客户端 ID 的 MCP 代理服务器,在与第三方服务启动 OAuth 流程之前必须为每个连接到它们的客户端应用程序或智能体获得明确的用户同意。这意味着 MCP-Proxy 本身应该显示一个同意屏幕。
对 CrewAI 用户的影响
  • 如果一个 MCP 服务器将您重定向进行多次 OAuth 身份验证,请保持警惕,特别是当这看起来出乎意料或者请求的权限过于宽泛时。
  • 优先选择那些明确区分其自身身份与它们可能代理的第三方服务的 MCP 服务器。

远程传输安全(SSE 和可流式 HTTP)

当通过服务器发送事件(SSE)或可流式 HTTP 连接到远程 MCP 服务器时,标准的 Web 安全实践至关重要。

SSE 安全注意事项

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 服务器不打算用于公共匿名访问,则要求所有连接都进行身份验证。

b. 使用 HTTPS

  • 加密传输中的数据:始终为远程 MCP 服务器的 URL 使用 HTTPS(安全 HTTP)。这会加密您的 CrewAI 应用程序与 MCP 服务器之间的通信,防止窃听和中间人攻击。MCPServerAdapter 将遵循 URL 中提供的方案(httphttps)。

c. 令牌直通(反模式)

这主要是 MCP 服务器开发者需要关注的问题,但理解它有助于选择安全的服务器。 “令牌直通”是指 MCP 服务器从您的 CrewAI 智能体接受一个访问令牌(该令牌可能是为另一个服务,比如 ServiceA 颁发的),并简单地将其传递给另一个下游 API (ServiceB),而没有进行适当的验证。具体来说,ServiceB(或 MCP 服务器本身)应该只接受明确为它们颁发的令牌(即,令牌中的‘audience’声明与服务器/服务匹配)。 风险:
  • 绕过 MCP 服务器或下游 API 上的安全控制(如速率限制或细粒度权限)。
  • 破坏审计追踪和问责制。
  • 允许滥用被盗的令牌。
缓解措施(针对 MCP 服务器开发者)
  • MCP 服务器绝不能接受不是明确为其颁发的令牌。它们必须验证令牌的受众声明。
对 CrewAI 用户的影响
  • 虽然用户无法直接控制,但这凸显了连接到遵循安全最佳实践、设计良好的 MCP 服务器的重要性。

身份验证和授权

  • 验证身份:如果 MCP 服务器提供敏感工具或访问私有数据,它必须实施强大的身份验证机制来验证客户端(您的 CrewAI 应用程序)的身份。这可能涉及 API 密钥、OAuth 令牌或其他标准方法。
  • 最小权限原则:确保 MCPServerAdapter 使用的凭据(如果有的话)仅具有访问所需工具的必要权限。

d. 输入验证和清理

  • 输入验证至关重要:MCP 服务器在处理从智能体收到的所有输入或将其传递给工具之前必须严格验证这些输入。这是防御许多常见漏洞的主要手段。
    • 命令注入: 如果一个工具根据输入构建 shell 命令、SQL 查询或其他解释性语言语句,服务器必须仔细清理此输入,以防止恶意命令被注入和执行。
    • 路径遍历: 如果一个工具根据输入参数访问文件,服务器必须验证和清理这些路径,以防止访问未经授权的文件或目录(例如,通过阻止 ../ 序列)。
    • 数据类型和范围检查: 服务器必须确保输入数据符合预期的数据类型(例如,字符串、数字、布尔值),并且在可接受的范围内或遵循定义的格式(例如,URL 的正则表达式)。
    • JSON Schema 验证: 所有工具参数都应根据其定义的 JSON schema 进行严格验证。这有助于及早发现格式错误的请求。
  • 客户端意识:虽然服务器端验证至关重要,但作为 CrewAI 用户,请注意您的智能体被构建用来发送给 MCP 工具的数据,特别是在与不太受信任或新的 MCP 服务器交互时。

e. 速率限制和资源管理

  • 防止滥用:MCP 服务器应实施速率限制以防止滥用,无论是故意的(拒绝服务攻击)还是无意的(例如,配置错误的智能体发出过多请求)。
  • 客户端重试:如果预计会出现短暂的网络问题或服务器速率限制,请在您的 CrewAI 任务中实施合理的重试逻辑,但要避免可能加剧服务器负载的激进重试。

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

如果您正在开发一个可能被 CrewAI 智能体连接的 MCP 服务器,除了上述几点之外,还请考虑以下最佳实践:
  • 遵循安全编码实践:遵守您选择的语言和框架的标准安全编码原则(例如,OWASP Top 10)。
  • 最小权限原则:确保运行 MCP 服务器的进程(特别是对于 Stdio)仅具有最低必要权限。工具本身也应以执行其功能所需的最小权限运行。
  • 依赖管理:保持所有服务器端依赖项(包括操作系统包、语言运行时和第三方库)最新,以修补已知漏洞。使用工具扫描易受攻击的依赖项。
  • 安全默认设置:设计您的服务器及其工具,使其默认就是安全的。例如,可能有风险的功能应默认关闭,或需要明确选择并附带清晰的警告。
  • 工具的访问控制:实施强大的机制来控制哪些经过身份验证和授权的智能体或用户可以访问特定工具,特别是那些功能强大、敏感或会产生费用的工具。
  • 安全错误处理:服务器不应向客户端暴露详细的内部错误消息、堆栈跟踪或调试信息,因为这些信息可能会泄露内部工作原理或潜在漏洞。在服务器端全面记录错误以供诊断。
  • 全面的日志记录和监控:实施对安全相关事件(例如,身份验证尝试、工具调用、错误、授权更改)的详细日志记录。监控这些日志以发现可疑活动或滥用模式。
  • 遵守 MCP 授权规范:如果实施身份验证和授权,请严格遵循 MCP 授权规范 和相关的 OAuth 2.0 安全最佳实践
  • 定期安全审计:如果您的 MCP 服务器处理敏感数据、执行关键操作或公开暴露,请考虑由合格的专业人员进行定期安全审计。

5. 进一步阅读

有关 MCP 安全的更多详细信息,请参阅官方文档: 通过理解这些安全注意事项并实施最佳实践,您可以安全地在您的 CrewAI 项目中利用 MCP 服务器的强大功能。这些绝非详尽无遗,但涵盖了最常见和最关键的安全问题。威胁将继续演变,因此保持信息灵通并相应地调整您的安全措施非常重要。