🕵️

当 AI 报告里混入黑产小广告:一次大模型 API「投毒」事件排查实录

摘要:本文记录了一次由定时任务触发的罕见大模型 API 广告注入事件。通过日志比对与字符排查,最终锁定问题源于服务商端的隐式抓取或语料污染,并给出了针对自动化工作流的本地防守建议。适合 AI 开发者阅读。

日常生活中大家在使用 AI 总结工具时,多半觉得只要 Prompt 写得好,输出就十拿九稳。但你有没有想过,远端的大模型 API 可能会背着你接私活,往你的报告里悄悄塞「澳门赌场」的小广告?

今天我们来聊聊我刚碰到的一件怪事。

一、 见鬼了,我的 Cron 任务在发小广告

为了偷懒,我在 Mac Mini 上跑了一个开源的 AI 智能体「Hermes Agent」,后台挂了个 Cron 定时任务,每小时自动去拉取 5 个 Git 仓库的更新,并用 MiniMax-M3 模型总结成 Markdown 日志,通过 Telegram 发送给我。

起初一切安好,直到今天早上 09:31,我收到了一条画风极其割裂的推送。

前面还在正经汇报 xiaobao-games 仓库的新增代码行数,结尾处毫无征兆地跟了一句极其经典的黑帽 SEO 广告语:

「高*论*免费**视频**中」

Hermes Agent Gateway 终端底层 API 交互数据及日志数据截图

说实话,那一瞬间我有点头疼。第一反应是我的服务器是不是被黑了?还是哪个开源项目的依赖被挂马了?废话不多说,直接开始排查。

二、 顺藤摸瓜:Agent 的自证清白

面对这种灵异事件,最怕的就是瞎猜。我们一步步缩小包围圈。

第一步,查本地 Git 仓库。我赶紧敲入 git log -3 看了下那 5 个项目的历史提交。很干净,没人往 Commit Message 里塞奇怪的东西。

第二步,查本地脚本与工具输出。我截取了 Hermes Agent 在 09:31 抓取的那次 Terminal 原始输出,一共 2466 个字符,全都是干巴巴的 git fetch 状态码,没有任何多余的汉字。

这就有点意思了。本地是干净的,那问题就出在 API 服务商那边。我翻开了底层的 agent.loggateway.log,对比了出问题的那次(09:31)和稍后正常的那次(09:48)的 API 交互数据。

为了直观,大家可以看看这张实测的参数对比表:

数据维度 09:31:34 (异常爆发次) 09:48:27 (正常恢复次) 排查结论说明
API 调用轮数 3 轮 3 轮 逻辑路径一致
Input Tokens 7094 7112 差值在合理波动内,输入端未被污染
Prompt Cache 命中率 36% (2560/7094) 85% (6045/7112) 异常次命中率极低,存在大量新 Context 计算
LLM 响应耗时 14.2s 4.8s 异常次耗时显著变长
Response 实际字节数 515 字节 452 字节 多出的几十个字节刚好就是那句广告词

铁证如山。不是谁黑进了我的电脑,而是大模型在第三轮生成最终回复时,真真切切地把那句「高*论*」当成正常文本吐了出来。

Telegram 推送日志截图,结尾夹杂极其违和的黑帽 SEO 广告语

三、 谁给大模型投了毒?

确定了是 API 端的问题后,我们来探究下底层逻辑。黑产直接攻破头部大厂的服务器去针对你改 Prompt?想必是不太可能的,成本太高。

根据踩坑经验,这种「幽灵注入」通常是由于以下三种 AI 基础设施的隐患引起的:

1. 语料的「赛博废墟」与幻觉

大家要知道,中文互联网的语料库里,充斥着海量被黑客篡改过的网页缓存。模型在预训练阶段「吃」下了成吨的 SEO 垃圾词。当你让它生成结构化的 Markdown 报告时,如果恰好触发了某个冷门的潜空间特征,它会误以为自己在补全某个被抓取的网页,顺口就把在训练集里见得最多的「网页底部小广告」给背了出来。

2. 隐式联网搜索与间接注入

部分模型服务商 API 在处理包含未知项目名(如 xiaobao-games)的 Prompt 时,网关层可能会静默触发背景联网检索。一旦搜索引擎抓取到的参考网页中被黑帽 SEO 注入了带有 CSS 隐藏文本(如 display:none)的恶意 Prompt 指令,大模型在总结时就会遭致间接提示词注入,忠实地将网页里的垃圾广告当成检索上下文混入最终回复。

3. 冷节点重定向与共享缓存残存

这可能是最具隐蔽性的架构漏洞。大家注意看表格里的关键数据:异常爆发时 Prompt Cache 命中率骤降至 36%,且生成耗时飙升至 14.2 秒。这说明该请求未命中主节点的缓存区,被 API 网关重定向到了备用冷节点。在分布式大模型推理集群中,备用节点为了加速计算常挂载公共前缀 KV 缓存。如果多租户隔离或冷节点缓存清理机制存在漏洞,在重新构建上下文时,极易串入其他并发任务在共享缓存区残留的 Token 数据。

四、 开发者防守指南:别盲信大厂 API

搞清楚了原委,我们得想办法防堵。在全自动的工作流中,千万别把 API 服务商想象成绝对可靠的黑盒。

针对这种间歇性的发作,我倾向于在本地加上两道「贞操锁」:

第一,强类型与长度校验。如果是结构化输出,一律强制走 JSON Schema,只要字段不合规或者长度异常,直接抛错重试。

第二,后置正则拦截。在最终推送到 Telegram 或者发邮件前,写个简单的 Shell 或 Node.js 脚本,把输出扔进正则黑名单里滚一遍,拦截掉「博彩、套现、人成」等高频黑产词。

其实折腾到最后,大家可能会发现,只要你用 AI,这种由底层语料毒性带来的荒诞小插曲多多少少都会伴随左右。

至于那句塞在代码日志里的小广告,最后我也没去那个所谓的「高*论*」看看,万一电脑中病毒了呢。我们下篇见。

💬 评论区 (0)

0/500

加载评论中……