模型上下文协议(MCP):AI连接外部数据的安全挑战与应对

本文深入探讨模型上下文协议(MCP)的技术架构、安全风险及防护措施。MCP作为AI与外部数据源的连接协议,采用客户端-服务器架构,通过工具、资源和提示三大组件实现功能,但存在凭证窃取、提示注入等安全威胁。

模型上下文协议(MCP)

模型上下文协议(MCP)是一个提议的开放标准,为AI-LLM应用程序提供与外部数据源直接交互的双向连接。它由Anthropic开发,旨在通过减少每个新系统的自定义代码需求来简化AI集成。MCP充当了允许AI模型与外部数据交互的粘合剂,而不是被隔离或困在自己的泡沫中。通过这种方式,MCP服务器充当LLM与外部现实世界数据源之间的代理。

MCP采用客户端-服务器架构,AI应用程序充当客户端,MCP服务器将外部服务数据返回给应用程序。该协议使用结构化的JSON-RPC格式来定义AI客户端如何请求能力,以及MCP服务器如何提供能力,通常以可执行的软件函数形式。

MCP架构

Anthropic有一个专门的存储库,提供多种语言的软件开发工具包,可在https://github.com/modelcontextprotocol找到。语言支持广泛,包括Typescript、Java、Python、C#、PHP、Ruby、Golang、Rust等。有关MCP的详细文档发布在https://modelcontextprotocol.io。

MCP服务器通过三个主要构建块提供功能:

  • 工具是LLM可以直接调用的软件函数,用于获取外部资源数据访问权限。例如,工具可以直接与数据库交互或使用其他API来获取其他服务相关数据。工具为LLM提供最强大的功能。
  • 资源是被动数据源,可以提供对上下文数据的只读访问。资源可能提供某些文件内容、数据库模式或某种形式的文档。
  • 提示是预构建的指令模板,告诉模型如何使用特定工具和资源。

安全挑战

遗憾的是,MCP在设计时优先考虑功能性,完全没有解决信息安全问题。作为一个非常开放且易于使用的规范,实现容易受到多种风险和攻击向量的影响。此外,众所周知,开发人员面临启用业务功能的压力,安全措施往往被置于次要位置。

在MCP环境中,我们将概率性生成语言技术与确定性工具连接起来以采取直接行动。即使在LLM选择使用什么MCP工具以及提供什么参数之前,就已经引入了一定程度的不可预测性。

MCP的下一个挑战是信任通常被假定但未强制执行。由于输入的不可预测性,使用严格的安全控制实现MCP服务器变得更加关键。MCP是一个信任边界,因为它直接允许AI模型:

  • 通过机器可读清单发现工具
  • 通过自然语言描述了解如何使用工具
  • 通过从用户提示推断所需参数直接执行/触发工具
  • 将工具输出链接在一起以触发进一步操作

攻击场景和影响

一些可能的攻击场景和影响包括:

凭证/账户冒充和窃取 MCP服务器可能包含OAuth令牌、API密钥和/或其他服务凭证,以启用对上游服务的访问。例如,这可能是Google账户凭证、Slack凭证或云存储凭证。开发人员将凭证直接硬编码到脚本和/或AI提示模板中 risking exposure 的情况并不少见。

存储提示注入/工具中毒 MCP服务器通常被实现为盲目执行操作而不检查输入,导致成功的操作系统命令注入、SQL注入以及针对MCP服务器利用的任何第三方API的任何其他输入的执行。更糟糕的是,AI-LLM从类似帮助台票务系统的内容中获取其提示是完全可行的,导致本质上与存储型跨站脚本(XSS)没有区别的情况。

过度特权MCP工具/过度能力 MCP工具按设计需要访问外部数据源,但是标准中没有定义特定的基于角色的访问控制。这将访问控制留给了开发人员。使用过度特权的令牌进行服务访问,或者在操作系统命令执行周围没有实施控制的情况并不少见。

