DDoS의 경제학: 왜 공격 한 번이 1만 원인가

작은 사이트를 오후 내내 다운시키는 DDoS 공격 비용은 피자 한 판 값이다. 흥미로운 건 싸다는 사실이 아니라, 그 값을 실제로 누가 치르고 있느냐다 — 공격자는 아니다.

작은 사이트를 오후 내내 다운시키는 DDoS 공격 비용은 라지 피자 한 판 값쯤 된다. 수사적 과장이 아니라 실제 가격표가 그렇다. 이런 공격을 파는 booter 서비스들은 월정액 요금제를 광고하는데, 입문 등급은 몇 년째 1만~2만 원대에 머물러 있다. 폐쇄되기 전 가장 컸던 Webstresser는 구독을 월 15달러부터 시작했다. 그 돈으로 다른 13만 6천 명의 고객과 공유하는 인프라를 얻었고, 이 플랫폼은 통틀어 약 400만 건의 공격을 날렸다.

싸다는 게 이야기의 전부인데, 다들 이 부분을 틀리게 말한다. 흔한 프레임은 “공격이 너무 싸졌다”이다. 기술이 효율적이 돼서 값이 떨어진 것처럼. 그건 거꾸로다. 값이 싼 이유는, 1만 원을 내는 사람이 공격 값을 치르는 게 아니기 때문이다. 그 사람은 인터페이스 값을 낸다. 공격 그 자체 — 대역폭, 화력, 장비 — 는 인터넷의 나머지 전부가 보조금을 대고 있고, 그들 대부분은 자기가 한몫 보태고 있다는 사실조차 모른다.

1만 원으로 실제 사는 것

“booter” 또는 “stresser”가 뭔지 정확히 짚고 가자. 이 업계는 10년 동안 완곡어법 뒤에 숨어 왔으니까. 이들의 홍보 문구는 자기네가 정당한 “부하 테스트(stress testing)” 서비스라는 것이다. 내 서버에 겨눠서 부하를 얼마나 견디는지 본다는 식으로. 심지어 대상 소유를 확인한다는 체크박스를 두는 곳도 있다. 아무도 이걸 안 믿는다. 운영자 본인들도. FBI가 2022년 12월 booter 도메인 48개를 압수하고 6명을 기소했을 때, 그리고 이듬해 5월 13개를 추가로 내렸을 때, 그 공소장은 부하 테스트에 관한 게 아니었다. 2018년 Webstresser 폐쇄 — 십수 개국이 공조한 Operation Power OFF — 도 마찬가지였다.

그러니 1만 원에 빌리는 건 웹 대시보드다. IP나 호스트명을 입력하고, 지속 시간과 드롭다운의 “공격 방식”을 고른 다음, 실행을 누른다. 대시보드가 제품의 전부다. 그 뒤의 모든 것 — 실제로 홍수를 만들어내는 그 무언가 — 은 빌려온 것이다.

바로 이 부분이 값을 설명한다.

화력은 공짜고, 그건 설계된 결과다

1만 원짜리 공격을 가능하게 하는 메커니즘은 증폭(amplification)이다.

아이디어는 오래됐고 민망할 만큼 단순하다. UDP 위에서 도는 특정 인터넷 서비스들은 작은 요청에 커다란 응답을 돌려준다. 그 작은 요청을 보내면서 출처를 속일 수 있다면 — “보낸 사람” 자리에 피해자의 IP를 넣으면 — 서비스는 그 큰 응답을 고분고분 피해자에게 배달한다. 나는 약간의 대역폭을 쓰고, 피해자는 엄청난 양을 뒤집어쓴다. 공개 서버 하나를 남을 겨눈 대포로 바꿔놓은 것이다.

증폭 배율은 터무니없다. DNS 리졸버는 입력의 28~54배쯤. NTP 서버는 질의를 잘 고르면 수백 배. 그리고 memcached가 있다 — 애초에 공개 인터넷을 마주할 일이 전혀 없어야 했던 캐싱 시스템으로, UDP 11211 포트에서 대기한다. memcached 증폭은 보낸 것의 최대 51,200배를 돌려줄 수 있다. 15바이트 요청이 750킬로바이트 응답으로 돌아온다. 오타가 아니다. 15바이트가 들어가고 0.75메가바이트가 나오며, 내가 사칭한 그곳으로 조준된다.

2018년 2월, 이건 더 이상 이론이 아니게 됐다. GitHub이 초당 1.35테라비트의 트래픽을 맞았다 — 당시 기록된 사상 최대 규모 DDoS로, 거의 전부 memcached 리플렉션으로 만들어졌다. 공격자들이 1.35Tbps짜리 회선을 갖고 있었던 게 아니다. 그런 걸 가진 사람은 없다. 그들은 노출된 memcached 서버 무더기에 자잘한 스푸핑 요청을 적당히 흘려보냈고, 남의 인프라 위에서 도는 그 서버들이 테라비트를 만들어냈다. 며칠 뒤 누군가 같은 수법으로 1.7Tbps에 기록을 다시 갈아치웠다.

