BGP 하이재킹: 같은 실수의 역사

1997년 AS7007 사고부터 2022년 KLAYswap 암호화폐 탈취까지, BGP 하이재킹은 매번 같은 빈 자리를 노립니다: 누구도 경로 소유를 증명할 필요가 없다는 것. 그 패턴, 그리고 왜 해결책은 여전히 선택 사항인가.

2008년 2월, 파키스탄은 자국민에게 유튜브를 검열하려다 잠시 지구 나머지에게서도 유튜브를 끊어버렸다.

정부는 어떤 영상 때문에 유튜브 차단을 명령했다. 파키스탄 텔레콤의 계획은 평범했다: 자기 네트워크 안에서 유튜브 주소 대역 일부의 경로를 광고해, 파키스탄에서 유튜브로 가는 트래픽이 사이트 대신 벽에 부딪히게 하는 것. 거기까지는 됐다. 문제는 그 가짜 경로가 파키스탄 안에 머물지 않았다는 것이다. 파키스탄 텔레콤은 그 경로를 상위 제공업체에 넘겼고, 그것이 인터넷 나머지로 퍼졌으며, 약 두 시간 동안 전 세계 유튜브 트래픽의 상당 부분이 그 트래픽을 버리려던 파키스탄의 한 네트워크로 향했다.

아무도 유튜브를 해킹하지 않았다. 아무도 TLS를 깨지 않았다. 한 네트워크가 자기가 도달할 수 있는 주소에 대해 거짓말을 했고, 인터넷이 그것을 믿었다 — 서로를 믿는 것이 BGP가 할 줄 아는 유일한 일이기 때문이다.

끝내 고쳐지지 않은 버그

전에 BGP가 신뢰 위에서 돌아간다는 것에 대해 쓴 적이 있다 — 인터넷의 네트워크들을 이어 붙이는 Border Gateway Protocol에는 어떤 자율 시스템(AS)이 자기가 광고하는 주소 대역을 실제로 소유했는지 확인할 내장 수단이 없다. 어떤 AS든 어떤 프리픽스든 광고할 수 있다. 이웃들은 대체로 그것을 받아들인다. 이건 각주가 아니라 보안 모델 전체이며, 아래의 모든 사고가 사실은 옷만 갈아입은 같은 사고인 이유다.

BGP 하이재킹에서 흥미로운 점은 그것이 일어난다는 사실이 아니다. 25년 넘게 정확히 같은 모양으로 일어나 왔고, 그 궤적이 “어이쿠”에서 “작정하고”로 이어진다는 점이다.

사고들

이 장르는 사고로 문을 연다. 1997년 4월 25일, AS7007을 운영하던 작은 제공업체가 학습한 경로 뭉치를 잘게 쪼갠 /24 조각으로 만들어, 마치 자기가 그 모두로 가는 최적 경로인 양 다시 광고했다. 더 구체적인 경로가 이기기 때문에, 인터넷의 거대한 부분을 향한 트래픽이 도저히 감당할 수 없는 라우터로 쏟아지기 시작했다. 네트워크의 일부가 캄캄해졌다. 설정 실수였다 — 면역 체계가 없는 프로토콜이 증폭시킨 손가락 실수 — 그리고 한 네트워크의 실수가 어떻게 모두의 장애가 되는지를 보여주는 정본 사례가 됐다.

이후 10년간 하이재킹은 대체로 그런 것이었다: 사고. 누군가 라우팅 테이블을 흘리고, 누군가 내부용으로 두려던 프리픽스를 광고하고, 누군가의 필터가 빠져 있다. 2008년 파키스탄/유튜브는 봉쇄를 벗어난 검열 명령이었다. 2010년 4월, 차이나 텔레콤은 실어서는 안 될 대량의 경로를 실었다 — 당시 수치는 인터넷 프리픽스의 약 15%에 잠시 영향을 줬다고 주장했지만, 실제로 얼마나 많은 트래픽이 중국을 우회했는지는 지금까지도 논쟁거리이며 그 무서운 헤드라인보다 거의 확실히 훨씬 적었다. 그래도 패턴은 유지됐다: 악의는 필요 없다, 빠진 필터 하나와 기본값이 신뢰인 프로토콜이면 된다.

무기화

그러다 사람들은 이걸 겨냥할 수 있다는 걸 알아챘다.

