主题
MCP 安全注意事项
了解在将 MCP 服务器与 CrewAI 智能体集成时的重要安全最佳实践。
概述
WARNING
MCP 安全最关键的方面是信任。你应当只将 CrewAI 智能体连接到完全信任的 MCP 服务器。
将 MCP(Model Context Protocol)服务器等外部服务集成到 CrewAI 智能体时,安全至关重要。 MCP 服务器可以根据其暴露的工具执行代码、访问数据或与其他系统交互。 理解其影响并遵循最佳实践以保护你的应用和数据至关重要。
风险
- 在智能体运行的机器上执行任意代码(尤其是在
Stdio传输下,如果服务器能够控制所执行的命令)。 - 泄露智能体或其环境中的敏感数据。
- 以非预期方式操纵智能体的行为,包括代表你发起未经授权的 API 调用。
- 通过复杂的提示词注入技术劫持智能体的推理过程(见下文)。
1. 信任 MCP 服务器
WARNING
只连接你信任的 MCP 服务器。
在配置 MCPServerAdapter 连接 MCP 服务器之前,请确保你了解:
- 谁在运营该服务器? 它是知名的、信誉良好的服务,还是你控制的内部服务器?
- 它暴露了哪些工具? 了解这些工具的能力。如果攻击者取得控制权,或服务器本身是恶意的,它们是否可能被滥用?
- 它访问或处理哪些数据? 注意可能发送给 MCP 服务器或由其处理的任何敏感信息。
避免连接未知或未经验证的 MCP 服务器,尤其是当你的智能体处理敏感任务或数据时。
2. 通过工具元数据实施提示词注入:“模型控制协议”风险
一个重大而隐蔽的风险是可能通过工具元数据实施提示词注入。其运作方式如下:
- 当你的 CrewAI 智能体连接到 MCP 服务器时,它通常会请求可用工具列表。
- MCP 服务器会返回每个工具的元数据,包括其名称、描述和参数描述。
- 智能体底层的语言模型(LLM)使用这些元数据来理解如何以及何时使用这些工具。这些元数据通常会被纳入 LLM 的系统提示词或上下文中。
- 恶意 MCP 服务器可以精心构造其工具元数据(名称、描述),在其中嵌入隐藏或明显的指令。这些指令可充当提示词注入,实际上是在告诉你的 LLM 以某种方式行事、泄露敏感信息或执行恶意操作。
关键在于,仅仅连接到恶意服务器并列出其工具,即使你的智能体从未明确决定使用其中任何工具,这种攻击也可能发生。 仅仅暴露于恶意元数据就足以使智能体的行为受到破坏。
缓解措施:
- 对不受信任的服务器保持极度谨慎: 再次强调:不要连接你并不完全信任的 MCP 服务器。 元数据注入的风险使这一点至关重要。
Stdio 传输安全
Stdio(标准输入/输出)传输通常用于与 CrewAI 应用运行在同一台机器上的本地 MCP 服务器。
- 进程隔离:虽然它默认不涉及网络暴露,因而通常更安全,但仍需确保
StdioServerParameters运行的脚本或命令来自可信来源,并具有适当的文件系统权限。恶意的 Stdio 服务器脚本仍可能损害你的本地系统。 - 输入清理:如果你的 Stdio 服务器脚本接收源自智能体交互的复杂输入,请确保脚本自身会对这些输入进行清理,以防止脚本逻辑内的命令注入或其他漏洞。
- 资源限制:请注意,本地 Stdio 服务器进程会消耗本地资源(CPU、内存)。确保其行为良好,不会耗尽系统资源。
混淆代理攻击
混淆代理问题是一种经典的安全漏洞,可能在 MCP 集成中出现,尤其是当 MCP 服务器充当其他第三方服务(例如 Google Calendar、GitHub)的代理,而这些服务使用 OAuth 2.0 进行授权时。
场景:
- 一个 MCP 服务器(我们称之为
MCP-Proxy)允许你的智能体与ThirdPartyAPI交互。 MCP-Proxy在与ThirdPartyAPI的授权服务器通信时,使用自己单一的静态client_id。- 作为用户,你合法地授权
MCP-Proxy代表你访问ThirdPartyAPI。在此过程中,ThirdPartyAPI的认证服务器可能会在你的浏览器中设置一个 cookie,表明你同意MCP-Proxy的client_id。 - 攻击者构造一个恶意链接。该链接会与
MCP-Proxy发起 OAuth 流程,但其目的是欺骗ThirdPartyAPI的认证服务器。 - 如果你点击此链接,而
ThirdPartyAPI的认证服务器看到你已有的针对MCP-Proxy的client_id的同意 cookie,它可能跳过再次征求你的同意。 - 随后,
MCP-Proxy可能被诱骗将(针对ThirdPartyAPI的)授权码转发给攻击者,或转发一个 MCP 授权码,使攻击者能以你的身份向MCP-Proxy冒充你。
缓解措施(主要面向 MCP 服务器开发者):
- 为下游服务使用静态 client ID 的 MCP 代理服务器必须在与第三方服务发起 OAuth 流程之前,就为每个连接它的客户端应用或智能体获得明确的用户同意。这意味着
MCP-Proxy本身应显示同意屏幕。
对 CrewAI 用户的影响:
- 如果 MCP 服务器将你重定向到多次 OAuth 身份认证,请保持警惕,尤其是当这看起来出乎意料,或请求的权限过于宽泛时。
- 优先选择能清晰区分自身身份与其可能代理的第三方服务的 MCP 服务器。
远程传输安全(SSE 与 Streamable HTTP)
通过 Server-Sent Events(SSE)或 Streamable HTTP 连接远程 MCP 服务器时,标准的 Web 安全实践至关重要。
SSE 安全注意事项
a. DNS 重绑定攻击(尤其针对 SSE)
DANGER
防范 DNS 重绑定攻击。
DNS 重绑定允许攻击者控制的网站绕过同源策略,向用户本地网络(例如 localhost)或内网中的服务器发起请求。如果你在本地运行 MCP 服务器(例如用于开发),且在类似浏览器的环境中运行智能体(尽管这在典型的 CrewAI 后端配置中不太常见),或者 MCP 服务器位于内网中,这种风险尤其高。
面向 MCP 服务器实现者的缓解策略:
- 校验
Origin和Host头:MCP 服务器(尤其是 SSE 服务器)应校验Origin和/或HostHTTP 头,确保请求来自预期的域名/客户端。 - 绑定到
localhost(127.0.0.1):在本地为开发运行 MCP 服务器时,将其绑定到127.0.0.1而不是0.0.0.0。这可防止网络上的其他机器访问它们。 - 身份认证:如果你的 MCP 服务器并非用于公开匿名访问,请要求所有连接都进行身份认证。
b. 使用 HTTPS
- 加密传输中的数据:始终为远程 MCP 服务器的 URL 使用 HTTPS(HTTP Secure)。这会加密 CrewAI 应用与 MCP 服务器之间的通信,防范窃听和中间人攻击。
MCPServerAdapter会遵循 URL 中提供的协议(http或https)。
c. Token 透传(反模式)
这主要关系到 MCP 服务器开发者,但了解它有助于选择安全的服务器。
“Token 透传”是指 MCP 服务器接受来自你的 CrewAI 智能体的访问 token(该 token 可能是另一个服务(例如 ServiceA)的 token),并在未正确校验的情况下直接将其传递给另一个下游 API(ServiceB)。具体而言,ServiceB(或 MCP 服务器本身)应只接受明确为其签发的 token(即 token 中的“受众”声明与服务器/服务相匹配)。
风险:
- 绕过 MCP 服务器或下游 API 上的安全控制(如限流或细粒度权限)。
- 破坏审计追踪和问责机制。
- 使被盗 token 可被滥用。
缓解措施(面向 MCP 服务器开发者):
- MCP 服务器不得接受并非明确为其签发的 token。它们必须校验 token 的受众声明。
对 CrewAI 用户的影响:
- 虽然用户无法直接控制这一点,但它凸显了连接到遵循安全最佳实践的精心设计的 MCP 服务器的重要性。
身份认证与授权
- 验证身份:如果 MCP 服务器提供敏感工具或访问私有数据,它必须实现强身份认证机制,以验证客户端(你的 CrewAI 应用)的身份。这可能涉及 API 密钥、OAuth token 或其他标准方法。
- 最小权限原则:确保
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 服务器的能力。 这些内容绝非详尽无遗,但它们涵盖了最常见和最关键的安全问题。 威胁会持续演变,因此重要的是保持了解,并相应地调整你的安全措施。