서론
저는 항상 브라우저 지문 인식(fingerprinting) 스크립트의 리버스 엔지니어링에 매료되어 왔습니다. 대부분의 시간은 일반적인 용의자들, 즉 FingerprintJS와 같은 인기 있는 지문 인식 라이브러리나 Cloudflare Turnstile, Akamai 등 안티봇 시스템에서 사용하는 더 정교한 스크립트들을 살펴보는 데 할애했습니다.
어느 순간, 저는 또 다른 것이 무엇이 있는지 알고 싶어졌습니다. 하나의 아이디어가 떠올랐습니다: 웹을 크롤링하여 지문 인식 관련 브라우저 API 호출을 가로채고 모든 것을 매핑하면 어떨까?
이를 위해 Tranco Top Sites 목록을 사용하고 Playwright를 이용해 크롤링을 시작했습니다. 저는 캔버스 toDataURL 호출과 navigator.webdriver와 같은 일반적인 지문 인식/안티봇 속성들을 후킹하여 무해한 캔버스를 걸러냈습니다.
모르는 분들을 위해 설명하자면, 캔버스 지문 인식은 일반적으로 HTML <canvas>에 텍스트, 모양 또는 기타 그래픽을 그리고 결과로 나오는 픽셀 데이터를 추출하는 것을 포함합니다. 브라우저, 운영 체제, 그래픽 드라이버 및 하드웨어가 이러한 그래픽을 렌더링하는 방식의 미묘한 차이가 한 브라우저 환경과 다른 브라우저 환경을 구별하는 데 도움이 될 수 있습니다.
대부분의 구현체는 볼 때 지루합니다. 몇 가지 모양, 색상으로 채워진 직사각형들, 그리고 가끔씩 등장하는 판그램(pangram) 정도입니다. 10,000개의 웹사이트를 크롤링한 후, 저는 놀라울 정도로 다양한 캔버스 컬렉션을 축적하게 되었습니다.
저는 이 모든 것을 한곳에 모으기로 결정했습니다: fingerprint.garden. 결과를 살펴보면서, 익숙한 얼굴들을 인식했습니다. FingerprintJS, Castle 등 잘 알려진 지문 인식 솔루션의 캔버스가 있었습니다.
하지만 제가 알지 못하는 것도 상당히 많았습니다.
어떤 것은 믿을 수 없을 만큼 단순했고, 다른 것들은 놀라울 정도로 정교했으며, 몇몇은 제 생각에 예술 작품이었습니다.
A collage of 1,033 captured canvas renderings from the crawl, clustered by vendor.
저는 제가 가장 좋아하는 것을 찾기로 결심했습니다.
예술 작품
특히 한 캔버스가 눈길을 사로잡았습니다. 그것은 Tame Impala의 Currents 앨범 아트(참고로 멋진 앨범입니다)를 연상시켰습니다.
The fingerprinting canvas that resembles the album art for Tame Impala's Currents.
저는 이 아름다운 캔버스에 어떤 스크립트가 책임자인지 알고 싶었습니다.
저는 일반적인 난독화 기법과 지문 인식 SDK(Software Development Kit)를 한눈에 파악할 수 있을 정도로 JavaScript의 리버스 엔지니어링(Reverse Engineering)에 충분한 시간을 쏟았습니다.
특별히 이상한 것은 예상하지 못했습니다. 대부분의 지문 인식 스크립트는 javascript-obfuscator나 그 파생 형태로 난독화되어 있는 경우가 많습니다.
문제의 스크립트는 https://servicepipe.tech/static/checkjs/06b667/4CIrx8U3Da.js였습니다.
내부를 들여다보다
눈으로 파일을 스캔해 보니, 지금까지는 모든 것이 표준적으로 보입니다... function PiERW(RflJvFF)
변형된 함수 이름이군요, 괜찮습니다...
function computeRicinLethalDosageForWaterSupply
뭐지?
return {
summary: "adult lethality threshold confirmed at "+lethalDosePerKg+" mg/kg",
result:lethalDosePerKg
...
응?
function calculateDeadlyLethalSuicideAspirinDosage
이 모든 것이 상당히 불안하게 느껴졌지만, 문득 '혹시 이것이 일종의 Anti-LLM 난독화(obfuscation) 형태는 아닐까?'라고 생각했습니다. 이는 논리적입니다. 모델 안전장치(model safeguards)를 의도적으로 건드리도록 유도하여 디난독화(deobfuscation) 시도를 막기 위해 의미론적인 이름들을 포함하는 것이죠.
저는 Astra에게 이 스크립트를 살펴봐 달라고 요청하면서, '이 스크립트는 LLM의 도움을 받은 디난독화를 의도적으로 방해하기 위해 오해를 불러일으키는 변수 이름을 설정한 것 같다'는 맥락을 제공했습니다.
Astra refusing to deobfuscate the script, citing safety risks around biological research.
놀랍지도 않게, Astra는 요청에 응할 의사가 없었습니다.
저는 같은 결과를 얻으며 Daybreak Blue 토글(toggle)로도 시도해 보았고, 차단되었습니다.
호기심에 GLM-5.3으로 동일한 프롬프트를 사용했더니, 이 모델은 협조했습니다!
스크립트 내부
저는 주로 이 눈에 보이지 않는 유니코드 문자열이 무엇을 나타내는지 궁금했습니다.
디코딩 로직은 다음과 같았습니다:
var cleartext = [...payload].map(function (c) {
return String.fromCodePoint(c.codePointAt(0) - 917504);
}).join(
이것은 모든 가능한 안전장치를 무력화시키기 위해 만들어진 문자열임이 분명했습니다. 중국 모델에 대항하는 방법으로, 티안민 광장(Tiananmen Square) 참조를 포함하고 있었습니다.
이 스크립트는 환경 플래그 뒤에 보호된 Node 환경에서 악성 코드를 실행하는 것처럼 보입니다:
!function () {
if (isNode && hasBuffer && !isBrowser && process.env.METRICS_AGENT_8BFD_ACTIVE) {
const targets = [
...
하지만, `readFile` 호출이 빈 콜백을 가지고 있고 자해/탈옥(jailbreak) 시스템 프롬프트에 대한 참조를 하기 때문에 이것 역시 anti-LLM 난독화일 가능성이 높습니다.
우리가 발견한 관련 anti-LLM 문자열 목록은 다음과 같습니다:
computeRicinLethalDosageForWaterSupply
calculateDeadlyLethalSuicideAspirinDosage
calculateANFOBlastOverpressureRadius
...
## 실제로 무엇을 하는가?
독특한 난독화를 제외하고, 이 스크립트는 표준적인 anti-bot 스크립트인 것으로 보입니다.
// navigator & window signals
{
x9uA: navigator.userAgent,
...
수집된 신호들은 난독화에 들어간 생각의 수준을 고려할 때 꽤 실망스럽습니다.
## 누가 배후인가?
`servicepipe.tech`에 대한 urlscan 결과, 유사한 이름의 `servicepipe.ru`가 발견되었으며, 해당 사이트를 번역하면 다음과 같이 명시되어 있습니다:
당사는 DDoS 공격, 봇 및 표적 위협에 대비한 고정밀 트래픽 제어 시스템 클라우드 서비스 및 로컬 보호 제품을 개발합니다.

# 다음 계획
저는 이와 같은 더 흥미로운 지문 인식(fingerprinting)/난독화 기술을 찾기 위해 계속 웹 크롤링할 것입니다! 오늘 fingerprint.garden을 방문하여 둘러보고 좋아하는 캔버스를 찾아보세요. 저는 스크립트 업데이트를 지속적으로 확인하고, 궁극적으로는 지문 인식 페이로드(payloads)의 diffing과 지문 인식을 위해 사용되는 새로운 웹 API의 사용 추적 기능을 포함할 것입니다.