웹 트래픽에서 에뮬레이터와 가상 머신 탐지하기
에뮬레이터와 VM은 디바이스 팜, 모바일 앱 에뮬레이션, 클라우드 브라우저 등 대규모 사기를 뒷받침한다. 이를 탐지하려면 가상화 환경이 완전히 재현할 수 없는 하드웨어·타이밍·정합성 신호를 읽어야 한다.
대규모로 실행되는 대부분의 사기는 가상화된 인프라 위에서 돌아간다. 대안 — 물리적인 휴대폰과 노트북으로 가득 찬 방 — 은 확장되지도 않고 숨겨지지도 않기 때문이다. 에뮬레이터나 가상 머신은 한 명의 운영자가 필요할 때마다 겉보기에 서로 다른 수천 대의 디바이스를 띄우게 해주며, 각각은 갓 사용을 시작한 소비자 엔드포인트처럼 보인다. 이 가상화를 탐지하는 것은 device intelligence 계층이 하는 일 중 가장 지렛대 효과가 큰 축에 든다. 개별 사기 행위를 하나씩 쫓는 대신 대규모 악용의 인프라 자체를 식별하기 때문이다.
이 글은 에뮬레이터와 VM이 웹 및 앱 트래픽에서 스스로를 어떻게 드러내는지를 다룬다: 가상화 환경이 재현하기 어려워하는 하드웨어·타이밍·정합성 신호, 왜 단일 신호만으로는 충분하지 않은지, 그리고 정당한 가상화를 망가뜨리지 않으면서 탐지 결과에 어떻게 대응할지. 대상 독자는 bot detection을 구축하거나 평가하는 엔지니어와 사기 대응 팀이다.
에뮬레이터와 VM이 사기에서 중요한 이유
에뮬레이터와 가상 머신이 중요한 이유는, 이들이 대량 사기를 위한 비용 효율적인 기반이기 때문이다 — 이들은 한 대의 머신을 깨끗해 보이는 디바이스 함대로 바꿔주며, 이것이 바로 대부분의 사기 경제가 요구하는 것이다.
사기에서 되풀이되는 문제는 규모다. 가짜 계정 하나나 부정 거래 하나로는 좀처럼 돈이 되지 않는다. 돈은 이를 수천 번 반복하는 데 있다. 수천 번 반복하려면 수천 개의 디바이스 신원이 필요한데, 플랫폼이 갈수록 디바이스 단위로 악용을 연결하기 때문이다(디바이스 핑거프린팅의 작동 원리 참조). 물리적 하드웨어는 많은 디바이스 신원을 얻는 정직한 방법이지만, 감당하기 어려울 만큼 비싸고 느리다. 가상화는 값싼 방법이다.
구체적으로, 가상화는 다음을 뒷받침한다:
디바이스 팜. 계정 생성, 프로모션 편취, 가짜 리뷰 작성, 또는 credential stuffing과 계정 생성 악용을 대량으로 실행하도록 조율된, 에뮬레이션된 모바일 디바이스나 headless browser 인스턴스의 랙. 각 에뮬레이션 인스턴스는 별개의 휴대폰이나 노트북으로 위장한다.
모바일 앱 에뮬레이션. 실제 휴대폰이 필요하도록 설계된 앱 기반 흐름 — 모바일 가입, 앱 전용 프로모션, 인앱 사기 — 을 자동화하기 위해 데스크톱이나 서버 하드웨어의 에뮬레이터에서 Android나 iOS 앱을 실행하는 것.
클라우드 브라우저와 browser-as-a-service. 클라우드 VM에서 실행되는 완전한 브라우저로, 스크래핑, 광고 사기, 계정 악용을 위해 자동화된다. 이들은 페이지를 완전히 렌더링하고 JavaScript를 실행하기 때문에 조잡한 봇보다 정교하다.
공통점은 이것이다: 하나의 물리적 머신, 여러 개의 가상 신원. 가상화를 탐지할 수 있다면 함대를 실제 크기로 되돌릴 수 있다 — 그리고 실제로는 에뮬레이션된 호스트 하나인 "천 명의 사용자"는 진짜 디바이스 천 대와는 완전히 다른 위험 판단이다. 이것이 가상화 탐지가 곱셈 효과를 내는 이유다: 대량 사기를 성립시키는 비용 구조를 직접 공격한다.
가상 머신을 드러내는 것
가상 머신은 소유하는 대신 합성해야 하는 물리적 신호로 스스로를 드러낸다 — GPU, 타이밍 동작, 센서, 그리고 그것이 돌아가는 하이퍼바이저의 저수준 아티팩트. 실제 소비자 하드웨어는 진짜라는 부수 효과로 이런 신호를 만들어낸다. VM은 이를 위조해야 하고, 그 모두를 정합성 있게 위조하는 것은 어렵다.
가상화된 GPU 시그니처. 이것은 가장 강력한 단서 중 하나다. 그래픽 렌더링은 실제 GPU, 그 드라이버, 그리고 부동소수점 동작에 의존한다. VM은 보통 가상화되거나 소프트웨어 렌더링된 그래픽을 사용한다 — SwiftShader, llvmpipe, VMware/VirtualBox/QEMU 가상 GPU, 또는 여전히 드러나는 문자열을 보고하는 패스스루 GPU. WebGL 렌더러와 벤더 문자열은 흔히 가상화를 직접 지목하며("SwiftShader", "llvmpipe", "VMware SVGA", "Google SwiftShader"), 그 문자열이 위조된 경우에도 canvas와 WebGL 렌더링 출력 자체가 미묘하고 위조하기 어려운 방식으로 물리적 GPU와 다르다. 실제 GPU는 복잡한 장면을 드라이버 고유의 특징적 아티팩트와 함께 렌더링하고, 소프트웨어 렌더링은 다른 시그니처를 만들어낸다.
지나치게 깨끗한 타이밍. 실제 하드웨어는 시끄럽다. JIT 컴파일, 가비지 컬렉션, 열 스로틀링, OS 인터럽트, 메모리 계층 효과가 타이밍 측정에 지속적인 지터를 도입한다. 가상화 환경 — 특히 고품질 인프라 위의 클라우드 호스팅 환경 — 은 흔히 지나치게 매끄럽게 돌아가며, 타이밍 변동성이 물리적 소비자 디바이스가 보이는 것보다 낮다. 특정 연산 패턴의 고해상도 타이밍 측정은 성능 프로파일이 부자연스럽게 균일한 환경을 드러낼 수 있다. 역설적이게도, 데이터센터 VM의 "깨끗함" 자체가 신호다.
하이퍼바이저 아티팩트. 가상화는 저수준 흔적을 남긴다: 하이퍼바이저 아래에서 달라지는 CPU 기능 플래그와 명령어 타이밍 특성, 특정 TSC(타임스탬프 카운터) 동작, 그리고 — 관측 가능한 경우 — 소비자 전형이 아니라 VM 전형 구성 주변으로 몰리는 하드웨어 동시성과 메모리 값. 소비자 노트북이라고 주장하면서 매우 서버 같은 코어 수와 메모리 프로파일을 보고하는 디바이스는 정합성이 없다.
오디오 및 기타 하드웨어 핑거프린트. AudioContext 핑거프린트는 오디오 서브시스템에 의존한다. 가상화되었거나 없는 오디오 하드웨어는 실제 사운드 하드웨어와 다른 부동소수점 출력을 만들어낸다. 단독으로는 작지만, 조합하면 유용하다.
네트워크 맥락. 에뮬레이터와 VM 함대는 흔히 데이터센터에서 실행되므로, 네트워크 계층 — 데이터센터 ASN, 호스팅 제공자 IP — 이 엔드포인트 신호를 뒷받침한다. VM 시그니처 그리고 데이터센터 IP는 둘 중 어느 하나만보다 훨씬 강력한 패턴이다. (정교한 운영자는 네트워크 측면을 숨기기 위해 VM 앞에 residential proxy를 두는데, 바로 그렇기 때문에 엔드포인트 수준의 VM 탐지가 독립적으로 중요하다 — 프록시를 거쳐도 살아남는다.)
모바일 에뮬레이터가 스스로를 드러내는 방식
모바일 에뮬레이터는 휴대폰에 적용된 동일한 원리로 스스로를 드러낸다: 이들은 물리적 디바이스의 특정 하드웨어·센서·렌더링 특성을 합성해야 하는데, 그 합성이 불완전하다. 데스크톱 하드웨어의 에뮬레이터에서 실행되는 Android나 iOS 앱은 휴대폰이 아니며, 수십 가지 신호가 그렇게 말한다.
하드웨어 신원 문자열. 에뮬레이터는 특징적인 디바이스 모델, 빌드 핑거프린트, 하드웨어 이름 값을 지닌다. Android 에뮬레이터는 역사적으로 "generic", "goldfish", "ranchu", "sdk*gphone" 및 유사한 빌드 식별자를 에뮬레이터 전형 모델명과 함께 보고해왔다. 이것들이 실제 디바이스를 흉내 내도록 패치된 경우에도, 모델·보드·CPU ABI·빌드 핑거프린트의 *조합_ 은 흔히 실제로 출시된 어떤 디바이스와도 일치하지 않는다 — x86 ABI를 가진 플래그십 휴대폰이라는 주장(실제 휴대폰은 ARM이다)은 드러나는 단서다.
없거나 가짜인 센서. 실제 휴대폰에는 가속도계, 자이로스코프, 자력계, 조도 센서, 기압계가 있으며, 결정적으로 이 센서들은 디바이스가 들리고 움직이는 동안 연속적이고 상관관계가 있으며 노이즈가 섞인 데이터를 만들어낸다. 에뮬레이터는 이런 센서가 없거나, 정적인 값을 보고하거나, 사람 손에 들린 디바이스의 자연스러운 변동성과 센서 간 상관관계가 없는 합성 패턴을 재생한다. 가속도계가 완벽한 상수를 읽는 "휴대폰", 또는 자이로스코프와 가속도계가 물리 법칙이 요구하는 대로 함께 움직이지 않는 "휴대폰"은 에뮬레이션된 것이다.
렌더링과 GPU 차이. 데스크톱에서와 마찬가지로, 모바일 GPU 렌더링 시그니처는 물리적 휴대폰의 모바일 GPU(Adreno, Mali, Apple GPU)와 에뮬레이션되거나 소프트웨어 렌더링된 것 사이에서 다르다. 특정 주장 휴대폰 모델과 일치해야 할 화면 밀도, 해상도, 렌더링 아티팩트가 흔히 일치하지 않는다.
타이밍과 성능 프로파일. 에뮬레이터에서 서버급 하드웨어 위에 실행되는 휴대폰 앱은 실제 휴대폰의 SoC에서 실행되는 동일한 앱과 다르게 동작한다 — 흔히 실제 디바이스보다 빠르고 매끄러운데, 이는 "지나치게 깨끗한" 단서의 또 다른 사례다.
모바일 사례는 센서 데이터가 결정적이 되는 지점인데, 잘 위조하기가 정말로 어렵기 때문이다. 실제 휴대폰 모션 센서의 연속적이고 물리적으로 정합적인 출력 — 같은 움직임에 대해 가속도계와 자이로스코프가 일치하고, 현실적인 사람 손의 미세 지터가 있는 — 을 재현하는 것은 모델명 문자열을 편집하는 것보다 훨씬 많은 작업이며, 대부분의 에뮬레이션 구성은 이를 설득력 있게 해내지 못한다.
왜 단일 신호만으로는 충분하지 않은가
어떤 단일 신호도 가상화를 확실하게 탐지하지 못한다. 어떤 신호든 그것을 아는 운영자가 위조할 수 있기 때문이다 — 그래서 견고한 탐지는 개별 검사가 아니라 신호 간 정합성에 의존한다. 이는 안티디텍트 브라우저 탐지를 지배하는 것과 같은 원리다: 개별 단서는 패치할 수 있지만, 그 모두에 걸친 정합성은 그렇지 않다.
작정한 운영자는 다음을 할 것이다:
- WebGL 벤더/렌더러 문자열을 위조하여 실제 GPU를 지목한다.
- Android 빌드 핑거프린트와 모델을 실제 휴대폰과 일치하도록 패치한다.
- 합성 센서 값을 주입하여 모션 데이터를 위조한다.
- VM 앞에 residential proxy를 두어 네트워크 신호를 정리한다.
이 중 어느 하나든 그 단일 신호에 의존하는 탐지기를 무력화한다. WebGL 렌더러 문자열만 검사하는 시스템은 문자열 편집에 당한다. 빌드 핑거프린트만 검사하는 시스템은 패치에 당한다.
어려운 것은 그 모두 를 한꺼번에 정합성 있게 해내는 것이다. WebGL 문자열을 위조해 Adreno GPU라고 주장하는 운영자도 여전히 실제 Adreno와 일치하지 않는 canvas 렌더링 출력을 만들어낸다. 모델명을 위조하는 운영자도 여전히 x86 ABI를 보고하거나, 그런 휴대폰에 없는 코어 수를, 또는 현실적인 센서 간 상관관계가 없는 센서 데이터를, 또는 주장하는 SoC에 비해 지나치게 깨끗한 타이밍을 보고한다. 그가 추가하는 각 위조는 나머지 모두와 일관성을 유지해야 하는 또 하나의 표면이며, 제약이 곱셈으로 늘어난다.
이것이 환경 정합성 원리다: 탐지는 "이 하나의 값이 가상화된 것처럼 보이는가"가 아니라 "이 모든 값이 하나의, 실제하고 물리적으로 가능한 디바이스를 기술하는가"이다. GPU가 소프트웨어처럼 렌더링되고, 센서가 상수를 읽고, ABI가 x86이며, 타이밍이 데이터센터처럼 매끄러운 자칭 iPhone은 한 가지 방식으로 정합성이 없는 게 아니라 — 네 가지 방식으로 정합성이 없으며, 그 넷을 동시에 조율하는 것이 비용이 드는 부분이다. 모든 신호에 걸쳐 완전한 정합성을 유지하는 비용이야말로, 단일 신호 검사가 실패하는 곳에서 정합성 기반 탐지가 버티게 하는 것이다. 더 넓은 군비 경쟁과 그 현주소는 봇 트래픽의 현주소에서 다룬다.
가상화 탐지에 대응하는 방법
가상화를 반사적으로 차단하지 말라 — 맥락 속에서 위험 신호로 가중하라. 정당한 가상화가 존재하며, 일괄 차단은 오탐을 유발하기 때문이다. 올바른 대응은 그 트래픽에 대해 다른 무엇이 참인지에 달려 있다.
사용자가 VM이나 에뮬레이터에 있을 실제적이고 정당한 이유가 있다: 에뮬레이터에서 테스트하는 개발자, 보안 연구자, VM에서 브라우저를 실행하는 프라이버시 중시 사용자, 기업의 가상 데스크톱 인프라, 접근성 구성. 모든 가상화를 무조건 차단하면 이런 사용자에게 불이익을 준다. 가상화는 위험 신호 이지 판결이 아니다.
생산적인 접근은 이를 등급화된 판단의 하나의 입력으로 취급한다:
- 가상화 단독, 그 외 정상적인 맥락: 낮음-중간 위험. 에뮬레이터를 쓰는 개발자 한 명은 사기가 아니다. 기록하되 차단하지 말라.
- 가상화 + 데이터센터 네트워크 + 갓 만든 계정 + 높은 속도: 높은 위험. 이것은 디바이스 팜 시그니처다 — 호스팅 인프라 위의 에뮬레이션된 엔드포인트가 계정을 빠르게 생성한다. 신호들이 서로를 뒷받침하여 확신 있는 판결로 이어진다.
- 가상화 + 정합성 위반(렌더링과 일치하지 않는 위조 문자열, 불가능한 하드웨어 조합): 높은 위험. 가상화에 더해 이를 숨기려는 능동적 시도 자체가 가장 강력한 신호다 — 정당한 VM 사용자는 플래그십 휴대폰을 사칭하려고 빌드 핑거프린트를 패치하지 않는다.
- 함대 상관관계: 많은 "서로 다른" 디바이스가 드러나는 가상화 시그니처를 공유하고 조율된 방식으로 행동할 때, 함대 탐지는 이들을 실제 출처로 되돌리며, 이는 개별 계정의 겉모습과 무관하게 결정적이다.
이 패턴은 headless browser 탐지와 bot detection 일반과 일관된다: 개별 신호가 점수에 기여하고, 신호의 조합이 판결을 만들며, 대응은 가상화 그 자체에 대한 무딘 차단이 아니라 등급화된다 — 허용, 챌린지, 또는 차단. 에뮬레이터와 VM 탐지는 독립적인 관문으로서가 아니라, 네트워크 및 행동 맥락과 결합되어 대량 사기 뒤의 인프라를 드러내는 높은 가중치의 신호로서 가장 가치 있다.
Tracio는 130개 이상의 신호에 걸친 device intelligence의 일부로 가상화를 탐지한다 — GPU와 렌더링 시그니처, 타이밍과 하드웨어 정합성 검사, 모바일 센서 및 빌드 신원 분석 — 그리고 이를 IP intelligence 네트워크 맥락과, 단일 신호 탐지기가 놓치는 위조 시도를 잡아내는 신호 간 정합성 검사와 결합한다. 이는 bot detection 계층을 거쳐 실행되며, 기저 신호를 첨부한 채 50ms 이내에 판결을 반환한다.
당신 자신의 퍼널에 있는 디바이스 팜과 에뮬레이터 트래픽에 대해 가상화 탐지가 어떻게 작동하는지 보고 싶은가?
무료 체험 시작하기 — 2,500건 검증 무료, 신용카드 불필요. 데모 예약하기로 당신의 특정 위협 모델에 대한 에뮬레이터와 VM 탐지를 함께 살펴보라.