안티디텍트 브라우저

안티디텍트 브라우저: 핑거프린트는 주입한 JavaScript가 아니라 커널에서 바뀝니다

브라우저는 어느 것이나 자기가 돌아가는 기계에 관한 작은 사실 수백 개를 웹사이트에 넘깁니다. 화면 크기, 폰트 목록, 그래픽 카드, 오디오 구성. 이것들이 모이면 그 기계를 충분히 특정할 수 있어서, 같은 자리에서 로그인한 두 번째 계정도 같은 사람으로 알아봅니다. 안티디텍트 브라우저는 프로필마다 다른 기계처럼 보이게 하려고 있습니다. 그걸 어떻게 해내는가가 제품 사이의 차이 전부이고, 대부분의 제품 페이지가 건너뛰는 부분도 바로 거기입니다.

무료로 시작
도구 종류에 따라 핑거프린트를 어디에 쓰는가 페이지 스크립트는 이 스택의 맨 위에서 돌기 때문에, 거기에 주입한 값은 덮어써지기 전에 읽힐 수 있고, 그 아래는 손이 전혀 닿지 않습니다. SigoLogin은 그 아래 두 계층에 씁니다. 페이지 스크립트가 닿지 못하는 곳입니다. 페이지 스크립트 웹 API: navigator, canvas, WebGL 브라우저 커널(C++) 네트워크: 헤더, Client Hints, 핸드셰이크 주입한 JavaScript가 쓰는 곳 SigoLogin이 쓰는 곳
페이지 스크립트는 이 스택의 맨 위에서 돌기 때문에, 거기에 주입한 값은 덮어써지기 전에 읽힐 수 있고, 그 아래는 손이 전혀 닿지 않습니다. SigoLogin은 그 아래 두 계층에 씁니다. 페이지 스크립트가 닿지 못하는 곳입니다.

무엇이 들어 있나

커널에서 바꿉니다

값은 페이지 스크립트가 돌기 전에 C++에서 쓰입니다. 나중에 Chrome 위에 주입하는 방식이 아닙니다.

폰트를 세 갈래로 걸러냅니다

너비 측정, 이름 조회, 로컬 폰트 API가 모두 같은 목록에서 답하므로 서로 일치합니다.

프로필마다 프록시 하나

인증을 쓰는 HTTP와 SOCKS5, 옆으로 새는 DNS 없음, 시간대는 프록시가 있는 나라에서.

프로필마다 실제 기기 하나

화면, 코어, 메모리, 그래픽 카드가 모두 같은 실측 기계에서 나오고, 섞이는 일이 없습니다.

세션이 바뀌어도 그대로

같은 프로필은 열 때마다 같은 캔버스를 그립니다. 흔들리는 핑거프린트는 아예 없는 것보다 못합니다.

재서 말합니다

같은 기계에서 진짜 Chrome과 맞대어 재서 나온 것이고, 설계로 따져 낸 것이 아닙니다.

안티디텍트 브라우저란

안티디텍트 브라우저는 컴퓨터 한 대에서 브라우저 프로필을 여러 개 돌리고, 프로필마다 제 신원을 줍니다. 자기 핑거프린트, 자기 쿠키, 자기 프록시, 디스크 위의 자기 폴더. 서로 공유하는 것이 없으니, 프로필 A를 본 사이트가 그것을 프로필 B와 묶을 방법이 없습니다.

브라우저 핑거프린트란 실제로 무엇인가

핑거프린트는 값 하나가 아닙니다. 어떤 페이지든 던질 수 있는 질문에 브라우저가 내놓는 답의 묶음입니다. User-Agent가 뭐라고 하는지, 화면이 얼마나 큰지, CPU 코어를 몇 개라고 알리는지, 어떤 폰트가 잡히는지, 그래픽 드라이버가 어떤 문자열을 돌려주는지, 캔버스가 픽셀 단위로 무엇을 그리는지. SigoLogin은 프로필마다 이런 표면 15개를 씁니다. 신원을 가르는 무게가 실린 것들입니다.

위험한 것은 답 하나가 아니라 조합입니다. User-Agent로는 macOS라면서 WebGL 렌더러는 Direct3D 드라이버 이름을 대는 기계는 존재하지 않는 기계이고, 존재하지 않는 기계는 평범한 기계보다 훨씬 쉽게 눈에 띕니다.

프록시만으로는 부족한 이유

프록시는 요청이 나가는 주소를 바꿉니다. 브라우저 안은 아무것도 바꾸지 않습니다. 서로 다른 프록시를 쓰는 계정 두 개도 여전히 같은 화면, 같은 폰트 목록, 같은 그래픽 카드, 같은 캔버스 픽셀을 알리고, 둘을 묶기에는 그 정도면 충분합니다.

