블로그

프로토콜, 보안 사건, 그리고 인터넷이 실제로 작동하는 방식. 147편.

8분간 이어진 1.35Tbps 공격

2018년 2월 28일, GitHub은 당시 사상 최대인 1.35Tbps DDoS를 견뎠다. 이 무기를 만든 봇넷은 없었다. 열린 채 방치된 memcached 서버와, 인터넷이 2000년부터 고치기를 거부해 온 라우팅 결함으로 조립된 것이었다.

SYN 쿠키: 당신 서버를 지키는 1996년의 트릭

1996년 9월, SYN flood 하나가 뉴욕의 한 ISP를 멈춰 세웠다. 몇 주 만에 두 사람이 상태를 아예 저장하지 않는 방어법을 만들어냈다 — 커넥션을 공격자가 위조할 수 없는 숫자 안에 숨기는 방식이다. 리눅스는 2009년부터 이걸 기본으로 켜 두고 있고, 지금도 일부러 조금 손해를 보게 설계돼 있다.

JA3, JA4: 당신의 TLS 핸드셰이크는 지문이다

TLS가 무엇을 암호화하기도 전에, 클라이언트는 자기가 무엇인지 정확히 밝힌다. 인사하는 그 특유의 방식이 곧 지문이다 — JA3와 JA4의 이야기는, 아무도 감출 생각을 하지 않았던 프로토콜의 부위에서 신원이 어떻게 새어 나오는지에 관한 이야기다.

Slowloris: 속삭이는 DoS

Slowloris 공격은 2009년 것이다. 작은 스크립트 하나, 컴퓨터 한 대, 대역폭은 거의 필요 없다. 그런데 요청 시간 제한 없이 연결마다 스레드를 붙이는 서버는 지금도 멈춰 세운다. 느리게 감으로써 이긴다 — 그리고 그 해법은 HTTP/2의 기록적 홍수 공격에 필요했던 바로 그것이다.

패시브 DNS: 방어자들은 어떻게 DNS에 기억을 심었나

DNS에는 기억이 없다 — 도메인이 무엇을 가리키는지 물으면 오늘의 답만 나오고, 작년의 답은 절대 나오지 않는다. 패시브 DNS는 누가 물었는지는 결코 기록하지 않으면서, 인터넷이 내놓은 모든 답을 기억하는 우연한 감시 데이터베이스다.

regreSSHion: 되살아난 버그

2006년 OpenSSH는 시그널 핸들러에 있던 원격 루트 취약점을 잡았다. 2020년 말 로깅 코드를 고치는 과정에서 그 수정이 조용히 사라졌고, 같은 버그가 3년간 수백만 대 서버로 배포됐다 — 그게 죽은 채로 있는지 아무도 시험하지 않았기 때문이다.

카민스키 버그: DNS가 무너질 뻔한 날

2008년, 연구자 한 명이 인터넷의 어떤 도메인이든 몇 초 만에 위조하는 법을 찾아냈다. 해결책은 새 프로토콜이 아니라 25년 된 설계에 덧댄 16비트의 무작위성이었고, 우리는 아직도 거기 기대고 있다.

미라이: 카메라로 만든 봇넷

2016년, 가정용 카메라와 DVR로 만든 봇넷이 인터넷의 한 조각을 마비시켰다. 대단한 취약점을 찌른 게 아니다. 공장 초기 비밀번호로 그냥 로그인했다.

XZ 백도어: 존재한 적 없는 메인테이너

최근 몇 년간 가장 정교했던 공급망 공격은 스캐너도, SBOM도, 보안팀도 잡지 못했다. SSH 로그인이 0.5초쯤 느린 게 거슬렸던 엔지니어 한 명이 잡았다.

HTTP/2 CONTINUATION Flood: 로그에 남지 않는 DoS

2024년 4월, 한 연구자가 단 하나의 TCP 연결로 Apache·Node.js·Tomcat을 무너뜨릴 수 있음을 보였다. 그 HTTP/2 프레임은 액세스 로그에 남지 않는다. 버그는 코드가 아니라 명세의 이음새에 있었기에 동시에 모든 곳에서 터졌다.

SMTP 스머글링: SPF와 DMARC를 통과한 위조 메일

2023년 12월, 한 연구자가 microsoft.com 같은 도메인을 사칭한 위조 메일을 보냈고 그 메일은 SPF와 DMARC를 통과했다. 인증을 깬 게 아니다. 수신 서버가 한 통의 메일을 두 통으로 읽게 만들었다.

HTTP/2 Rapid Reset: 기능 하나가 DDoS 기록을 깼다

2023년 8월, Google·Cloudflare·AWS가 모두 DDoS 기록을 경신했고, Cloudflare가 받은 공격은 고작 2만 대 남짓한 봇넷에서 나왔다. 무기는 대역폭이 아니었다. 설계대로 정확히 동작하는 HTTP/2 기능이었다.