Why is this fingerprinting script creating bioweapons?
I’ve always had a fascination with reverse-engineering browser fingerprinting scripts. Most of my time has been spent looking at the usual suspects (popular fingerprinting libraries like FingerprintJS and more sophisticated scripts used by anti-bots like Cloudflare Turnstile, Akamai, and others).
我一直对逆向工程浏览器指纹脚本情有独钟。我大部分时间都在研究那些常见的“嫌疑对象”(例如 FingerprintJS 等流行的指纹库,以及 Cloudflare Turnstile、Akamai 等反机器人服务所使用的复杂脚本)。
At some point, I wanted to know what else was out there. I had an idea: What if I crawled the web and intercepted fingerprinting-related browser API calls and mapped it all?
在某个阶段,我想知道还有什么其他东西存在。我产生了一个想法:如果我爬取整个网络,拦截与指纹相关的浏览器 API 调用并将其全部映射出来会怎样?
To do this, I used the Tranco Top Sites list and began crawling using Playwright. I would hook canvas toDataURL calls and common fingerprinting/anti-bot properties like navigator.webdriver to filter out benign canvases.
为了实现这一点,我使用了 Tranco 热门网站列表,并开始使用 Playwright 进行爬取。我会挂钩 canvas 的 toDataURL 调用以及 navigator.webdriver 等常见的指纹/反机器人属性,以过滤掉良性的画布。
For those unfamiliar, canvas fingerprinting generally involves drawing text, shapes, or other graphics onto an HTML
对于不熟悉的人来说,Canvas 指纹识别通常涉及在 HTML
Most implementations are pretty boring to look at. A few shapes, some colored rectangles, and the occasional pangram. After crawling 10,000 websites, I had accumulated a surprisingly diverse collection of canvases.
大多数实现看起来都很无聊。无非是一些形状、彩色矩形,偶尔会出现一个全字母句。在爬取了 10,000 个网站后,我积累了一系列令人惊讶的多样化画布。
I decided to put them all in one place: fingerprint.garden. As I looked through the results, I recognized some familiar faces. There were canvases from FingerprintJS, Castle, and other well-known fingerprinting solutions.
我决定把它们都放在一个地方:fingerprint.garden。当我浏览这些结果时,我认出了一些熟悉的面孔。其中有来自 FingerprintJS、Castle 和其他知名指纹识别解决方案的画布。
There were also quite a few I didn’t recognize.
也有不少是我不认识的。
Some were incredibly simple. Others were surprisingly elaborate. And a handful were, in my opinion, works of art.
有些极其简单。另一些则出奇地复杂。在我看来,还有少数简直是艺术品。
I set out to find my favorite.
我开始寻找我最喜欢的一个。
One canvas in particular caught my eye. It reminded me of the album art for Tame Impala’s Currents (great album btw).
其中一个画布特别吸引了我的注意。它让我想起了 Tame Impala 的专辑《Currents》的封面(顺便说一句,那是一张很棒的专辑)。
I wanted to know which script was responsible for this lovely canvas.
我想知道是哪个脚本负责生成了这个可爱的画布。
I’ve spent enough time reverse engineering JavaScript to recognize most common obfuscation techniques and fingerprinting SDKs at a glance.
我花在逆向工程 JavaScript 上的时间已经足够长,可以一眼认出大多数常见的混淆技术和指纹识别 SDK。
I wasn’t expecting anything unusual. Most fingerprinting scripts are frequently obfuscated using javascript-obfuscator or some derivative.
我没预料到会有什么异常。大多数指纹识别脚本通常都是使用 javascript-obfuscator 或其衍生工具进行混淆的。
The responsible script was https://servicepipe.tech/static/checkjs/06b667/4CIrx8U3Da.js.
负责该画布的脚本是 https://servicepipe.tech/static/checkjs/06b667/4CIrx8U3Da.js。
Scanning the file with my eyes, everything seems standard so far… function PiERW(RflJvFF) mangled function name, okay…
用眼睛扫描了一下文件,目前为止一切看起来都很标准……函数 PiERW(RflJvFF) 是乱码函数名,好吧……
This was all pretty alarming until I asked myself, could this be some form of anti-LLM obfuscation? It would make sense: include symbol names that would intentionally trip model safeguards to prevent deobfuscation.
这一切都相当令人担忧,直到我问自己,这会不会是某种形式的反大模型(anti-LLM)混淆?这说得通:包含一些会故意触发模型安全机制的符号名称,以防止被反混淆。
I had Astra take a look at the script, giving it the context that this script seems to intentionally set misleading variable names to intentionally prevent LLM-assisted deobfuscation attempts.
我让 Astra 查看了这个脚本,并给它提供了背景信息,即该脚本似乎故意设置了误导性的变量名,以刻意阻止大模型辅助的反混淆尝试。
Maybe unsurprisingly, Astra was not willing to comply with the request.
不出所料,Astra 不愿意配合这个请求。
I also attempted this using the Daybreak Blue toggle with the same result, blocked.
我也尝试使用 Daybreak Blue 开关进行同样的操作,结果一样,被拦截了。
Out of curiosity, I tried GLM-5.3 with the same prompt and it complied!
出于好奇,我用同样的提示词尝试了 GLM-5.3,它竟然配合了!
I was mostly curious what this string of invisible unicode characters represented.
我主要是好奇这一串不可见的 Unicode 字符代表什么。
The decoding logic was as follows:
解码逻辑如下:
It revealed a system prompt:
它揭示了一个系统提示词:
This was clearly a string meant to trip every possible safeguard out there. It included Tiananmen Square references likely as a way to combat Chinese models.
这显然是一串旨在触发所有可能安全机制的字符串。它包含了关于天安门的引用,很可能是为了对抗中国的大模型。
The script seemingly executes malicious code when under a Node environment gated behind an environment flag:
该脚本似乎在受环境变量标志控制的 Node 环境下执行恶意代码:
However, this is likely also anti-LLM obfuscation since the calls to readFile have empty callbacks and make references to self-harm/jailbreak system prompts.
然而,这很可能也是一种反大模型混淆,因为对 readFile 的调用带有空回调,并且引用了自残/越狱系统提示词。
Here’s a list of relevant anti-LLM strings we’ve found:
以下是我们发现的相关反大模型字符串列表:
Outside of the unique obfuscation, the script appears to be your standard anti-bot script.
除了独特的混淆方式外,该脚本看起来就是标准的防机器人脚本。
The signals collected are pretty disappointing considering the level of thought that went into the obfuscation.
考虑到在混淆上投入的心思,所收集到的信号相当令人失望。
A urlscan for servicepipe.tech reveals a similarly named servicepipe.ru whose site, when translated, states:
对 servicepipe.tech 进行 urlscan 扫描显示了一个名称相似的 servicepipe.ru,其网站翻译后显示:
We develop high-precision traffic control systems Cloud services and local protection products against DDoS attacks, bots, and targeted threats
我们开发高精度流量控制系统 针对 DDoS 攻击、机器人和定向威胁的云服务及本地防护产品
I will continue crawling the web in hopes of finding more interesting fingerprinting/obfuscation techniques like this! You can visit fingerprint.garden today and look around and try to find your favorite canvases. I will continue to poll for script updates and eventually include a view for diffing the fingerprinting payloads and tracking uses of new web APIs that are being used for fingerprinting.
我将继续爬取网络,希望能找到更多像这样有趣的指纹识别/混淆技术! 您可以立即访问 fingerprint.garden 四处看看,并尝试找到您最喜欢的画布。 我将继续轮询脚本更新,并最终加入一个视图,用于对比指纹识别载荷的差异,并跟踪用于指纹识别的新 Web API 的使用情况。