블로그

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

Slowloris: 속삭이는 DoS

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

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

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

HTTP/2 서버 푸시는 죽었다. Early Hints는 덜 함으로써 이겼다

서버 푸시는 HTTP/2의 간판 기능이었다. 브라우저가 묻기 전에 파일을 보낸다. Chrome은 2022년 이걸 뜯어냈다 — 사용률 0.7%, 게다가 자주 더 느려서. 그 자리를 대신한 것은 정반대로 동작했고, 그래서 이겼다.

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

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

301 vs 302: 모든 걸 망가뜨리는 리다이렉트

301과 302의 차이는 '영구 vs 임시'가 아니다. 코드 하나에 조용히 묶인 두 개의 별개 결정이고, 실수로 설정한 301은 남의 브라우저 캐시 속에서 영원히 살아남을 수 있다.

HSTS 프리로드: 당신의 보안을 브라우저 벤더에게 넘기는 일

HSTS 프리로드 목록에 도메인을 올리는 건 일방통행 문이다. 목록은 당신 서버가 아니라 브라우저 바이너리 안에 있어서, 되돌리려면 당신이 통제하지 못하는 크롬 릴리스를 몇 달이고 기다려야 한다 — 프리로드하라고 권하는 사람들이 말 안 하는 부분이다.

Content-Security-Policy는 가장 어려운 헤더다

배포된 CSP 대부분은 아무것도 안 한다. 구글이 측정했다: 스크립트를 제한하려는 정책의 94.7%가 우회 가능. 문법은 쉽다. 어려운 이유는 따로 있다.

우리는 UDP 위에 TCP를 다시 만들고 QUIC라고 불렀다

QUIC는 신뢰성이 있고, 순서를 보장하고, 혼잡 제어를 하고, 전부 암호화한다 — UDP가 한사코 하지 않으려는 모든 것이다. 그런데 왜 하필 UDP 위에 만들었을까? UDP가 인터넷 배관에 남은 유일한 '새 프로토콜 모양의 구멍'이었기 때문이다.

서버는 당신이 봇이라는 걸 어떻게 아는가

User-Agent 문자열에는 아무 브라우저나 적어 넣을 수 있다. 그래서 아무도 그 필드를 믿지 않는다 — 그 아래에 깔린 TLS 핸드셰이크와 HTTP/2 설정은 당신이 아니라 당신이 쓴 라이브러리가 적은 것이기 때문이다.

CDN 캐시 포이즈닝의 작동 원리

CDN 캐시 포이즈닝은 CDN을 속여서 악성 응답을 캐시하게 하고 모든 후속 방문자에게 서빙하게 한다. 이상한 요청 하나, 대량의 부수 피해.