Slowloris: 속삭이는 DoS
Slowloris 공격은 2009년 것이다. 작은 스크립트 하나, 컴퓨터 한 대, 대역폭은 거의 필요 없다. 그런데 요청 시간 제한 없이 연결마다 스레드를 붙이는 서버는 지금도 멈춰 세운다. 느리게 감으로써 이긴다 — 그리고 그 해법은 HTTP/2의 기록적 홍수 공격에 필요했던 바로 그것이다.
프로토콜, 보안 사건, 그리고 인터넷이 실제로 작동하는 방식. 147편.
Slowloris 공격은 2009년 것이다. 작은 스크립트 하나, 컴퓨터 한 대, 대역폭은 거의 필요 없다. 그런데 요청 시간 제한 없이 연결마다 스레드를 붙이는 서버는 지금도 멈춰 세운다. 느리게 감으로써 이긴다 — 그리고 그 해법은 HTTP/2의 기록적 홍수 공격에 필요했던 바로 그것이다.
2024년 4월, 한 연구자가 단 하나의 TCP 연결로 Apache·Node.js·Tomcat을 무너뜨릴 수 있음을 보였다. 그 HTTP/2 프레임은 액세스 로그에 남지 않는다. 버그는 코드가 아니라 명세의 이음새에 있었기에 동시에 모든 곳에서 터졌다.
서버 푸시는 HTTP/2의 간판 기능이었다. 브라우저가 묻기 전에 파일을 보낸다. Chrome은 2022년 이걸 뜯어냈다 — 사용률 0.7%, 게다가 자주 더 느려서. 그 자리를 대신한 것은 정반대로 동작했고, 그래서 이겼다.
2023년 8월, Google·Cloudflare·AWS가 모두 DDoS 기록을 경신했고, Cloudflare가 받은 공격은 고작 2만 대 남짓한 봇넷에서 나왔다. 무기는 대역폭이 아니었다. 설계대로 정확히 동작하는 HTTP/2 기능이었다.
301과 302의 차이는 '영구 vs 임시'가 아니다. 코드 하나에 조용히 묶인 두 개의 별개 결정이고, 실수로 설정한 301은 남의 브라우저 캐시 속에서 영원히 살아남을 수 있다.
HSTS 프리로드 목록에 도메인을 올리는 건 일방통행 문이다. 목록은 당신 서버가 아니라 브라우저 바이너리 안에 있어서, 되돌리려면 당신이 통제하지 못하는 크롬 릴리스를 몇 달이고 기다려야 한다 — 프리로드하라고 권하는 사람들이 말 안 하는 부분이다.
배포된 CSP 대부분은 아무것도 안 한다. 구글이 측정했다: 스크립트를 제한하려는 정책의 94.7%가 우회 가능. 문법은 쉽다. 어려운 이유는 따로 있다.
QUIC는 신뢰성이 있고, 순서를 보장하고, 혼잡 제어를 하고, 전부 암호화한다 — UDP가 한사코 하지 않으려는 모든 것이다. 그런데 왜 하필 UDP 위에 만들었을까? UDP가 인터넷 배관에 남은 유일한 '새 프로토콜 모양의 구멍'이었기 때문이다.
User-Agent 문자열에는 아무 브라우저나 적어 넣을 수 있다. 그래서 아무도 그 필드를 믿지 않는다 — 그 아래에 깔린 TLS 핸드셰이크와 HTTP/2 설정은 당신이 아니라 당신이 쓴 라이브러리가 적은 것이기 때문이다.
CDN 캐시 포이즈닝은 CDN을 속여서 악성 응답을 캐시하게 하고 모든 후속 방문자에게 서빙하게 한다. 이상한 요청 하나, 대량의 부수 피해.
모든 보안 헤더가 같지 않다. 어떤 건 매일 실제 공격을 막고, 어떤 건 브라우저가 무시하는 레거시다. 솔직한 우선순위.
쉬운 헤더와 어려운 헤더 사이의 격차가 엄청나다. 대부분의 사이트가 X-Content-Type-Options는 설정하고 CSP는 건너뛴다.