2022년 2월 3일, 공격자들이 한국의 암호화폐 거래소인 클레이스왑 이용자들로부터 190만 달러 상당의 암호화폐를 탈취했다.
이들은 클레이스왑의 서버를 직접 침해하지 않고도 정상 트래픽의 경로를 우회시켜, 사용자를 악성 서버로 유도하고 브라우저에 악성 코드를 직접 주입했다.
본 사례 연구에서는 BGP 하이재킹의 작동 원리와 인프라를 보호하는 방법을 살펴본다.

공격 대상: 서드파티 스크립트
클레이스왑의 웹 앱은 단 하나의 HTML 태그를 사용해 카카오의 JavaScript SDK를 불러왔다.
<script src="https://developers.kakao.com/sdk/js/kakao.min.js"></script>
모든 방문자의 브라우저는 이 파일을 카카오에서 직접 가져와 클레이스왑 페이지 컨텍스트에 대한 전체 접근 권한을 가진 채 실행했다.
BGP 하이재킹: 카카오 IP 주소 스푸핑
네트워크는 라우팅 정보를 공유하기 위해 BGP(Border Gateway Protocol)를 사용한다.
라우터는 경로를 선택할 때 항상 가장 구체적인 프리픽스(prefix)를 우선시한다(예: /24 경로는 더 광범위한 /21 블록보다 우선 적용된다).
당시 카카오의 서버는 ISP 드림라인(AS9457)이 소유하고 카카오에 할당한 IP 블록인 211.249.216.0/21 및 121.53.104.0/23 범위 내에서 작동하고 있었다.
2월 3일, 공격자는 카카오 범위 내에서 무단으로 2개의 /24 서브넷을 전파했다.
이 허위 경로는 AS9457을 기점(origin)으로 주장했으며, Zayo(AS6461)를 통해 글로벌 인터넷으로 진입했다.
RIPE RIS 수집기(rrc00)는 이 두 프리픽스에 대해 1,735건의 BGP 공고(announcement)를 기록했으며, 모두 동일한 말단 경로를 공유하고 있었다.
211.249.221.0/24 AS path: … 6461 9457
121.53.104.0/24 AS path: … 6461 9457
MANRS: "AS9457은 AS6461(Zayo)과 직접적인 관계가 없지만, 위 공고의 AS_Path에서는 직접 피어(peer)로 표시되어 있다."
한국 표준시(KST) 오전 10시 4분경 2분 미만의 짧은 테스트 공고가 올라왔다. 본 공격은 11시 9분에 시작되어 11시 27분 44초에 안정화되었으며, 악성 경로가 철회된 12시 59분에서 13시 8분 사이까지 지속되었다.
유효한 HTTPS 인증서 취득
브라우저 경고를 발생시키지 않고 HTTPS를 통해 악성 스크립트를 안전하게 전송하기 위해, 공격자는 developers.kakao.com에 대한 유효한 TLS 인증서가 필요했다. S2W의 사후 분석 보고서에 따르면, 공격자는 ZeroSSL의 무료 90일 요금제를 사용해 인증서를 발급받았다.
인증 기관(CA)은 도메인의 웹 서버로 자동화된 챌린지를 보내 도메인 소유권을 검증한다. 공격자가 웹 서버의 IP 주소를 하이재킹했기 때문에, ZeroSSL의 검증 요청은 공격자의 서버로 직접 라우팅되었다.
정확한 검증 방식은 공개되지 않았지만, 웹 트래픽만 리다이렉트되었기 때문에 일반 텍스트 HTTP 파일 챌린지였을 가능성이 높다.
S2W는 하이재킹된 BGP 경로가 안정화된 지 불과 13초 뒤인 11시 27분 57초(KST)에 발급된 사전 인증서(precertificate)가 Certificate Transparency(인증서 투명성) 로그에 기록되었다고 언급했다.
도메인 검증의 한계
2022년 3월, 프린스턴 대학교의 헨리 버지리(Henry Birge-Lee)는 "Let's Encrypt는 다중 관점 검증(multiple vantage point validation)을 사용하는 유일한 인증 기관"이라고 언급했다.
그 이후 CA/Browser Forum Ballot SC-067을 통해 다중 관점 발급 검증(MPIC, Multi-Perspective Issuance Corroboration)이 의무화되었다.
2025년 9월 15일부터 CA는 다양한 관점에서 수행된 원격 검증 확인이 필요한 정족수(quorum)에 도달하지 못하면 인증서 요청을 거부해야 한다.
하지만 MPIC조차도 이번 사건을 막지는 못했을 것이다. Baseline Requirements(기본 요구사항)에 명시된 바와 같이, MPIC는 주로 동일하게 구체적인 프리픽스 하이재킹 방어에 효과적이기 때문이다.
공격자가 더 구체적인 /24 프리픽스를 공고했기 때문에, 허위 경로가 전 세계로 전파되었다.
결과적으로 전 세계의 모든 검증 관점이 공격자의 서버로 우회되었을 것이다.