반대 방향도 마찬가지입니다. 주소는 미국에 있는데 시간대는 자카르타라고 알리는 프로필은 누가 핑거프린트를 읽기도 전에 이미 자기모순에 빠진 상태입니다. SigoLogin은 시간대와 언어를 프록시가 있는 나라에서 가져오기 때문에 둘이 어긋날 수 없습니다.

만드는 방식 두 가지, 그리고 그게 중요한 이유

안티디텍트 브라우저는 대부분 평범한 Chrome에 페이지마다 JavaScript를 주입해 navigator, canvas, WebGL을 덮어쓰는 방식입니다. 만들기 싸고 간단한 검사는 통과합니다. 흔적도 남깁니다.

JavaScript를 주입하는 도구

  • 덮어쓴 함수는 네이티브로 보이지 않습니다. 패치된 메서드에 toString을 부르면 진짜와 다른 문자열이 나옵니다.
  • 주입은 페이지가 로드되기 시작한 뒤에 일어납니다. 첫 줄에서 값을 읽는 스크립트는 진짜 값을 읽습니다.
  • JavaScript 바깥은 손대지 못한 채 남습니다. 요청 헤더, Client Hints의 순서, 요청마다 함께 가는 언어.
  • JavaScript에서 폰트를 감춰도 그 폰트가 실제로 글자를 얼마나 넓게 그리는지는 바뀌지 않습니다.
  • 표면이 하나 늘 때마다 주입할 스크립트가 하나씩 더 필요하고, 스크립트 하나하나가 눈에 띌 거리가 됩니다.

SigoLogin

  • 값은 페이지 스크립트가 돌기 전에 C++에서 쓰이므로, 찾아낼 패치된 함수 자체가 없습니다.
  • 커널이 첫 줄부터 프로필의 값으로 답합니다.
  • Client Hints와 헤더, 로케일은 네트워크 계층에서 설정되어, 페이지가 읽는 User-Agent와 맞아떨어집니다.
  • 폰트 조회를 폰트 엔진에서 걸러내므로, 측정한 너비가 알린 목록과 일치합니다.
  • 패치 19개를 Chromium 152 빌드 하나에 컴파일해 넣고, 브라우저가 뜨기 전에 적용합니다.

우리 방식의 대가는 분명히 말해 두는 게 맞습니다. 브라우저를 통째로 컴파일하기 때문에 Chrome 새 버전을 따라잡는 데 몇 분이 아니라 며칠이 걸리고, 커널은 몇 메가바이트가 아니라 내려받는 데 약 2 GB입니다.

비교

SigoLogin이 바꾸는 것, 표면별로

프로필마다 시드에서 생성한 핑거프린트를 받으므로, 같은 프로필은 열 때마다 똑같습니다. 세션마다 흔들리는 핑거프린트는 아예 위장하지 않는 것보다 더 수상합니다. 모든 값은 실제 기기 계열 하나에서 가져오고, 필드를 기계끼리 섞는 일은 없습니다.

신원

  • platform
  • browser
  • locale

노이즈 추가

  • canvas
  • webgl
  • webgpu
  • audio
  • clientRects

기계

  • screen
  • hardware
  • battery

환경

  • fonts
  • mediaDevices
  • webrtc
  • network
프로필마다 쓰이는 표면 15개입니다. 모두 실제 기기 계열 하나에서 나오므로 답이 서로 맞아떨어집니다. 기계끼리 필드를 섞는 것이 바로 아무도 갖고 있지 않은 컴퓨터를 만들어 내는 일입니다.

폰트

설치된 폰트 목록은 페이지가 읽을 수 있는 신호 중에서도 강한 축에 들고, 페이지는 이것을 세 갈래로 셉니다. 글자가 그려지는 너비를 재는 것, 폰트를 이름으로 요청하는 것, 그리고 로컬 폰트 API. 세 갈래 모두 커널에서 걸러지므로 세 답이 서로 일치합니다.

Windows 프로필은 폰트 약 300개를 알립니다. 목록에서 베낀 것이 아니라 실제 기계에서 잰 값입니다. macOS 폰트 모음은 같은 방식으로 재서 약 1,185개가 나옵니다. 여기에는 넘을 수 없는 한계가 있고, 감추기보다 말해 두겠습니다. 커널은 폰트를 가릴 수는 있어도 만들어 낼 수는 없습니다. 운영체제가 항상 설치하는 폰트를 가리면 아무도 갖고 있지 않은 기계를 지어내는 셈이고, 그래서 목록은 짐작이 아니라 재서 만듭니다.