그 증폭 서버 하나하나는 누구를 공격할 생각도 없던 사람이 잘못 설정해 둔 것이다. 캐싱 데몬을 노출해 뒀거나, 오픈 DNS 리졸버를 돌렸거나, NTP 서버를 패치하지 않은 채로 — 그렇게 해서 요청하는 누구에게든 화력 한 조각을 기부한 셈이 됐다. booter 운영자는 그 용량을 만들지 않았다. 그저 목록화하고 그 앞에 드롭다운을 갖다 놨을 뿐이다.

아무도 배치하지 않는 단 하나의 방어선

이 수법 전체는 출처 주소를 속이는 데 달려 있다. 피해자에게서 온 척하는 패킷을 보내면, 증폭기는 피해자에게 답한다. 그 거짓말이 걸리면 리플렉션 공격은 하룻밤에 무너진다.

그리고 그걸 잡는 법을 우리는 2000년부터 알고 있었다. BCP 38 — RFC 2827, “Network Ingress Filtering”이다. 아이디어는 시시할 만큼 간단하다. 네트워크는 자기를 떠나는 패킷이 정말로 자기 내부 주소에서 나온 것인지 확인하고, 아닌 것은 버려야 한다. 모든 네트워크가 자기 아웃바운드 트래픽을 이렇게 필터링하면, 애초에 피해자 주소를 사칭할 수가 없다. 스푸핑이 없으면 리플렉션도 없다.

25년이 지난 지금도 채택은 여전히 절반짜리다. 자기 아웃바운드 스푸핑 트래픽을 필터링하는 건 나에게 약간의 수고와 설정을 요구하는데, 그 이득은 전적으로 다른 사람들 — 내 네트워크를 거쳐 공격당하지 않게 될 낯선 이들 — 에게 돌아간다. 교과서적인 공유지의 비극이고, 이론이 예측한 그대로 흘러간다. 개별적으로 합리적인 선택은 그냥 안 하는 것이니, 상당수 네트워크가 안 한다. 스푸핑 패킷은 계속 흐른다. 그걸 막는 건 언제나 남의 문제였으니까.

공짜 자원이 하나 더 있다: 봇넷. 감염된 라우터, 카메라, DVR — Mirai 웜과 그 끝없는 후손들이 주인이 영영 눈치채지 못할 값싼 IoT 기기 수십만 대를 징집한다. 이것도 빌려온 용량이고, 외부화된 비용이다. 기기 주인이 전기와 대역폭을 내고, 공격자가 그걸 겨눈다.

실제로 값을 치르는 사람

그러니 1만 원은 진짜지만, 그건 공격 값이 아니다. 편의의 값이다. DDoS의 진짜 비용 — 대역폭, 증폭 서버, 스푸핑 패킷을 통과시키는 필터 없는 네트워크, 발사를 대신하는 탈취당한 기기들 — 은 인터넷의 한 조각을 조금씩 잘못 운영하는 모두가 눈에 안 보이는 아주 작은 단위로 나눠 낸다. booter는 자기가 지지 않는 비용 위에 통째로 세워진 사업이다.

그래서 나는 그 폐쇄 작전들이, 통쾌하긴 해도, 엉뚱한 병을 다루고 있다고 본다. booter 도메인을 압수하고 운영자를 체포하는 건 인터페이스의 공급을 겨냥한다. 화력의 공급 — 수백만 대 서버에 얹힌 잘못된 설정과, 수백만 네트워크가 하지 않기로 한 필터링 — 에는 아무것도 하지 못한다. 오늘 모든 booter 운영자를 잡아넣어도 원자재 — 열린 증폭기, 스푸핑 가능한 네트워크, 취약한 IoT 떼 — 는 다음 사람을 위해 고스란히 남아 있고, 그 사람은 일주일 안에 새 대시보드를 띄운다. 2022년과 2023년의 압수는 진짜 성과였고, booter는 계속 팔렸다.

공격의 가격은 거울이다. 인터넷이 공격자를 대신해 떠안기로 합의한 비용이 정확히 얼마인지 알려준다. 출처 주소 검증이 선택 사항으로 남고 증폭기가 공개된 채로 있는 한, 그 숫자는 1만 원 언저리에 머문다 — 공격을 벌이는 게 싸서가 아니라, 그 값을 내는 거의 모두가 정작 청구서를 쥔 사람이 아니기 때문이다.

토론 참여

← 블로그로 돌아가기