MCP 安全注意事项
当把 MCP(Model Context Protocol)这类外部服务集成到 CrewAI 代理中时,安全性至关重要。 MCP 服务器可以根据其暴露的工具执行代码、访问数据,或与其他系统交互。 你必须理解这些影响,并遵循最佳实践来保护应用和数据。
- 在代理运行的机器上执行任意代码(尤其是使用
Stdio传输时,如果服务器可以控制所执行的命令)。 - 暴露代理或其运行环境中的敏感数据。
- 以非预期方式操控代理行为,包括代表你发起未经授权的 API 调用。
- 通过复杂的提示注入技术劫持代理的推理过程(见下文)。
1. 信任 MCP 服务器
Section titled “1. 信任 MCP 服务器”在配置 MCPServerAdapter 连接某个 MCP 服务器之前,请先确认你知道:
- 谁在运营这台服务器? 它是可信、知名的服务,还是你自己控制的内部服务器?
- 它暴露了哪些工具? 了解这些工具的能力。若攻击者接管服务器,或者服务器本身恶意,这些工具会被如何滥用?
- 它访问或处理哪些数据? 你要清楚哪些敏感信息可能会被发送到 MCP 服务器或由其处理。
避免连接未知或未验证的 MCP 服务器,尤其是在代理需要处理敏感任务或数据时。
2. 通过工具元数据进行安全提示注入:“模型控制协议” 风险
Section titled “2. 通过工具元数据进行安全提示注入:“模型控制协议” 风险”一个重要但隐蔽的风险,是通过工具元数据进行提示注入的可能性。其工作方式如下:
- 当 CrewAI 代理连接到 MCP 服务器时,通常会请求可用工具列表。
- MCP 服务器会返回每个工具的元数据,包括名称、描述和参数描述。
- 代理底层的语言模型(LLM)会使用这些元数据来理解何时以及如何使用这些工具。这些元数据通常会被纳入 LLM 的系统提示或上下文中。
- 恶意 MCP 服务器可以在工具元数据(名称、描述)中嵌入隐藏或显式指令。这些指令可作为提示注入,实际上是在告诉你的 LLM 以某种方式行为、泄露敏感信息或执行恶意动作。
关键在于,即使你的代理从未明确决定使用这些工具,只要连接到恶意服务器并列出其工具,这种攻击就可能发生。 仅仅接触这些恶意元数据,就可能足以破坏代理行为。
缓解措施:
- 对不受信任的服务器保持极端谨慎: 再强调一次:不要连接到你无法完全信任的 MCP 服务器。 元数据注入的风险使这一点尤为重要。
Stdio 传输安全
Section titled “Stdio 传输安全”Stdio(标准输入/输出)传输通常用于与运行在同一台机器上的本地 MCP 服务器通信。
- 进程隔离:虽然通常更安全,因为默认不涉及网络暴露,但仍要确保
StdioServerParameters运行的脚本或命令来自可信来源,并具有合适的文件系统权限。恶意的 Stdio 服务器脚本仍可能损害你的本地系统。 - 输入清理:如果你的 Stdio 服务器脚本接受来自代理交互的复杂输入,请确保脚本本身会清理这些输入,以防止脚本逻辑中的命令注入或其他漏洞。
- 资源限制:要注意,本地 Stdio 服务器进程会消耗本地资源(CPU、内存)。请确保它行为良好,不会耗尽系统资源。
困惑代理攻击
Section titled “困惑代理攻击”困惑代理问题 是一个经典安全漏洞,在 MCP 集成中也可能出现,尤其是当 MCP 服务器充当其他第三方服务(例如使用 OAuth 2.0 授权的 Google Calendar、GitHub)的代理时。
场景:
- 一个 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-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 安全实践必不可少。
SSE 安全注意事项
Section titled “SSE 安全注意事项”a. DNS 重绑定攻击(尤其针对 SSE)
Section titled “a. DNS 重绑定攻击(尤其针对 SSE)”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
Section titled “b. 使用 HTTPS”- 加密传输中的数据:远程 MCP 服务器的 URL 始终应使用 HTTPS(HTTP Secure)。这会加密 CrewAI 应用与 MCP 服务器之间的通信,防止窃听和中间人攻击。
MCPServerAdapter会遵循 URL 中提供的协议(http或https)。
c. 令牌透传(反模式)
Section titled “c. 令牌透传(反模式)”这主要是 MCP 服务器开发者需要关注的问题,但理解它有助于选择更安全的服务器。
“令牌透传”指的是 MCP 服务器接受来自 CrewAI 代理的访问令牌(该令牌可能是另一个服务,比如 ServiceA 的令牌),然后未经适当验证就将其直接传递给下游 API(ServiceB)。具体来说,ServiceB(或 MCP 服务器本身)应只接受明确为其签发的令牌(也就是令牌中的 audience claim 与服务器/服务匹配)。
风险:
- 绕过 MCP 服务器或下游 API 的安全控制(如速率限制或细粒度权限)。
- 破坏审计轨迹和责任归属。
- 允许滥用被盗令牌。
缓解措施(针对 MCP 服务器开发者):
- MCP 服务器绝不应接受未明确为其签发的令牌。它们必须验证令牌的 audience claim。
CrewAI 用户的影响:
- 虽然用户无法直接控制这一点,但这强调了连接设计良好、遵循安全最佳实践的 MCP 服务器的重要性。
身份验证与授权
Section titled “身份验证与授权”- 验证身份:如果 MCP 服务器提供敏感工具或私有数据访问,则必须实现强身份验证机制来验证客户端(你的 CrewAI 应用)的身份。这可以通过 API key、OAuth 令牌或其他标准方法实现。
- 最小权限原则:确保
MCPServerAdapter使用的凭证(如果有)仅具有访问所需工具的必要权限。
d. 输入验证与清理
Section titled “d. 输入验证与清理”- 输入验证至关重要:MCP 服务器在处理或将输入传给工具之前,必须严格验证来自代理的所有输入。这是防御许多常见漏洞的主要手段:
- 命令注入: 如果某个工具根据输入构造 shell 命令、SQL 查询或其他解释型语言语句,服务器必须仔细清理这些输入,以防止恶意命令被注入并执行。
- 路径遍历: 如果某个工具根据输入参数访问文件,服务器必须验证并清理这些路径,以防止访问未授权的文件或目录(例如阻止
../序列)。 - 数据类型与范围检查: 服务器必须确保输入数据符合预期的数据类型(如字符串、数字、布尔值),并落在可接受范围内,或符合定义好的格式(如 URL 的正则表达式)。
- JSON Schema 验证: 所有工具参数都应严格按照其定义的 JSON schema 进行验证,这有助于尽早发现格式错误的请求。
- 客户端侧意识:虽然服务器端验证最为关键,但作为 CrewAI 用户,你也应留意代理会发送给 MCP 工具的数据,尤其是在与较不受信任或新接入的 MCP 服务器交互时。
e. 速率限制与资源管理
Section titled “e. 速率限制与资源管理”- 防止滥用: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 服务器处理敏感数据、执行关键操作或面向公网暴露,建议由合格专业人员定期进行安全审计。
5. 延伸阅读
Section titled “5. 延伸阅读”如需更详细的 MCP 安全信息,请参考官方文档:
通过理解这些安全注意事项并落实最佳实践,你就能在 CrewAI 项目中安全地利用 MCP 服务器的能力。 这些内容并不穷尽,但涵盖了最常见且最关键的安全问题。 威胁会持续演变,因此持续关注并相应调整安全措施非常重要。