플랫폼

캔버스, WebGL, WebGPU

캔버스와 오디오, 텍스트 사각형 측정값에는 프로필 시드에서 뽑은 결정적 노이즈가 들어갑니다. 한 프로필은 언제나 같은 픽셀을 그리고, 시드가 다르면 다른 픽셀을 그립니다. WebGL과 WebGPU는 서로 같은 카드를 알립니다. 페이지가 둘 다 물어보고 견줄 수 있기 때문입니다. 이 검사는 WebGL은 GeForce RTX 3060이라고 하는데 WebGPU 어댑터는 개발 기계의 Intel 칩 이름을 대던 빌드를 발견한 뒤에 넣었습니다.

화면, 하드웨어, 장치

화면 크기, 사용 가능 높이, 픽셀 비율, CPU 코어, 알리는 메모리 용량, 터치 포인트, 그리고 마이크와 스피커, 카메라의 이름표까지 모두 같은 기기 계열에서 나옵니다. 여기서는 작은 항목이 결정합니다. macOS에서 Chrome은 스레드가 아니라 물리 코어를 알리고, 알리는 메모리의 상한은 Chrome 버전에 따라 바뀌었습니다. 둘 중 하나만 틀려도 아무도 팔지 않는 컴퓨터를 묘사하게 됩니다.

WebRTC, 시간대, 언어

WebRTC는 고전적인 누출 경로입니다. 프록시 뒤에 있어도 진짜 로컬 주소를 알릴 수 있습니다. 프록시가 있는 프로필에서는 그 경로를 닫아 두므로 진짜 주소가 나갈 곳이 없습니다. 프록시 주소로 꾸며 내는 대신 누출 자체를 막습니다. 프록시가 없는 프로필은 꾸며 대지 않고 사실대로 답합니다. 실제 기계 중에 WebRTC를 꺼 둔 경우는 아주 드물고, 꺼 두는 것 자체가 또 하나의 표시이기 때문입니다. 시간대와 수락 언어는 기계 설정이 아니라 프록시가 있는 나라를 따릅니다.

프록시와 DNS

TLS와 HTTP/2 핸드셰이크 준비 중

핸드셰이크는 HTML 첫 바이트가 도착하기도 전에 일어나고 페이지 스크립트는 거기에 닿지 못합니다. 바꿀 값어치가 있는 이유도, JavaScript 주입으로 만든 도구가 손댈 수 없는 이유도 바로 그것입니다. 지금 만드는 중이고 현재 릴리스에는 없습니다. 다 된 것으로 짐작하게 두느니 여기에 미완성이라고 적어 두는 편이 낫습니다.

작동한다는 걸 어떻게 아는가

설계를 믿어 달라고 하고 싶지는 않습니다. 모든 표면은 같은 기계에서 진짜 Chrome과 맞대어 재고, 프로필은 공개된 탐지 사이트에 돌려 봅니다.

어긋나는 곳은 고치거나 적어 둡니다. 뭉개지 않습니다. 이 페이지에 없는 것은 점수입니다. 그 사이트들이 내놓는 숫자는 방문할 때마다 달라지고 서로 어긋나므로, 여기에 하나를 박아 두는 것은 남의 알고리즘을 두고 약속하는 일이 됩니다. 그 사이트들이 진짜로 도움이 되는 대목은 우리 쪽 버그를 찾아내는 일입니다.

재는 일은 우리 실수를 잡아내는 일이기도 합니다. 폰트 필터를 처음 내보냈을 때 한 탐지 사이트가 등을 돌렸습니다. 그전에는 믿을 만하다고 읽히던 프로필이 의심스럽다고 읽히기 시작했습니다. 원인은 필터가 Windows 11 자체에 딸려 오는 폰트 열한 개를 가려 버린 것이었고, 그래서 프로필은 있을 수 없는 Windows 기계를 묘사하고 있었습니다. 목록을 고치자 없어졌습니다. 이건 아무리 따져 봐도 나오지 않았을 문제입니다. 돌려 봐야만 나왔습니다.

