서론: 게임 피싱 공격의 진화와 BitB 공격 벡터
지난 10여 년간 스팀(Steam), 에픽게임즈(Epic Games), 디스코드(Discord) 등 PC 게이머를 노린 피싱 공격은 대체로 직관적으로 식별 가능한 방식에 의존해 왔습니다. 철자를 교묘히 바꾼 가짜 도메인(예: staemcommunitly.com), 암호화되지 않은 HTTP 연결, 조잡하게 모방된 웹 UI 등이 대표적이었습니다. 이에 보안 의식이 높은 게이머들은 한 가지 확고한 기본 수칙을 체득했습니다. 계정 정보를 입력하기 전, 브라우저 주소창의 정식 도메인과 녹색 SSL 자물쇠 표시를 반드시 확인하라는 원칙입니다.
그러나 게이밍 커뮤니티를 표적으로 삼는 사이버 범죄자들의 기술은 한층 치명적으로 진화했습니다. 브라우저 내 브라우저(Browser-in-the-Browser, 이하 BitB) 피싱 기법의 등장은 전통적인 육안 주소창 확인 방식을 완전히 무력화시켰습니다. BitB 공격에서 피해자는 외부의 수상한 사이트로 리다이렉트되지 않습니다. 대신 악성 웹사이트 자체가 문서 객체 모델(DOM) 내부에 운영체제(OS) 창을 픽셀 단위로 정밀하게 모사한 가짜 브라우저 창을 렌더링합니다.
이 모사 창은 https://steamcommunity.com이 선명하게 적힌 가짜 주소창, 완벽한 SSL 자물쇠 그래픽, OS 네이티브 창 제어 버튼(최소화, 최대화, 닫기)을 그대로 갖추고 있습니다. 여기에 실시간 중간 브라우저(Browser-in-the-Middle, 이하 BitM) 역방향 프록시(Reverse Proxy) 시스템이 결합되면서, 사용자가 입력한 아이디와 비밀번호, 스팀 가드 모바일 일회용 인증 코드(2FA)까지 실시간으로 가로채 단 몇 초 만에 계정 인증 세션을 탈취하고 보관함을 비워버립니다.
BitB 공격의 기술적 해부: DOM 윈도우 시뮬레이션과 역방향 프록시 중계
BitB 공격은 클라이언트 단의 정밀한 DOM 위장 기술과 서버 단의 실시간 역방향 프록시 릴레이가 결합되어 작동합니다.
[피해자의 브라우저 화면: 피싱 웹사이트 "cs2-tournament-bracket.com"]
│
├─► [BitB 가짜 윈도우 컨테이너 (DOM [div] 노드)]
│ ├── 위조된 창 타이틀바 및 OS 제어 버튼 (최소화 / 최대화 / 닫기)
│ └── 위조된 정적 주소창: 표시 내용 "https://steamcommunity.com/openid/login"
│
└─► [내장 Iframe / 로그인 입력 폼 / WebSocket 실시간 중계]
│
▼ (입력된 계정 ID, 비밀번호, 스팀 가드 2FA 코드를 실시간 탈취)
[공격자의 역방향 프록시 서버 (예: Evilginx 또는 Muraena)]
│
▼ (탈취한 유효 인증 정보를 밸브 공식 서버로 즉시 전달)
[스팀 공식 인증 엔드포인트 (valve / steamcommunity.com)]
│
▼ (밸브가 정식 인증 세션 쿠키 발급: steamLoginSecure, sessionid)
[공격자가 세션 쿠키 가로챔 -> 인벤토리 자동 탈취 및 API Key 장악]
클라이언트 위장: DOM 기반의 브라우저 창 완벽 복제
정상적인 스팀 OpenID 제3자 연동 과정에서는 웹사이트가 자바스크립트의 window.open() 함수를 호출하여 OS가 직접 관리하는 완전히 독립된 브라우저 자식 창을 생성합니다. 이 창의 주소창은 OS가 렌더링하므로 위조가 불가능합니다.
반면 BitB 공격에서는 OS 레벨의 새 창 프로세스가 전혀 생성되지 않습니다.
- 모달 컨테이너 생성: 피싱 웹페이지는 CSS 절대 위치 지정(
position: fixed등)을 사용하여 최상단 레이어에div요소를 띄우고, 데스크톱 창의 외형을 완벽히 모방한 테두리와 그림자 효과를 입힙니다. - 브라우저 프레임 복제: 공격자는 벡터 SVG 아이콘과 CSS 스타일링을 통해 뒤로 가기, 새로고침, 보안 자물쇠, 그리고
https://steamcommunity.com이 적힌 주소창을 그립니다. 이 주소창은 실제 브라우저 기능을 수행하지 않는 단순한 HTML 텍스트 블록에 불과합니다. - 환경 동적 적응: 최신 BitB 템플릿은
navigator.userAgent를 분석하여 피해자의 OS(Windows 10/11, macOS, Linux)와 브라우저 엔진을 판별합니다. 이에 맞춰 시스템 기본 글꼴과 창 버튼 모양을 동적으로 일치시키므로 시각적 위화감을 찾아내기 어렵습니다.
서버 단 가로채기: 역방향 프록시와 2FA 실시간 무력화
피해자가 가짜 창에 속아 스팀 아이디, 비밀번호, 스팀 가드 모바일 인증 코드를 입력하면 다음과 같은 공격이 수행됩니다.
- 2단계 인증(2FA)의 실시간 통과: 일회용 비밀번호(TOTP)의 보안성은 공격자가 30초마다 갱신되는 5자리 코드를 임의로 유추할 수 없다는 점에 기반합니다. 그러나 역방향 프록시 환경에서는 피해자가 유효한 코드를 직접 제공합니다. 공격자의 프록시 서버는 코드가 만료되기 전에 밸브의 공식 로그인 API로 밀리초 단위로 전달하여 인증을 통과시킵니다.
- 고권한 세션 쿠키 탈취: 인증에 성공하면 밸브 서버는
steamLoginSecure및sessionid쿠키를 발급합니다. 공격자의 프록시는 피해자에게 일반적인 리다이렉트 화면을 보여주기 직전에 이 세션 쿠키를 가로채 데이터베이스에 보관합니다. - 전자동 세션 탈취 및 계정 청소:
steamLoginSecure쿠키를 확보한 공격자는 이후 비밀번호나 2FA 입력 없이도 계정을 완전히 조종할 수 있습니다. 헤드리스 브라우저를 기반으로 한 봇이 계정에 즉시 접속하여 기존 API Key를 말소하고 악성 스팀 Web API Key를 발급하며, 거래 가능한 아이템을 전송하고 친구 목록 전체에 동일한 피싱 링크를 살포합니다.
전통적 육안 검증이 무력화되는 이유 및 기술적 탐지 기법
모사된 주소창은 화면상으로 정품 브라우저 창과 구별할 수 없으므로, 사용자는 구조적 검증과 브라우저의 동작 원리를 이용해 판별해야 합니다.
1. 뷰포트 경계 창 드래그 테스트 (가장 확실한 물리적 검증)
가장 간단하면서도 확실한 판별법은 로그인 팝업 창을 브라우저 화면 밖으로 드래그해 보는 것입니다.
- 정상 창: OS가 생성한 독립된 프로세스이므로 브라우저 테두리를 벗어나 바탕화면 구석이나 보조 모니터로 자유롭게 이동시킬 수 있습니다.
- BitB 가짜 창: 부모 웹페이지의 HTML 요소에 불과하므로 현재 브라우저의 표시 영역(뷰포트)을 벗어날 수 없습니다. 브라우저 창 가장자리로 끌고 가면 테두리에 막히거나 잘려 나가며, 외부 스크롤바 뒤로 숨어버립니다.
2. 비밀번호 관리자 자동 완성 검증
Bitwarden, 1Password 또는 브라우저 내장 비밀번호 관리자는 화면에 표시된 텍스트가 아닌, 브라우저 엔진이 인식하는 실제 출처(window.location.origin)를 기준으로 동작합니다.
- 정상적인 스팀 로그인 페이지에서는 도메인이
steamcommunity.com임을 인식하고 저장된 계정 정보를 자동 완성으로 제안합니다. - BitB 피싱 창에서는 실제 최상위 출처가 악성 도메인(예:
fake-tournament.com)이므로, 비밀번호 관리자는 도메인 불일치를 감지하고 자동 완성을 강력히 거부합니다. - 황금 법칙: 브라우저에 스팀 계정 정보가 저장되어 있음에도 불구하고 신뢰할 수 있는 비밀번호 관리자가 아무런 반응을 보이지 않는다면, 해당 창은 십중팔구 DOM 기반 피싱 프레임입니다.
3. 개발자 도구 (DOM 계층 구조 검사)
키보드의 F12를 누르거나 모사된 주소창에서 마우스 우클릭 후 **검사(Inspect)**를 선택합니다.
- 정품 브라우저 주소창은 OS 네이티브 영역이므로 웹페이지의 검사 도구로 요소를 확인할 수 없습니다.
- BitB 창의 주소창을 검사하면 DOM 트리에서
div나span태그로 구성된 일반 웹 요소임이 적나라하게 드러납니다.
비교 매트릭스: 정식 OpenID 팝업과 BitB 피싱 프레임 구조 차이
| 아키텍처 특성 | 공식 스팀 OpenID 인증 팝업 | BitB 피싱 모사 창 컨테이너 |
|---|---|---|
| 창 생성 방식 | OS 레벨의 독립 자식 프로세스(window.open) | 부모 웹페이지 내부의 DOM 요소(div / iframe) |
| 화면 이동 범위 | 브라우저 창을 벗어나 듀얼 모니터 간 자유 이동 | 부모 웹페이지의 표시 영역(뷰포트) 내부에 갇힘 |
| 주소창 보안 | OS 제어 보안 주소창, 공식 SSL 인증서 확인 가능 | CSS로 꾸며진 정적 텍스트 및 가짜 SVG 자물쇠 |
| 비밀번호 관리자 | 공식 도메인을 인식하여 자동 완성 제공 | 피싱 사이트 도메인으로 인식하여 자동 완성 차단 |
| 세션 유지 상태 | 브라우저에 로그인된 경우 1클릭으로 즉시 연동 | 항상 아이디, 비밀번호, 스팀 가드 재입력 요구 |
| 우클릭 검사 반응 | 브라우저/OS 시스템 메뉴 표시, 소스 검사 불가 | 웹 요소 검사기가 열리며 HTML 노드가 직접 지정됨 |
계정 유출 후 긴급 대응 및 세션 차단 프로토콜
BitB 피싱 창에 스팀 계정 정보나 스팀 가드 번호를 입력한 것으로 의심된다면, 즉각 다음 순서에 따라 비상 조치를 취해야 합니다.
- 모든 기기의 세션 즉시 만료:
- 모바일 스팀 앱 또는 안전한 PC 클라이언트에서 스팀 가드 설정으로 이동합니다.
- 다른 모든 기기 인증 해제를 실행합니다. 이를 통해 현재 발급된 모든
steamLoginSecure쿠키가 서버에서 강제 만료되며, 해커의 프록시 연결이 즉시 차단됩니다.
- 스팀 Web API 키 감사 및 취소:
- 공식 브라우저에서
https://steamcommunity.com/dev/apikey로 직접 이동합니다. - 본인이 개발 목적으로 직접 생성하지 않은 API 키가 등록되어 있다면, 즉시 나의 Steam Web API 키 취소를 누릅니다. 해커는 이 키를 이용해 거래 제안을 탈취합니다.
- 공식 브라우저에서
- 비밀번호 변경 및 보안 갱신:
- 스팀 계정 비밀번호와 등록된 이메일 계정의 비밀번호를 안전한 다른 단말기에서 변경합니다.
- 거래 URL 재생성:
- 스팀 거래 제안 설정 페이지에서 새로운 거래 URL을 생성하여 공격자의 스크래핑 봇을 무력화합니다.
현대 게이밍 환경의 위협에 대응하기 위해서는 웹 표준 인증 구조와 네트워크 동작 방식을 심층적으로 이해해야 합니다. 365Finds의 전문 보안 분석을 참고하면 게이머와 e스포츠 대회 주최자는 DOM 삽입 및 역방향 프록시와 같은 정교한 공격을 사전에 파악하여 자산과 계정을 보호할 수 있습니다. 브라우저 뷰포트 내부의 시각 정보를 맹신하지 않고 비밀번호 관리자의 도메인 바인딩 검증을 활용하는 것이 가장 안전한 방어 수단입니다.