MCP服务器中的ANSI转义序列注入:对人隐藏,对AI可见
ANSI转义序列可被用于向AI代理隐藏指令,形成注入攻击。本文介绍了两种攻击变体(直接获取型和存储型),并阐述了如何通过动态应用安全测试(DAST)自动检测此类漏洞。
ANSI转义序列最初设计用于终端控制,而非语言模型。这些控制码在终端渲染时不可见,但语言模型会逐字节读取。攻击者利用这一差异,在AI代理消费的文本中嵌入隐藏指令,绕过人工审核。这种输出中和失败已在真实产品中出现,例如Kubernetes的kubectl(CVE-2021-25743)和Git(CVE-2024-52005)。在模型上下文协议(MCP)中,服务器通过工具、资源和提示流式传输文本给代理,每个模型读取的字段都可能是注入点。
动态应用安全测试(DAST)是检测此类漏洞的自然选择。它从外部运行目标,发送构造的输入并检查响应中的漏洞证据。本文介绍了两种攻击变体:直接获取型AESI和存储型AESI。直接获取型攻击中,攻击者托管包含ANSI转义序列和隐藏指令的URL,通过获取工具传递给模型。存储型攻击则将载荷写入存储,通过另一入口点读取时触发,具有持久性、解耦性和延迟暴露的特点。
检测基于三个设计原则:检查原始字节、仅关注模型可消费字段、使用唯一触发标记和三信号确认。DAST扫描器为每个载荷使用一个标记,当ANSI转义字节、固定指令短语和触发标记同时出现在同一模型可消费字段中时,确认漏洞。直接获取型检测通过注入恶意URL到工具参数并检查响应实现。存储型检测则分三阶段:首先写入唯一标记,然后映射反射点,最后发送真实载荷并确认。
对于构建MCP服务器的团队,建议清除控制字节、验证数据类型并审计存储写入点。这些措施可防止ANSI注入攻击,确保AI代理的安全。ANSI转义序列的历史可追溯到1970年代,当时不同厂商的硬件终端使用各自不兼容的控制方言。ANSI X3.64标准统一了它们:程序可以发出一组商定的代码来移动光标、清屏或设置颜色,任何符合标准的终端都会执行。攻击者滥用这种控制能力,在AI代理读取的文本中嵌入隐藏指令。MCP服务器中,模型可消费字段包括工具结果中的text、资源读取中的text和提示模板中的text。载荷出现在其他位置则不可利用。安全影响包括未授权代理操作、绕过人工审核、日志和审计轨迹操纵以及持久性注入风险。自动化检测的核心是将攻击转化为可重复的自动化测试,通过原始字节检查、模型消费字段聚焦、唯一触发标记和三信号确认来实现低噪声检测。