우리 쪽 버그 전, 버그 중, 버그 후 탐지 사이트의 판정 탐지 사이트 한 곳이 프로필 하나에 내린 판정입니다. 우리 쪽 버그 전, 버그 중, 버그 후입니다. 폰트 필터는 Windows 11이 항상 설치하는 폰트 열한 개를 가린 채로 나갔고, 그러면 있을 수 없는 기계를 묘사하는 셈이어서 판정이 뒤집혔습니다. 목록을 고치자 판정이 돌아왔습니다. 따져 봐서는 나오지 않았을 문제이고, 돌려 보니 나왔습니다. 폰트 필터 전 버그가 있을 때 고친 뒤 믿을 만함 의심스러움 믿을 만함
탐지 사이트 한 곳이 프로필 하나에 내린 판정입니다. 우리 쪽 버그 전, 버그 중, 버그 후입니다. 폰트 필터는 Windows 11이 항상 설치하는 폰트 열한 개를 가린 채로 나갔고, 그러면 있을 수 없는 기계를 묘사하는 셈이어서 판정이 뒤집혔습니다. 목록을 고치자 판정이 돌아왔습니다. 따져 봐서는 나오지 않았을 문제이고, 돌려 보니 나왔습니다.

안티디텍트 브라우저가 하지 못하는 일

핑거프린트는 여러 신호 가운데 하나이고, 나머지에 대해 분명히 말해 두는 편이 지키지 못할 약속보다 낫습니다.

자주 받는 질문

안티디텍트 브라우저는 합법인가요?

이 소프트웨어는 브라우저이고, 자기 컴퓨터에서 브라우저 프로필을 여러 개 돌리는 것 자체는 위법이 아닙니다. 규칙이 붙는 것은 그것으로 무엇을 하는가입니다. 사는 곳의 법, 그리고 이용하는 사이트의 약관. 우리는 사기나 사칭을 돕지 않고, 약관에도 그렇게 적혀 있습니다.

Chrome은 안티디텍트 브라우저인가요?

아닙니다. Chrome 프로필은 쿠키와 방문 기록을 나누어 가장 눈에 띄는 연결 고리는 없애 주지만, 프로필마다 같은 화면, 같은 폰트, 같은 그래픽 카드, 같은 캔버스 픽셀을 알립니다. 전부 같은 기계에서 돌기 때문입니다. 저장소가 따로라고 해서 신원이 따로인 것은 아닙니다.

VPN이나 프록시와는 어떻게 다른가요?

프록시나 VPN은 요청이 나가는 주소만 바꿉니다. 브라우저는 여전히 같은 컴퓨터를 묘사합니다. 둘은 서로를 대신하기보다 함께 씁니다. SigoLogin은 프로필마다 프록시 하나를 전제로 하고, 시간대와 언어를 그 프록시가 있는 나라에서 가져와 주소와 어긋나지 않게 합니다.

무료 요금제가 있나요?

프로필 3개가 무료이고, 핑거프린트 엔진은 유료 요금제와 같습니다. 무료 요금제의 제한은 프로필 개수에 있지, 얼마나 잘 보호되는지에 있지 않습니다. 유료 요금제는 프로필 수와 활성화할 수 있는 기기 수를 늘려 줍니다.

제 데이터가 그쪽 서버로 가나요?

프로필은 내 디스크 위의 폴더이고, 그 안의 쿠키와 저장된 로그인, 방문 기록은 거기 그대로 남습니다. 앱은 이 사이트에서 내 프로필을 볼 수 있도록 관리용 필드 몇 개와 오류 로그를 보냅니다. 팀원에게 프로필을 공유하는 것만 예외인데, 그 사람은 다른 기계 앞에 앉아 있기 때문입니다. 개인정보 페이지가 필드를 하나하나 적어 둡니다.

어떤 운영체제에서 돌아가나요?

Windows 10과 11, 그리고 macOS 13 이상, 64비트입니다. Intel용과 Apple silicon용 빌드가 모두 있습니다. Linux는 시작도 하지 않았습니다. 플랫폼 페이지에 무엇이 있고 무엇이 없는지 적어 두었습니다.

더 읽기

이 페이지가 던진 질문에 대한 더 긴 답.

이게 맞는 도구인지 확신이 안 서나요?

답에 걸린 이해관계가 없는 어시스턴트에게 물어보세요.

어떻게 쓰나

  1. 1

    설치하고 연결

    Windows에 설치하고, 앱을 열고, 여기로 로그인시키는 버튼을 누르세요. 커널은 한 번만 내려받습니다.

  2. 2

    프로필 만들기

    이름을 붙이고 프록시를 연결하세요. 핑거프린트는 시드에서 생성되고 그 뒤로는 그대로 유지됩니다.

  3. 3

    열고, 계속 엽니다

    열 때마다 같은 신원을 다시 씁니다. 프로필을 공유하면 팀원이 자기 기계에서 같은 기기를 엽니다.

프로필 3개 무료, 엔진은 유료 요금제와 같습니다

Windows 10과 11, 또는 macOS 13 이상, 64비트. 시작할 때 카드가 필요 없습니다.

이어서 읽기