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

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

리졸버에게 example.com이 무엇을 가리키는지 물으면 지금 이 순간의 답을 알려준다. 그 도메인이 지난 화요일에, 2019년에, 혹은 낯선 사람이 사흘간 소유했던 동안 무엇을 가리켰는지 물으면 — 아무것도 없다. DNS는 기억하지 못한다. 조회 시스템이지 장부가 아니다. 모든 답은 직전 답을 덮어쓰고, 레코드가 바뀌는 순간 옛 값은 처음부터 없었던 것처럼 사라진다.

누군가를 잡으려는 입장이라면 이 건망증이 문제다. 공격자는 도메인을 세우고, 서버를 가리키게 하고, 캠페인을 돌리고, 주말 사이에 걷어낸다. 월요일이면 DNS 레코드는 비어 있고 흔적은 식었다. 그 모든 걸 지켜본 단 하나의 시스템이 아무 기록도 남기지 않았다.

패시브 DNS(Passive DNS)가 그 해법이고, 보안에서 가장 기묘한 발명 중 하나다: 인터넷에서 가장 잘 잊는 시스템에 영구 기억을 심는 방법 — 내놓는 모든 답을 조용히 적어두면서, 누가 그 질문을 했는지는 결코 기록하지 않는 방식으로.

실제로 무엇인가

아이디어는 Florian Weimer에게서 나왔다. 그는 2005년 FIRST 콘퍼런스에서 Passive DNS Replication을 발표했다. 메커니즘은 거의 민망할 만큼 단순하다. 바쁜 재귀 리졸버 — ISP나 대학이 운영하며 수백만 건의 질의를 처리하는 종류 — 곁에 센서를 둔다. 그 리졸버가 권위 서버에서 답을 가져와야 할 때마다, 센서는 지나가는 응답을 보고 적어둔다: 이 이름이, 이 타입으로, 이 값으로 해석됐고, 이 시각에.

모든 관측을 저장하진 않는다. 그건 바다다. 대신 튜플로 중복 제거한다: 이름, 레코드 타입, , first-seen(최초 관측) 타임스탬프, last-seen(최종 관측) 타임스탬프, 그리고 횟수. evil.example이 6월 3일에 203.0.113.7로 처음 해석됐고, 6월 6일에 마지막으로 그렇게 관측됐으며, 1,400번 목격됐다. 한 줄이다. 충분히 많은 대형 리졸버의 충분히 많은 센서에 걸쳐 이걸 곱하면, 전체 DNS가 무엇을 하고 있었는지에 대한 부분적이고 기회주의적이지만 놀랍도록 유용한 역사를 — 수년치를 거슬러 — 재구성한 셈이 된다.

Weimer 자신의 표현이 *기회주의적(opportunistic)*이었고, 정직한 단어다. 패시브 DNS는 인터넷 전체를 보지 못한다. 자기 센서가 우연히 잡은 것만 본다. 감시되는 리졸버를 통해 아무도 질의하지 않은 도메인은 그냥 데이터베이스에 없다. 하지만 감시되는 리졸버는 큰 것들이고, 그들 사이에서 중요한 것 대부분을 본다.

소름 끼치지 않게 만드는 부분

패시브 DNS를 도청과 갈라놓는 설계 결정이 여기 있고, 대부분이 놓치는 부분이다.

DNS 질의에는 절반이 둘 있다. 스텁-투-리졸버 쪽 — 당신 노트북이 ISP 리졸버에게 “my-embarrassing-search.example 어디야?”라고 묻는 — 과, 리졸버-투-권위 쪽 — 리졸버가 캐시 미스에서 그 답을 도메인의 실제 네임서버에서 가져오는 — 이다. 앞 절반은 지극히 개인적이다: 당신이 무엇을 찾았는지의 로그다. 뒤 절반은 아니다: 개별 신원이 벗겨진 리졸버가 한꺼번에 수천 명을 대신해 인터넷에 질문하는 것이다.

패시브 DNS 센서는 뒤 절반에 앉는다. 캐시-필 트래픽 — 리졸버에서 권위로 — 을 잡고, 관측을 사람과 엮을 수 있는 출발지 IP·출발지 포트, 그 밖의 모든 것을 의도적으로 버린다. 프라이버시를 넘어선 하드코어한 엔지니어링 이유도 있다: 권위 서버는 때때로 누가 묻느냐에 따라 다른 답을 돌려준다(EDNS Client Subnet이 하는 일이 그것이다). 깨끗하고 정규적인 지도를 만들려면 특정 사용자의 관점이 아니라 바로 리졸버의 관점이 필요하다. 그 결과는 evil.example이 지난 6월 203.0.113.7로 해석됐음은 아는데, 당신이 그곳을 방문한 사람 중 하나였다는 사실은 전혀 모르는 데이터베이스다.

그래서 제목의 “감시 데이터베이스”는 사람이 아니라 인프라를 감시한다. 사용자가 아니라 기계를 지켜본다. 이 구분이 이 기법이 이 정도 규모로 존재하도록 허용되는 이유 전부다.

방어자가 없이는 못 사는 이유

단 하나의 실마리를 쥐고 빙산의 나머지가 필요한 순간, 그 위력이 드러난다.

