跳转到主要内容

概述

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 服务器充当其他第三方服务(例如,Google 日历、GitHub)的代理,这些服务使用 OAuth 2.0 进行授权时。 场景:
  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 服务器时,标准网络安全实践至关重要。

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 服务器本身)应该只接受明确为其颁发的令牌(即,令牌中的“受众”声明与服务器/服务匹配)。 风险:
  • 绕过 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 服务器的强大功能。这些绝非详尽无遗,但它们涵盖了最常见和最关键的安全问题。威胁将继续演变,因此保持信息灵通并相应调整您的安全措施至关重要。