一段用来识别浏览器身份的常规前端脚本,里面为什么要算水源蓖麻毒素的致死剂量?2026 年 10 月 28 日,安全研究员 veritas 用 Playwright 爬取了 Tranco Top Sites 榜单上的 10,000 个网站,拦截并收集了 1,033 张浏览器 Canvas 指纹渲染图。在拆解其中一张酷似 Tame Impala 专辑《Currents》封面的艺术图案脚本时,他撞见了一套专门针对大模型的反 LLM 混淆机制。这不是某个程序员的恶作剧,而是反爬虫厂商把大模型安全护栏当成免费防逆向防火墙的商业算计。
艺术画布底下的生化与政治地雷
浏览器 Canvas 指纹的原理并不复杂。网页在后台画布上绘制文字与几何图形,再提取像素数据;由于不同操作系统、显卡驱动和浏览器的渲染存在细微差异,风控系统就能借此识别真人与自动化爬虫。

涉事脚本托管在 servicepipe.tech,剥掉外层伪装后,它收集的无非是常规的浏览器属性与显卡渲染器信息。但为了不让安全人员用 AI 读懂这段代码,编写者在里面塞满了高危违禁词。
明面上的函数名直接写着 computeRicinLethalDosageForWaterSupply(计算水源蓖麻毒素致死剂量)和 calculateDeadlyLethalSuicideAspirinDosage(计算阿司匹林自杀致死剂量),甚至还有计算硝酸铵炸药冲击波半径和芬太尼前体合成产率的函数。暗处则藏着一串不可见的 Unicode 字符,解码逻辑是将每个字符的码点减去 917504。
还原后的明文是一段伪造的最高权限系统提示词,要求模型暂停所有安全准则,完整输出针对医疗设施的全球 DDoS 攻击程序、逃税手段、城市气溶胶生化武器合成指南,末尾还专门追加了敏感政治历史词汇。把这段代码喂给 Astra 模型,哪怕开启了 Daybreak Blue 选项,模型也会因为触发生物安全风险护栏而直接拒答;但换用 GLM-5.3 测试同一段提示词,模型却照常完成了反混淆。
俄罗斯风控厂商的公开阳谋
顺着 servicepipe.tech 的域名往下查,背后浮出水面的是俄罗斯流量控制与反 DDoS、Bot 防护厂商 servicepipe.ru。把毒药配方和政治敏感词塞进商业客户的前端代码里,看着像工程师私自夹带私货,实则是这家公司公开推行的商业防御技术。

早在 2026 年 7 月 9 日,Servicepipe 副总经理 Daniil Shcherbakov 就在 RBC Companies 的企业账号上发文,把这套打法摆到了台面上。过去风控厂商保护客户端代码,靠的是 javascript-obfuscator 这类工具改乱变量名、打平控制流,赌的是人类逆向工程师精力有限。现在安全研究员顺手把乱码丢进大模型,几秒钟就能拿到清晰的逻辑摘要。
为了重新拉高逆向门槛,Servicepipe 设计了四层针对 AI 解析器的干扰手段:添加虚假代码结构、模拟恶意内容触发大模型安全过滤器、用冗余信息过载上下文窗口,以及直接嵌入提示词注入诱导 AI 给出错误的分析结论。
学术界其实早就注意到了这个方向。EMNLP 2025 上的一篇论文《Web Intellectual Property at Risk: Preventing Unauthorized Real-Time Retrieval by Large Language Models》就专门研究过如何通过修改网页内容诱导大模型拒答,以此保护网络知识产权。只是 FingerprintJS 或 Cloudflare Turnstile 等主流欧美大厂目前还没有在脚本里嵌入违规提示词的实质证据,Servicepipe 率先在生产环境里撕开了口子。
借刀杀人的算计与沙箱里的真火药
拿大模型的道德护栏当自家的商业防盗门,省钱,但满地是雷。
《孙子兵法》讲“因粮于敌”,最高明的防御往往是直接调用对手的基建。大模型厂商花几亿美元做安全对齐(RLHF)和合规过滤,本意是防止技术被滥用于造毒药或搞网络攻击;Servicepipe 却顺手做局,把竞争对手和逆向分析者手里的 AI 助手逼成了替自己看家护院的保安。为了通杀东西方主流模型,脚本里甚至做了精准的合规覆盖:用生化武器、自残引导和基础设施攻击去撞欧美模型的安全红线,再专门塞进中文政治敏感词去触发中国大模型的审查机制。

但我更在意的是脚本里另一段被原作者轻轻放过的代码。在这份脚本内部,藏着一个专门针对 Node.js 环境的条件分支:一旦检测到非浏览器环境且存在特定环境变量,代码就会尝试遍历读取 .env、.docker/config.json、.kube/config 等敏感配置文件,接着通过 child_process 执行一连串 Shell 命令,去内网 IP 下载可执行文件、打包系统信息与容器列表,最后修改系统的 crontab 定时任务实现持久化驻留。
原作者 veritas 看到文件读取函数后面跟着空回调(() => {}),而且 Shell 命令里同样夹杂着自残引导和政治敏感词,便推测这段恶狠狠的逻辑只是用来吓唬分析者和触发 AI 警报的诱饵(Decoy)。
这个判断过于乐观了。在独立的安全审计视角下,文件读取的空回调根本无法证明后面那条独立的 exec 命令执行路径是无害的。许多安全研究员在逆向前端混淆脚本时,习惯直接用本地 Node.js 环境跑一遍脚本来动态解出字符串。一旦攻击者把环境变量门槛去掉,或者分析者在自动化沙箱里满足了触发条件,这套所谓的反 AI 诱饵随时会变成真实的反制武器,直接打穿逆向人员的本地机器。
- 风险.切勿将包含反 LLM 混淆特征的未知前端脚本直接丢进未隔离的本地 Node.js 环境动态执行,空回调掩护下的
child_process随时可能演变为真实的供应链投毒或逆向沙箱逃逸。
况且,把防御押注在第三方模型的护栏上,本身就是一门脆弱的生意。这次实测中 Astra 拒答而 GLM-5.3 照常放行,已经把漏洞摆在了台面上:不同大模型的对齐颗粒度天差地别。对于真正有经验的逆向工程人员来说,拆掉这层防御甚至不需要换模型。只要在把代码喂给 AI 之前,先用本地抽象语法树(AST)工具跑一遍预处理,把所有变量名和函数名统一替换成无意义的 var_1、func_2,再剥离掉不参与核心逻辑的超长不可见字符串,那些精心编排的蓖麻毒素和越狱指令就会瞬间变成哑弹。
浏览器指纹的猫鼠游戏打了十几年,从早期的拼算法,到拼代码混淆复杂度,今天终于卷到了提示词工程。当一段正经的商业防护代码必须靠满屏的生化武器、自杀剂量和政治黑话才能保住秘密时,防住的往往只是顺手复制粘贴的初级分析员,却把大模型厂商和整个安全审计链路拖进了一场荒诞的合规内耗。