보통의 DNS는 한 방향으로만, 그것도 현재에만 축을 돈다. 도메인이 있으면 현재 IP를 얻는다. 그게 전부다. 패시브 DNS는 양방향으로, 시간을 가로질러 축을 돈다:

  • 도메인 → 그것이 쓴 모든 IP. 지금 어디를 가리키는지만이 아니라 전체 로테이션 — 공격자가 돌려 쓴 IP 열다섯 개, 플래그되기 전 여섯 시간만 쓴 하나까지.
  • IP → 거기 호스팅된 모든 도메인. 다른 어디에도 대응물이 없는 하나다. 역방향 DNS(PTR) 조회는 IP 하나에 이름 하나를, 그것도 운영자가 굳이 설정했을 때만 준다. 패시브 DNS는 역사적 집합을 준다 — 그 주소로 해석된 적 있는 모든 도메인. 의심스러운 서버에 겨누면 공격자의 형제 도메인 전체, 같은 상자를 공유하는 것들이 쏟아진다.
  • 정확히 언제. first-seen·last-seen 도장이 정적 지도를 타임라인으로 바꾼다. 어떤 도메인이 사건의 창 동안 정확히 방탄 호스트를 가리켰고, 그 뒤 옮겨갔음을 증명할 수 있다.

침해대응은 이걸로 굴러간다. 하나의 지표 — 방화벽 로그에서 뽑은 악성 IP 하나 — 로 시작하면 패시브 DNS가 그것을 공격자의 발자국 전체로 피워낸다: 거기 주차한 도메인들, 그 도메인들이 건드린 다른 주소들, 작전의 모양과 수명. 돌 하나에 땅이 움직인다.

이걸 질의하는 표준도 있는데, 이 분야가 얼마나 진지한지를 말해준다. Common Output Format — Alexandre Dulaunoy(CIRCL), Aaron Kaplan(CERT.at), Paul Vixie, Henry Stern(Farsight)의 IETF 초안 — 은 패시브 DNS 답의 JSON 형태 하나를 정의해, 단일 클라이언트가 Farsight의 DNSDB, CIRCL, VirusTotal, 그리고 대여섯 제공자를 질의하고 결과를 병합하게 한다. 한 관측을 여러 독립 센서망에 교차 대조하는 것이 게임의 전부다. 어떤 단일 소스도 전부를 보지 못하고, 그들 사이의 일치가 데이터 한 점을 증거로 바꾼다.

그 밑에 깔린 정찰의 교훈

침해대응 프레임을 걷어내면 패시브 DNS는 정찰(recon)이 실제로 어떻게 작동하는지에 대한 선언이고, 영화 속 버전의 정반대다.

표적을 지도화하는 요란한 방법은 그것을 건드리는 것이다: 포트를 스캔하고, 서브도메인을 무차별 대입하고, 네임서버를 직접 질의한다. 그 하나하나가 표적의 로그에 발자국을 남기고, 유능한 방어자는 당신이 오는 걸 본다. 패시브 DNS는 완전히 다른 교리다. 표적에 단 한 개의 패킷도 보내지 않는다. 인터넷이 이미 그것에 대해 적어둔 것을 읽을 뿐이다 — 그 도메인들이 다른 모두에게 건넨 답을, 표적이 존재하는지도 모르고 닿을 수도 없는 센서들이 기록한 것을. 표적은 그 조회를 탐지할 수 없다. 조회가 표적을 건드리지 않기 때문이다. 그것은 과거의 데이터베이스를 건드린다.

이는 Certificate Transparency를 떠받치는 본능과 같다: 한 시스템에 대한 가장 오래가는 정보는, 그것이 통제하지 못하는 공개·추가전용 기록에 이미 뿜어낸 배기가스다. 인증서, DNS 답, 라우팅 공지 — 도메인은 이것들을 방송하지 않고는 운영할 수 없고, 일단 방송되면 누군가 적어두고 있었다. 최고의 관측은 관측당하는 쪽이 끌 수 없는 종류다. 이미 벌어진 일이기 때문이다.

아무도 광고하지 않는 함정

바로 여기서 불편해진다. 패시브 DNS에는 삭제 키가 없다. 당신 도메인이 한 주소로 해석되는 순간 — 실수로라도, 오타를 알아채고 고치기 전 5분 동안이라도 — 그 해석은 센서에 잡혀 한 줄로 중복 제거되고 무기한 보존될 수 있다. 패시브 DNS 데이터베이스에는 “잊힐 권리”가 없다. 인터넷이 이미 건넨 사실을 관측되지 않은 것으로 되돌릴 수 없다.

사라지고 싶어 하는 공격자를 쫓는 방어자에겐 그 영속성이 요점 전부다. 하지만 같은 영속성이, 한나절 노출한 내부 호스트명에도, 잠깐 실제 프로덕션 IP를 가리킨 스테이징 도메인에도, 아직 발표 안 한 인수합병의 새 서브도메인이 일주일 일찍 해석되기 시작한 것에도 똑같이 적용된다. 그중 무엇도 사람을 지목하지 않았다. 그 전부가 여전히 안에, first-seen과 last-seen으로, 올바른 주소로 축을 돌 생각을 하는 누군가를 기다리며 남아 있다.

DNS는 일부러 잊는다. 그렇게 만들어졌다. 패시브 DNS는 방어자들이 10년 전 내렸고 공개적으로 제대로 논쟁된 적 없는 조용한 결정이다 — 인터넷은 그래도 기억해야 한다는.

토론 참여

← 블로그로 돌아가기