MPIC가 완전히 적용된 2026년 8월에도 소프트웨어 공급업체인 Softaculous를 겨냥한 유사한 공격이 발생했다.
Virtualizor의 사건 성명서: "인증 기관의 자동화된 도메인 소유권 검증 요청 역시 하이재킹된 경로로 라우팅되었기 때문에, 공격자 서버는 공용 인증 기관(Let's Encrypt)으로부터 당사 도메인에 대한 유효한 TLS 인증서를 발급받을 수 있었다."
표적화된 페이로드 및 실행
S2W 조사 결과, 하이재킹된 서버는 악성 클레이스왑 코드가 포함되도록 변조된 카카오 SDK를 제공한 것으로 나타났다. 클레이스왑의 사건 보고서에 따르면, 변조된 스크립트는 트랜잭션 요청을 수정하여 사용자 토큰을 공격자의 컨트랙트로 직접 전송하거나 토큰 탈취 승인을 부여하도록 만들었다.
감지를 피하기 위해 해당 서버는 HTTP Referer 헤더를 확인하여 클레이스왑을 통해 접속한 방문자에게만 악성 페이로드를 전달한 것으로 알려졌다.
QR 체크인, 카카오맵, 다음(Daum) 등 카카오의 다른 서비스들은 공격 기간 동안 장애나 지연 현상만 겪었다.
첫 번째 부정 송금은 11시 31분 41초(KST)에 발생했다. 13시 8분에 악성 BGP 경로가 철회되었음에도 불구하고, 캐시된 스크립트가 실행되는 브라우저 탭을 열어둔 사용자가 많아 탈취는 18시 1분까지 이어졌다. 클레이스왑은 총 325개 지갑에서 407건의 악성 트랜잭션을 기록했다. S2W가 추정한 피해 금액은 1,910,172.95달러(약 22억 8천만 원)에 달했다.
방어 대책: RPKI 및 SRI
1. 엄격한 경로 기점 인증(ROA). RPKI(Resource Public Key Infrastructure)를 사용하면 네트워크 운영자가 경로 기점 인증(ROA, Route Origin Authorization)를 게시할 수 있다.
ROA는 특정 IP 프리픽스를 공고할 권한이 있는 자율 시스템(AS, Autonomous System)과 해당 프리픽스의 최대 길이(maxLength)를 정의하는 전자 서명된 명세다.
경로 기점 검증(ROV, Route Origin Validation)을 실행하는 네트워크는 권한이 없는 경로를 자동으로 차단한다.
2022년 2월 3일 당시 APNIC 기록에는 카카오의 프리픽스를 보호하는 ROA가 전혀 존재하지 않았다.
엄격한 ROA를 설정했다면 이 공격을 막을 수 있었을 것이다. 공격자가 권한이 있는 기점 AS를 위조하더라도, 명시적인 프리픽스 길이 제한을 설정해 두면 더 구체적인 서브넷이 차단되기 때문이다.
ROA (예시): 211.249.216.0/21 maxLength 21 origin AS7625
2022년 경로: 211.249.221.0/24 origin AS9457 -> Invalid (권한 없는 기점)
위조된 기점: 211.249.221.0/24 origin AS7625 -> Invalid (maxLength 초과)
/24 서브넷을 허용하는 허술한 ROA는 이러한 공격을 방어하지 못한다. 셀러 브릿지(Celer Bridge) 하이재킹(2022년 8월)과 Softaculous 하이재킹(2026년 8월) 사례 모두 정당한 기점 ASN을 위조하여 RPKI 검증을 통과했다.
RFC 9319에서는 바로 이러한 이유로 운영자들에게 지나치게 관대한 maxLength 설정을 피할 것을 명시적으로 권장한다.

