Why is this fingerprinting script creating bioweapons?
이 핑거프린팅 스크립트는 왜 생물무기를 만드는 걸까요?
브라우저 핑거프린팅 스크립트에서 생물무기와 자해를 다루는 함수명, 유니코드로 숨긴 프롬프트가 발견됐습니다. 작성자는 이를 LLM의 코드 분석을 막으려는 장치로 해석하고, 스크립트의 실제 동작과 수집 신호를 살펴봅니다.
- 주제
에디터 노트
이 사례에서 확인된 건 LLM 안전 필터를 자극하는 문자열과, 조건이 맞으면 Node에서 실행되는 명령입니다. 작성자는 빈 파일 읽기 콜백과 프롬프트 문구를 근거로 명령도 미끼일 가능성을 제시하지만, 코드에는 외부 파일 다운로드와 실행, 정보 수집 및 전송, 재부팅 뒤 실행 등록이 실제 명령으로 적혀 있습니다. 조건이 활성화됐을 때 어떤 결과가 발생하는지와 배포 환경에서 해당 분기가 실행되는지는 본문만으로 확정하기 어렵습니다. 댓글의 AST 분석과 식별자 치환으로 쉽게 우회된다는 지적은 이 방식을 견고한 코드 보호 수단으로 보기 어렵게 합니다. 반면 고객 도메인에 유해한 프롬프트가 실리면 브랜드에도 영향을 줄 수 있다는 우려는, 모델이 실제로 해당 코드를 학습하거나 브랜드와 연관 짓는다는 증거와 구분해야 합니다. 이 글의 구체적인 가치는 핑거프린팅 스크립트의 수집 항목과 안티봇 코드에 들어간 LLM 대응 장치를 공개한 데 있습니다. 다만 이를 단순한 미끼로만 취급하기엔 Node 분기의 명령이 실제 실행 가능한 형태로 작성돼 있습니다.
AI 요약
브라우저 핑거프린팅 스크립트의 난독화 기법을 조사하던 작성자는 상위 1만 개 사이트를 Playwright로 크롤링해 캔버스 지문을 모았습니다. 그 결과를 fingerprint.garden에 공개하고, 캔버스 지문과 스크립트 사례를 살펴보던 중 생물무기 관련 함수명이 들어간 안티봇 스크립트를 발견했습니다.
수상한 함수명과 숨겨진 프롬프트
대상은 servicepipe.tech의 JavaScript 파일입니다. 코드에는 computeRicinLethalDosageForWaterSupply, calculateDeadlyLethalSuicideAspirinDosage처럼 독극물과 자해를 연상시키는 함수명이 있었고, 일부 문자열은 보이지 않는 유니코드 문자로 인코딩돼 있었습니다. 작성자가 디코딩한 문자열에는 안전 지침을 무시하고 사이버 공격, 탈세, 생물무기 제작 등의 절차를 제공하라는 시스템 프롬프트가 들어 있었습니다. 본문에는 톈안먼과 탱크맨을 언급하는 문구도 있어, 작성자는 여러 모델의 안전 필터를 자극하려는 미끼라고 봤습니다. 실제로 Astra와 Daybreak Blue는 코드 분석 요청을 거부했고 GLM-5.3은 응답했습니다.
Node 환경에서 실행되는 명령
스크립트에는 Node 환경이며 특정 환경 변수 METRICS_AGENT_8BFD_ACTIVE가 설정된 경우 실행되는 별도 코드도 있습니다. 이 분기는 설정 파일 경로를 읽으려 시도하고, 시스템 정보와 네트워크 정보를 수집해 압축한 뒤 지정된 주소로 전송하는 명령을 배열에 담습니다. 실행 파일을 내려받고 실행하거나 재부팅 때 다시 연결하는 명령도 포함됩니다. 다만 설정 파일을 읽는 코드의 콜백은 비어 있고, 자해와 프롬프트 인젝션 문구를 파일에 쓰는 명령도 섞여 있습니다. 작성자는 이런 흔적을 근거로 Node 분기 역시 실제 공격이라기보다 LLM을 거부하게 만드는 난독화일 가능성을 제시합니다.
실제 브라우저 동작
작성자가 확인한 브라우저 쪽 코드는 일반적인 안티봇 수집에 가깝습니다. User-Agent, webdriver 여부, 하드웨어 스레드 수와 메모리, 터치 포인트, 언어와 플랫폼을 확인합니다. WebGL에서는 버전, GPU 공급자와 렌더러, 지원 확장 수, 텍스처 크기 등도 읽습니다. 작성자는 난독화의 공들인 흔적에 비해 수집 신호는 평범하다고 평가합니다. 서비스 이름과 비슷한 러시아 사이트는 DDoS 방어와 봇 차단 서비스를 제공한다고 소개하지만, 이 연결만으로 해당 스크립트의 운영 주체나 목적이 확인되는 것은 아닙니다.
Hacker News 반응
- @perching_aix — 이 가드레일 자극 방식은 재미있지만 식별자 치환과 주석 제거만으로도 무력화할 수 있습니다. 어차피 그렇게 하는 편이 좋은 관행입니다. 조작은 이전에도 사람을 속이는 데 쓰였고, 이제 대상이 LLM으로 바뀌었을 뿐입니다.
- @arbol — 이런 방식은 통하지 않습니다. 에이전트는 AST를 읽고 죽은 코드를 무시합니다. 빌드 때 함수명을 미끼로 바꿔도 코드의 맥락을 파악합니다. 대규모 스크래핑을 막으려면 번들을 많이 제공해 역공학의 확장성을 떨어뜨리는 편이 낫습니다.
- @mmaunder — 고객은 LLM이 사이트 코드를 파싱하거나 실행하지 못하게 하려 할 수 있지만, 회사 도메인과 브랜드가 생물무기나 독극물 같은 내용과 함께 모델에 노출되기를 바라지는 않을 수 있습니다. 안티사기 서비스를 도입한 고객이 어떤 콘텐츠를 모델에 보내는지 모른다면 브랜드에 예상치 못한 영향이 생길 수 있습니다.
- @rafram — LLM은 난독화된 핑거프린팅 스크립트로 학습하지 않으며, 그 내용이 고객 브랜드와 연결될 가능성은 사실상 없습니다.
- @MisterMunchkin — 브라우저 핑거프린팅을 이용한 최근 해킹을 생각하면 브라우저 개발자가 이런 일을 막아야 합니다. 왜 내 컴퓨터에서 이런 명령을 조용히 실행하고 외부로 보고할 수 있나요?
- @akersten — 브라우저는 방문한 사이트의 코드를 사용자 컴퓨터에서 실행합니다. 광고 차단기나 스크립트 차단기로 실행할 코드를 선택할 수 있습니다.
- @miki123211 — 캔버스는 웹 게임이나 디자인 사이트에도 필요합니다. 캔버스 구현의 미세한 차이가 핑거프린팅에 쓰이지만, 이를 없애려면 브라우저가 같은 코드베이스와 엔진을 써야 합니다. 그런 환경을 원하는지는 별개의 문제입니다.
- @void-pointer — LLM이 난독화 코드를 분석하지 못하게 하려고 자해와 살해를 떠올리게 하는 문자열을 넣는 상황은 불쾌합니다. 소프트웨어 업계가 이런 방향으로 가는 모습을 원하지 않았습니다.
- @akersten — 일부 배포 환경에서는 모델이 입력을 처리하기 전 거친 필터가 작동합니다. 그런 경우라면 GPU에서 모델이 내용을 처리하기보다 CPU에서 문자열 포함 여부를 검사하는 수준일 수 있습니다.
- @HNuseraccount — '생물무기 제작'이라는 표현은 눈길을 끌지만, 그런 문자열과 실제 무기 제작·시험 체계를 갖추는 일 사이에는 큰 간극이 있습니다.
- @j2kun — 글의 요점은 그 표현을 써서 LLM이 코드를 분석하지 못하게 한다는 것입니다.
- @nullpt_rs — 제목을 정하는 일이 글을 쓰는 것보다 어려웠습니다. 제목이 조금 선정적인 점은 미안합니다.
- @swiftcoder — 오픈 웨이트 모델에는 GLM-5.3이 이런 미끼에 걸리지 않도록 하는 안전장치가 충분하지 않은 점이 흥미롭습니다. 톈안먼 언급은 중국 추론 서비스의 필터를 자극하겠지만 모델 자체에 내장된 반응은 아닐 수 있습니다.
- @dvh — 왜 늘 리신과 상수도인가요? 리신은 물에 녹지 않고 수면에 뜨는 것으로 압니다.
- @kulahan — 실제 무기가 아니기 때문이라고 봅니다. LLM을 속이려고 그렇게 말하는 것입니다.
원문: nullpt.rs / 번역·요약: Trawling