깔끔한 전환점은 2018년 4월이다. 공격자들은 회사를 노리지 않았다 — 아마존의 Route 53 DNS 서비스를 노렸다. 누군가 광고할 자격이 전혀 없는 네트워크에서 아마존의 DNS 주소 대역을 광고했고, 몇 시간 동안 Route 53로 향한 DNS 질의를 공격자가 대신 응답했다. 표적은 MyEtherWallet이었다. 진짜 주소를 입력한 사용자는 탈취된 인프라에서 서빙되는 진짜 같은 사이트를 받았고 — 대부분이 그냥 넘겨버린 자체 서명 인증서 경고까지 딸려 — 약 15만 달러어치 이더리움이 걸어 나갔다. 경로 하이재킹은 전달 수단일 뿐이었고, 나머지는 DNS와 피싱 페이지가 했다.

기술의 정점은 2022년 2월 3일 서울에 도착했다. KLAYswap 탈취는 BGP가 여전히 인프라 팀의 문제이지 보안 문제가 아니라고 여기는 사람에게 내가 건네고 싶은 사례다. 공격자들은 KLAYswap의 서버를 건드리지 않았다. KLAYswap 사이트가 자바스크립트 파일을 불러오던 서버 — 카카오톡이 호스팅하던 SDK — 의 경로를 하이재킹했다. 그 트래픽을 우회시킨 뒤, 수정된 SDK를 서빙했다: 같은 파일, 끝에 덧붙인 코드. KLAYswap 사용자가 브라우저에서 거래를 시작하면, 주입된 스크립트가 자산을 조용히 공격자 지갑으로 돌렸다.

수술처럼 정교했다. 악성 파일은 KLAYswap을 거쳐 온 사람에게만 갔다 — 공격자들은 HTTP 리퍼러를 확인해 나머지 모두에게는 무해한 에러를 줬고, 그래서 작전이 조용히 유지됐다. 약 두 시간 만에 407건의 부정 거래가 325개 지갑에서 약 190만 달러를 빼냈고, 대부분이 무언가 잘못됐다는 걸 알기도 전에 크로스체인 브리지를 거쳐 세탁됐다. 경로에 대해 거짓말을 해서 실행한 공급망 공격이었다.

이게 세 수로 요약한 궤적이다: 1997년의 사고, 2008년의 검열 유출, 그리고 2022년의 정밀 금융 무기. 매번 같은 빈 자리다.

해결책은 있다. 다만 선택 사항이다.

미치게 하는 부분은 방어책이 존재한다는 것이다. RPKI — Resource Public Key Infrastructure — 는 주소 대역 소유자가 “이 프리픽스는 오직 이 AS만 오리진으로 낼 수 있다”고 말하는 서명된 기록, 즉 ROA(Route Origin Authorization)를 발행하게 해준다. 경로 오리진 검증(ROV)을 하는 네트워크는 일치하지 않는 광고를 거부할 수 있다. 위 사고 상당수를 즉석에서 막았을 것이다. 대부분이 오리진 하이재킹 — 엉뚱한 AS가 출처를 자처하는 것 — 이기 때문이다.

채택은 실재하지만 반쯤 미완이다. 2024년 말 기준, IPv4 프리픽스의 약 53%가 유효한 ROA를 가졌고 트래픽의 약 70%를 덮는다. 10년 전의 거의 0에서 온 진짜 진전이며, 대형 네트워크가 무효 경로를 버리는 덕에 요즘 일부 누출은 퍼지지 못하고 사그라든다. 하지만 “절반”이라는 말은 나머지 절반이 여전히 벌거벗었다는 뜻이고, 더 고약한 함정이 있다: RPKI는 경로의 오리진을 검증하지, 그 경로가 주장하는 *경로(path)*를 검증하지 않는다. 그럴듯한 AS 경로를 위조한 공격자는 여전히 오리진 검증을 빠져나갈 수 있다. RPKI는 바닥을 높이지만 구멍을 막지는 않는다.

그래서 솔직한 요약은 불편하다. 우리는 이 실패 방식을 1997년부터 알았다. 그것이 서툰 사고에서 백만 달러 탈취로 진급하는 걸 지켜봤다. 암호학적 해결책을 만들고 표준화한 뒤, 그것을 배치하는 걸 각 네트워크가 스스로 정하는 선택으로 만들었다 — 바로 그 문제를 만든, 옵트인·이웃 신뢰 태세 그대로. BGP 하이재킹은 미해결 연구 과제가 아니다. 서명된 기록 하나씩 느리게 굴려가며 배치하는, 이미 해결된 문제다. 그러는 사이 공격은 방어가 배치되는 속도보다 빠르게 좋아진다.

다음 큰 건은 이미 쓰여 있다. 누구의 경로를 빌릴지 우리가 모를 뿐이다.

토론 참여

← 블로그로 돌아가기