한국의 RPKI 도입률은 여전히 낮은 편이다. 2026년 10월 4일 데이터 분석에 따르면, 라우팅된 국내 IPv4 프리픽스 22,039개 중 2.52%만이 RPKI 검증을 통과했다.
주소 공간 기준으로 측정했을 때, APNIC은 2026년 3월 기준 한국 IPv4 주소 공간의 RPKI 적용률을 약 2%로 보고했다.
2. 서브리소스 무결성(SRI). SRI(Subresource Integrity)를 사용하면 브라우저가 외부에서 가져온 리소스가 예상된 암호화 해시값과 일치하는지 확인할 수 있다.
리소스가 변조된 경우 브라우저가 실행을 차단한다. SRI가 적용되어 있었다면 공격자의 변조된 스크립트를 완벽히 무력화할 수 있었을 것이다.
2022년 당시 카카오 SDK에 SRI를 적용하려면 추가 작업이 필요했다. 카카오 문서에서는 최신 버전 스크립트를 직접 불러오도록 안내하고 있었으며, SDK가 매달 업데이트되었기 때문에 개발자가 자체 서버에 사본을 호스팅하지 않는 한 버전을 지정하지 않은 URL에 대한 SRI 해시값은 지속적으로 오류를 일으켰다.
하지만 SDK 2.0.0(2022년 9월 20일 출시)부터 카카오는 공식 무결성 해시값과 함께 버전이 명시된 URL을 제공하고 있다.
<script src="https://t1.kakaocdn.net/kakao_js_sdk/${VERSION}/kakao.min.js"
integrity="${INTEGRITY_VALUE}" crossorigin="anonymous"></script>
웹 애플리케이션 보안 체크리스트
모든 서드파티 스크립트 점검: 웹 애플리케이션이 불러오는 모든 외부 JavaScript 리소스의 목록을 작성한다. 서브리소스 무결성(
integrity속성)을 적용하거나, 버전을 고정한 사본을 직접 호스팅한다.인증서 투명성(CT) 로그 모니터링: 공개 CT 로그를 모니터링하여 자사 도메인을 겨냥한 무단 인증서 발급 여부를 추적한다. 이번 사건에서도 토큰 전송이 시작되기 전에 공격자의 인증서가 CT 로그에 포착되었다.
CAA 레코드 적용: 인증 기관 권한 지정(CAA) 레코드를 게시하여 자사 도메인에 대한 인증서 발급 권한이 있는 CA를 명시한다.
엄격한 ROA 설정: IP 프리픽스를 관리하는 경우, RPKI ROA를 게시하고
maxLength를 실제 공고하는 프리픽스 크기로 엄격하게 제한한다.
2026년 10월 4일 현재까지도 2022년에 하이재킹된 프리픽스나 현재 developers.kakao.com을 호스팅 중인 활성 /24 서브넷(211.183.215.0/24 및 203.133.190.0/24)을 보호하는 ROA는 존재하지 않는다.
참고 자료
- S2W TALON — Post-mortem of KLAYswap Incident through BGP Hijacking (2022년 2월 11일, 한국어)
- KLAYswap — KLAYswap Incident Report (Feb 03, 2022) (2022년 2월)
- MANRS — KLAYswap – another BGP hijack targeting crypto wallets (2022년 2월 17일)
- Princeton CITP — Attackers exploit fundamental flaw in the web's security to steal $2 million in cryptocurrency (2022년 3월 9일)
- CA/Browser Forum — Baseline Requirements, §3.2.2.9 and ballot SC-067 (2026년 10월 5일 확인)
- Virtualizor — Security incident statement (2026년 8월 31일)
- Doug Madory, APNIC Blog — Latest BGP hijack targets hosting software vendor (2026년 9월 22일)
- Doug Madory, APNIC Blog — What can be learned from BGP hijacks targeting cryptocurrency services (2022년 11월 7일)
- IETF — RFC 9319: The Use of maxLength in the RPKI (2022년 10월)
- APNIC Blog — NIR updates at APRICOT 2026 (2026년 3월 6일)
- Kakao Developers — JavaScript SDK: 시작하기 (2026년 10월 5일 확인, 한국어)
- RIPE NCC — RIS 원시 데이터, rrc00, 2022년 2월 3일 및 RPKI ROA 아카이브
