블로그

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

하트블리드: 지문을 남기지 않은 유출

2014년, OpenSSL의 빠진 경계 검사 하나가 누구든 서버에게 자기 메모리 64KB를 달라고 요청할 수 있게 했다 — 개인키, 비밀번호, 세션 쿠키까지. 그 요청은 평범한 하트비트와 완전히 똑같이 생겨서, 어떤 서버도 자기가 털렸는지조차 알 수 없었다.

인터넷은 이제 손상을 우회하지 않는다

대륙 간 데이터의 99%는 몇백 가닥의 해저 케이블을 타고 몇 안 되는 병목을 지난다. 하나가 끊기면 우회할 길이 없다 — 배를 기다릴 뿐이다.

security.txt: 아무도 읽지 않는 표준

RFC 9116이 나온 지 4년, security.txt를 게시한 사이트는 대략 100곳 중 1곳 — 그나마도 상당수는 필수인 만료일을 빼먹었거나 이미 넘겼다. 이 표준이 실패한 건 나빠서가 아니다. 텍스트 파일 하나로는 그것이 대신 서 있는 그것, 제보를 실제로 읽을 사람을 만들어낼 수 없기 때문이다.

맨 끝의 점: example.com. 이 진짜 이름인 이유

맨 끝의 점은 도메인 이름을 쓰는 가장 기술적으로 정확한 방식이다 — DNS 루트를 글자로 적어낸 것이니까. 그런데 DNS 위의 모든 계층이 그 의미에 서로 다른 답을 내고, 그 불일치가 계속 보안 버그로 터진다.

국가 방화벽은 DNS를 어떻게 오염시키는가

국가 방화벽은 검열 대상 DNS 조회를 막지 않는다. 진실보다 먼저 도착하는 위조 응답으로 '답'을 준다. 그 거짓말은 때로 실제 회사의 서버를 가리키고, 때로는 검열자가 의도하지 않은 사람들에게까지 새어 나간다.

25번 포트: ISP가 이메일 연방을 포기한 날

집 인터넷 회선에서는 메일 서버를 돌릴 수 없다. SMTP가 1982년에 태어난 그 포트는 대부분의 소비자 네트워크에서 막혀 있다 — 그리고 그 조용하고 전적으로 정당했던 방어가, 피어끼리 주고받는 시스템으로서의 이메일을 끝낸 장본인이기도 하다.

ROBOT: 19년 만에 돌아온 공격

1998년 블라이헨바허가 TLS의 RSA를 깼다. 그 '수정'은 취약한 우회책이었고, 2017년 상위 100대 도메인 중 27곳에서 다시 깨졌다.

Path MTU 블랙홀: 큰 패킷에서만 터지는 버그

연결은 된다. 작은 요청도 잘 된다. 그런데 큰 전송이 영원히 멈추고, 다들 앱을 탓한다. 대개는 중간의 라우터가 큰 패킷을 조용히 버리고, 그 사실을 알려줄 ICMP 메시지를 어느 방화벽이 삼킨 것이다 — '네트워크가 된다'와 '네트워크가 큰 패킷을 통과시킨다'가 서로 다른 주장인, 인터넷 깊숙이 박힌 실패 방식.

영상통화는 어떻게 NAT를 뚫는가

NAT 뒤에 있는 기기는 외부에서 걸어오는 연결을 받을 수 없다. 그게 NAT의 정의 자체다. 그런데도 영상통화는 늘 그런 기기 둘을 직접 연결한다. 비결은 홀 펀칭이다. 양쪽이 같은 순간 패킷을 쏴서 서로가 지나갈 구멍을 뚫는다. 그 메커니즘과, 이걸 무력화하는 한 가지 NAT 유형과, 실패했을 때 임대료를 내는 릴레이 이야기.

루트 키가 처음으로 바뀌던 날

8년 동안 서명된 DNS의 보안 전체가 단 한 번도 바뀐 적 없는 키 하나에 매달려 있었다. 2018년 마침내 그 키를 교체했을 때, 무서웠던 건 암호학이 아니라 — 어느 리졸버가 따라올 준비가 됐는지 아무도 볼 수 없다는 사실이었다.

클라우드블리드: 버퍼 하나가 모두의 비밀을 흘렸다

2017년, Cloudflare 파서의 잘못된 비교 하나가 포인터를 버퍼 끝 너머로 넘겨 인접 메모리를 웹 페이지에 쏟아냈다 — 한 사이트의 요청에 다른 사이트의 비밀번호가 섞여 나왔고, 검색엔진이 그 유출을 캐시했다.