一张客服工单被提交上来。描述里夹着几句不是写给人的话,是写给模型的。如果这几句生效,聊天机器人就会说出或做出没人让它做的事。
![]()
这类攻击叫提示注入,大多数团队已经在前面架了过滤器。被忽略的一点是:这些过滤器通常按英文调校,而波斯语这类语言能让同一条指令完整抵达模型,过滤器看到的却是完全不同的东西。
语言模型把系统指令、用户消息、检索到的文档和工具输出当成一整条文本流读进去。它没有可靠办法分辨哪一段是指令、哪一段只是看起来像指令。任何能把文字放到模型面前的人,都可以试着操纵它。
所以需要担心的"用户"不止一个。应用读到的任何网页、上传的 PDF、任何工单和邮件,其作者都能塞进文字。后一种情况叫间接注入,实际更危险,因为受害者什么都没做可疑的事。
为什么波斯语改变了局面
过滤器要么做字符串匹配,要么用一个小模型做分类。两种做法都假设文本到达时的形态和写过滤器时差不多。波斯语从好几个方向打破了这个假设,而每一种都不改变句子对模型的含义。
- 一个字母,两个码位。波斯语的"ی"和阿拉伯语的"ي"是两个不同字符,在大多数字体里长得一样。"ک"和"ك"同理。用其中一种写法写的黑名单,看不见另一种。
- 看不见的空格。零宽不连字符在波斯语里是真实存在的字符:去掉它文本会变得难读,所以应用不能简单剥掉。它旁边还坐着其他完全不可见的零宽字符。中间夹一个零宽字符的词,对读者是同一个词,对字符串匹配是另一个词。
- 三套数字。波斯数字、阿拉伯-印度数字和拉丁数字都会出现在波斯语文本里。为其中一套写的规则会漏掉另外两套。
- Finglish。用拉丁字母写波斯语在伊朗很常见,大模型读起来毫无困难。对一个存着波斯语词表的过滤器来说,这段文本根本不是波斯语。
- 方向控制字符。Unicode 里有能改变文字显示方向的字符。有了它们,客服在后台面板里读到的内容,和模型收到的内容,不必是同一个字符串。这一族字符在源码里被称为 Trojan Source,用在普通文本里同样有效。
屏幕上看起来相同的两个词,对过滤器是不同的字符串:黑名单里写的是波斯语 kaf 和波斯语 yeh 拼成的"کیک",文本里用的是阿拉伯语 kaf 和阿拉伯语 yeh 拼成的"كيك"。直接比对返回 False,把阿拉伯字母映射为波斯字母后再比对,返回 True。对模型来说四种写法意思一样,词表过滤器只认第一种。
测试的七个步骤
- 列出文本进入的所有路径。用户消息只是其中一条。上传文件的文件名、检索文档的正文、工单标题、第三方 API 的响应,甚至另一个系统抛出的错误信息,都是文本。不在这张清单上的路径就不会被测到。
- 建立基线。用最朴素的波斯语发出最简单的指令,不做任何伪装。如果这样就成了,测试到此结束。如果没成,你现在知道过滤器拦住了什么。
- 一次只改一个变量。用同一句话换一种形态重写,记录结果,回到原句再试下一种。一次改多个,就说不清是哪一处起了作用。
- 走间接路径。把文字放进应用会检索的文档里,而不是你发出的消息里。不少应用对用户输入很小心,却默认检索内容是安全的。
- 问模型能做什么,而不是它说了什么。模型说了不该说的话是一回事,调用工具、修改记录、把数据发出去是另一回事。发现的严重程度取决于模型的权限,不取决于它回复的语气。
- 重复,并计数。模型行为是概率性的。一次成功不能证明问题一直存在,一次失败也不能证明它不存在。每个测试跑多次,把结果报成比率:十次里成功三次。
- 读日志。如果注入的文本在日志里找不到,或者被清理得太彻底、原始形态已经消失,安全团队事后就无法还原一次攻击。这本身就是一条发现。
一条同时保留原始形态和规范化形态的日志,才能让攻击在事后可见:记录时间、消息编号、来源为工单标题,原始字符串、规范化后的字符串、过滤器结果和工具调用次数。
防御:先规范化,再过滤
大多数团队把用户发来的文本原样交给过滤器。正确的顺序反过来:在做任何判断之前先规范化一次——把阿拉伯字符映射为对应的波斯字符,移除或显式标出零宽字符和方向字符,统一数字,套用同一种 Unicode 规范化形式。然后让过滤器和分类器面对规范化后的文本。原始文本保留用于展示,用户实际写的东西一点不丢。
规范化不会消除攻击,它堵住的是绕过过滤器最便宜的那条路。做一次,在边界上做。如果应用的每个部分各自规范化,它们之间的差异就会变成你本想堵上的那道缝。
注意:不要剥掉零宽不连字符,它是正确波斯语拼写的一部分。只移除在文本里没有职司的不可见字符,其余的展示给审核者看,而不是删掉。
不依赖模型的控制措施
任何依赖模型行为正确的防御,都可能在模型更新的那天变样。耐久的控制措施在模型之外:
- 工具的最小权限。模型只能通过允许清单触达任务所需的东西,而不是靠普遍信任。
- 不可逆操作要人工批准。删除、付款、把数据发到组织外,不该由工单里的一句话触发。
- 模型输出是不可信输入。输出到达浏览器、查询或命令的地方,都按用户输入对待。
- 检索内容分级信任。客户上传的文档和已批准的内部文档不是一回事,应用应当知道区别。
- 限流与监控。对工具调用做速率限制,使用模式偏离常态时告警。
如果团队在跑客服机器人、内部助手或任何会读外部文本的智能体,把那张入口清单和自己的团队填一遍。上面通常有一条路径,是没人想到过的。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.