缺乏日志记录和可见性 今天编写的许多工具都基于Anthropic GitHub存储库中的示例/参考代码。这些示例不是生产就绪的代码。工具设计者和开发人员有责任确保在所有MCP工具中实施日志记录控制。LLM在查询和控制MCP工具时采取的任何操作都应明确记录,确保做出谨慎选择以避免记录敏感数据。

拒绝服务和账单滥用/钱包拒绝 通过提示,MCP工具可能会连续循环并在过程中消耗第三方服务的资源。如果实现中没有实施账单配额和/或速率限制,这将导致过度使用和与该第三方服务相关的账单。

风险缓解指南

在开发内部MCP工具时,请考虑以下指南:

  • 对本地MCP工具使用标准输入/输出(STDIO)进行数据传输,而不是网络套接字。如果设计需要使用网络套接字,请考虑使用Unix域套接字进行进程间通信,或将网络套接字仅绑定到127.0.0.1。
  • 因为MCP工具代表信任边界,确保验证并适当清理所有外部输入。这将包括用于提示构建、API请求、文件系统访问请求、网络请求和任何操作系统shell命令数据中的数据。
  • 实施文件系统限制,将工具限制在特定目录和文件。
  • 实施日志记录,注意避免记录任何敏感数据,如授权令牌或API密钥。
  • 对所有工具功能和外部API调用实施明确定义的访问控制,以确保仅允许授权操作。
  • 验证MCP代理/工具接收的数据来源,以避免数据源中毒的可能性。
  • 使用外部密钥和秘密管理解决方案来访问任何授权秘密、令牌和API密钥。
  • 为任何外部API调用实施服务速率限制或节流。

安全工具生态系统

有越来越多的工具和社区驱动项目生态系统用于协助MCP风险缓解。以下是一些示例:

MCPSafetyScanner MCPSafetyScanner是AI Assurance Lab的开源工具(https://github.com/johnhalloran321/mcpSafetyScanner),模拟攻击者行为针对MCP工具清单。该工具执行以下操作:

  • 扫描工具描述以查找潜在的提示注入向量
  • 标记不安全模式和过度宽松的参数
  • 检测不受控制的输入

MCP Guardian MCP Guardian是一个安全和治理层,提供对LLM如何与外部工具交互的可见性和控制。它可以强制执行:

  • 基于OAuth2的身份验证和范围过滤
  • 每个工具使用的速率限制和配额
  • 模式和参数验证
  • 用于取证目的的日志记录和遥测

MCP-Scan Invariant Labs的MCP-Scan执行静态代码扫描和运行时代理强制执行。静态分析功能适用于本地MCP配置,适用于Claude、Cursor和Windsurf等客户端。这可以识别提示注入风险、工具中毒攻击以及通过哈希不匹配或清单更改进行的"地毯拉取"操纵。运行时代理具有PII检测、自定义规则、秘密阻止和工具使用策略保护。

MCP授权规范(RFC-9728)

自然执行代码分析和实施运行时代理式保护是好事,但最终需要授权控制来正确定义信任边界。MCP授权规范提供了一种结构化方法,为工具调用提供基于OAuth2的访问控制。这有助于强制执行最小权限、用户特定范围和多租户分离。一些特性如下:

  • 受保护资源元数据(PRM)是一个知名的"prm.json"文件,声明支持的范围、授权方法、令牌自省和受众规则。
  • 角色分离允许公开工具的资源服务器和授权服务器完全解耦。
  • 该规范与所有符合标准的OAuth 2.1提供商(如Auth0、Descope、AWS Cognito和Microsoft Entra ID)互操作。

底线是授权规范允许您强制执行最小权限原则。

这只是模型上下文协议及相关挑战的简要视图。与AI世界中的所有事物一样,目前,随着采用的继续,我们肯定会看到快速的变化和演变。作为网络安全从业者,让我们希望随着AI生态系统的这一方面进一步发展,更多的注意力将放在安全和风险缓解上。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计