一行藏在网页里、人眼几乎看不见的文字,可以让正在阅读该网页的AI助手改变回答,甚至触发它调用API。不需要用户点击,不需要安装恶意软件,攻击者只需要把一段精心构造的文本放进AI会读取的内容中——这就是提示注入(Prompt Injection)正在演变为现实攻击的原因,尤其是以隐藏文本形态出现的间接提示注入。
我去年在做AI Agent安全测评的时候,亲手复现过一次这样的情况:一个具备网页摘要能力的Agent,读完一张带有透明文字的产品说明页后,真的把我指定的命令执行了出去。整个过程没有弹窗,没有黑框,没有二进制样本,只有一个前端样式属性和一个普通句子。第一次跑通时,我后背发凉。这篇文章我想完整拆解这条攻击链,讲清楚隐藏文本为什么能绕过“系统提示”,有哪些构造方式,以及我们做AI应用的人该怎么防守。
1. 看不懂的攻击链:为什么一行字能接管AI的决定
1.1 大模型没有“数据”与“指令”的物理隔离
我们平时说“系统提示词”,容易产生一个错觉:系统提示像是操作系统的内核权限,用户输入只是普通数据,系统提示一定比用户输入更“高级”。但在大模型的实现机制里,系统提示、用户消息、检索回来的文档、网页正文,最终都会被拼接到同一个上下文窗口里,变成一个很长的token序列。模型不知道哪段文字来自系统配置文件、哪段文字来自陌生网页,它只知道哪段文字在“当前任务语义上”更像该做的指令。
这就是问题所在。传统程序里,“代码”和“数据”有严格的边界,SQL注入能发生正是因为没有遵守这条边界。大模型恰恰把一个“系统指令”和“外部文本”放在同一层做预测,攻击者就可以利用一句话来提高某个特殊指令的生成概率。很像你把正式工作交给一个新来的临时工,再让路过的人随便塞给他一张纸条,上面写着“刚才说的不用做了,按我这个来”,临时工大概率会照做,因为他分不清谁有授权。
1.2 为什么可以做到“零点击”和“无恶意软件”
传统攻击链通常需要用户做某个动作:点击链接、打开文档、执行脚本。但AI Agent的工作方式不一样,它会主动替用户读取网页、整理邮件、总结文档。攻击者不需要“诱骗用户点击”,他只需要把恶意文本发布到一个AI会自动访问的地方,然后AI自己就会把这段文本吞进上下文。
所以新闻里说的“零点击”,不是指某个浏览器零日漏洞,而是指AI系统把人从“交互链路”里拿掉了。人没看到这段文字,不代表模型没看到。比如AI搜索工具要总结一个网页,网页正文里有一段color: transparent的文字;比如邮件摘要助手在处理一封商务邮件,邮件底部有一行白色小字;比如RPA机器人打开报销单附件,表格里某个隐藏列写着指令。这些都是AI在正常完成业务,主动完成“读取”这一步,恶意文本从输入端混了进来。
不需要恶意软件也很好理解。攻击者没有在受害者系统上植入可执行文件,他提供的只是一个“看似无害的文本输入”。“恶意”藏在文本的解释层,而不是二进制执行层。对传统安全设备来说,这段文本完全可能是合法的UTF-8内容和无害的HTML标签,它不会触发杀毒软件,也不会报警。
1.3 一条隐藏文本攻击链路的完整解剖
拆开看,最小可用的攻击链大致有四步:
- 攻击者在某个AI会读取的载体上放置隐藏文本,例如网页DOM、PDF元数据、图片OCR区域、邮件引文区。
- AI系统按业务逻辑主动读取该载体内容,把它塞入上下文。
- 模型将隐藏文本中的指令与“用户要求、系统指令”一起处理,隐藏文本成功覆盖或劫持原有指令。
- 具备工具调用能力的Agent把结果映射成API动作,例如发送邮件、修改订单、调用支付接口,产生实际影响。
最后一步不一定需要模型直接输出危险行为。哪怕只是让AI摘要助手在总结里加入一句错误的结论,也能操纵舆情或干扰决策。更危险的是那些同时具备“读外部内容”和“写内部系统”能力的Agent,它们把一条普通文本通道变成了隐形的远程控制通道。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 藏字手法全拆解:从CSS隐藏到零宽字符再到多模态转写
“隐藏文本”并不是某一个具体技术,而是一类能让“模型读到、人眼读不到”或“人眼读到、但后处理链路不会删掉”的方法。我按自己的实验经验把它们分成三类。
2.1 CSS把指令藏进人类视觉盲区
最直接的方法是复用前端里的“SEO隐藏文本”套路。给一段HTML加上透明颜色、极小字号、绝对定位移出屏幕或clip-path裁掉,用户在浏览器里看不到,但搜索引擎爬虫和AI Agent的渲染层仍然拿得到完整DOM。
下面是一段最基础的可测试HTML:
html复制<!DOCTYPE h
