1. 라이브러리
  2. DNS
  3. DNS 보안

업데이트됨 1개월 전

DNS 캐시 포이즈닝은 DNS가 신뢰를 기반으로 설계되었기 때문에 가능합니다.

여러분의 컴퓨터가 "bank.com의 IP 주소가 뭐야?"라고 물으면, 그 질문은 리졸버로 전달됩니다. 리졸버는 권한 있는 네임서버에 물어봅니다. 그리고 바로 여기에 취약점이 있습니다: 리졸버는 먼저 답하는 쪽을 믿습니다. 검증도 없고, 암호화 증명도 없습니다. 그저 먼저 도착하는 쪽이 이깁니다.

공격자가 정상적인 응답이 오기 전에 위조된 답변을 주입하면, 여러분의 트래픽을 어디든 원하는 곳으로 돌릴 수 있습니다. 그리고 리졸버는 답변을 캐싱하기 때문에 그 거짓말은 계속 유지됩니다—캐시가 만료될 때까지 이후의 모든 요청을 오염시킵니다. 단 한 번의 성공적인 공격으로 수천 명의 사용자를 몇 시간 동안 엉뚱한 곳으로 유도할 수 있습니다.

경쟁 조건

DNS 쿼리는 매번 경주를 만들어냅니다. 리졸버가 권한 있는 네임서버에 질문을 보내는 순간, 두 주자가 결승선을 향해 달립니다: 실제 서버에서 돌아오는 정상적인 답변과, 공격자가 주입할 수 있는 위조된 답변입니다.

리졸버는 먼저 도착하는 것을 받아들입니다—정상적으로 보이기만 한다면.

위조된 응답이 통과하려면 특정 조건을 충족해야 합니다. 트랜잭션 ID(리졸버가 선택한 16비트 숫자)가 올바라야 합니다. 응답이 예상된 IP 주소에서 온 것처럼 보여야 합니다. 리졸버의 올바른 포트를 대상으로 해야 합니다.

초기 DNS 구현에서는 이것이 쉬웠습니다. 리졸버는 예측 가능한 트랜잭션 ID와 고정된 소스 포트(보통 포트 53)를 사용했습니다. 공격자는 16비트 숫자만 맞히면 됐는데—경우의 수가 65,536가지에 불과했습니다. 현대적인 네트워크 속도에서, 단일 쿼리 창 동안 수천 개의 위조 응답을 뿌리는 것은 어렵지 않았습니다.

카민스키의 발견

2008년, 댄 카민스키는 캐시 포이즈닝을 이론적인 골칫거리에서 즉각적인 위기로 바꿔놓은 것을 발견했습니다.

기존 공격에는 제한이 있었습니다: 이미 캐시에 없는 레코드만 공격할 수 있었습니다. bank.com이 24시간 동안 캐시되어 있다면, 다음 시도까지 24시간을 기다려야 했습니다. 이것은 공격을 느리고 신뢰하기 어렵게 만들었습니다.

카민스키는 인접한 서브도메인을 공격함으로써 이것을 완전히 우회할 수 있다는 것을 깨달았습니다.

bank.com을 직접 공격하는 대신, randomgarbage1.bank.com을 쿼리합니다. 캐시 미스가 발생하고—리졸버는 권한 있는 서버에 물어봐야 합니다. randomgarbage2.bank.com을 쿼리합니다. 또 캐시 미스입니다. 기다림 없이, 즉시, 무제한으로 쿼리를 유발할 수 있습니다.

바로 이게 절묘한 점입니다: 가비지 서브도메인을 오염시키려는 게 아닙니다. DNS 응답에는 서버가 유용한 추가 정보를 포함할 수 있는 "추가 레코드 섹션"이 있습니다. 카민스키의 위조 응답은 가비지 쿼리에 답하면서도 오염된 네임서버 레코드를 포함했습니다: "그런데 bank.com 전체의 네임서버는 사실 ns.attacker.com입니다."

자식을 공격해서 부모를 오염시키는 것입니다.

그 네임서버 레코드가 캐시되면, 공격자는 해당 도메인 전체의 DNS 확인을 제어합니다. 모든 서브도메인. 모든 서비스. 전부 다.

카민스키는 폴 빅시에게 연락했고, 빅시는 심각성을 이렇게 표현했습니다: "디지털 우주의 모든 것에 패치가 적용되어야 할 것입니다."1 이 공개는 인터넷 역사상 가장 대규모의 협력적 보안 패치를 촉발했습니다—2008년 7월 8일, 81개 벤더가 동시에 수정 사항을 배포했습니다.

소스 포트 무작위화

즉각적인 해결책은 공격자가 맞혀야 하는 변수를 하나 더 추가했습니다: 소스 포트.

기존 리졸버는 포트 53에서 모든 쿼리를 보냈습니다. 공격자는 16비트 트랜잭션 ID만 맞히면 됐습니다. 소스 포트 무작위화는 각 쿼리를 1024에서 65535 사이의 임의 포트에서 보냅니다—대략 16비트의 불확실성을 추가합니다.

수학이 크게 달라집니다. 65,536가지 조합 대신, 공격자는 약 40억 가지 경우의 수와 마주합니다. 50% 성공률을 위해 수백 번 시도하는 대신, 수백만 번이 필요합니다.

이것은 이제 모든 현대적인 리졸버의 표준입니다. 그러나 이것은 확률적 방어이지 보장은 아닙니다. 포트를 예측 가능하게 재작성하는 네트워크 장치, 아웃바운드 포트 범위를 제한하는 방화벽, 또는 충분한 시간과 대역폭으로도 여전히 성공적인 공격이 가능합니다.

소스 포트 무작위화는 캐시 포이즈닝을 어렵게 만듭니다. 불가능하게 만들지는 않습니다.

공격은 계속 진화한다

연구자들은 계속해서 새로운 각도를 찾아냅니다. SAD DNS(2020)는 Linux의 ICMP 속도 제한이 리졸버가 사용하는 소스 포트를 추정하는 데 악용될 수 있음을 보여줬고, 공격 가능한 경우의 수를 크게 좁혔습니다. 리졸버의 38% 이상이 취약한 상태였습니다.2

MaginotDNS(2023)는 재귀 리졸버와 포워더 역할을 동시에 수행하는 DNS 서버가 응답 유효성을 검사하는 방식에서 악용 가능한 약점을 갖고 있음을 발견했습니다. 이 공격은 .com과 .net 같은 최상위 도메인을 포함한 전체 DNS 영역을 장악할 수 있었습니다. 측정 연구에서 이런 서버의 35.5%가 취약한 것으로 나타났습니다.

2025년에도 BIND 9(가장 널리 배포된 DNS 소프트웨어)에서 소스 포트와 쿼리 ID를 예측해 캐시 포이즈닝을 가능하게 하는 치명적인 취약점이 발견되었습니다.3

고양이와 쥐의 게임은 계속됩니다.

DNSSEC: 진짜 해결책

DNSSEC는 신뢰를 암호화로 대체합니다.

모든 DNS 영역은 서명 키를 받습니다. 응답에는 디지털 서명이 포함됩니다. 리졸버는 부모 영역에 게시된 공개 키와 대조해 서명을 검증하며, DNS 루트까지 이어지는 신뢰 사슬을 형성합니다.

DNSSEC 검증 리졸버가 응답을 받으면, 서명을 확인합니다. 끊어지지 않은 신뢰 사슬과 함께 유효한 서명이 있으면? 답변을 수락합니다. 서명이 없거나, 유효하지 않거나, 사슬이 끊어졌으면? 거부합니다.

이것은 기존의 캐시 포이즈닝을 불가능하게 만듭니다. 공격자가 경주에서 이기더라도, 트랜잭션 ID와 소스 포트를 정확히 맞히더라도, 암호화 서명을 위조할 수는 없습니다. 영역의 개인 키 없이는 위조된 응답이 검증에 실패하고 폐기됩니다.

DNSSEC는 DNS를 "먼저 답하는 쪽을 믿는다"에서 "답할 권한이 있음을 증명할 수 있는 쪽을 믿는다"로 바꿉니다.

공격 감지

캐시 포이즈닝 시도는 흔적을 남깁니다.

단일 쿼리에 대한 다수의 응답. 리졸버가 하나의 질문에 여러 답변을 받는다면, 누군가 경쟁 응답을 보내고 있다는 신호입니다. 현대적인 리졸버는 이러한 이상 징후를 기록합니다.

무작위 서브도메인 쿼리의 홍수. 카민스키 스타일의 공격은 특징적인 패턴을 만들어냅니다—xk7f9.bank.com, m3pq2.bank.com처럼 존재한 적 없는 서브도메인에 대한 쿼리가 초당 수천 개씩 쏟아집니다.

확인 불일치. 여러분의 리졸버가 bank.com에 대해 구글 리졸버와 다른 IP를 반환한다면, 뭔가 잘못된 것입니다. 여러분의 리졸버가 오염됐거나 구글의 리졸버가 오염된 것입니다.

포이즈닝이 감지되면, 즉시 영향받은 캐시 항목을 비웁니다. 아직 활성화되지 않았다면 DNSSEC 검증을 활성화하세요. 리졸버가 자신의 네트워크에서만 쿼리를 수락하도록 제한하세요—공격자가 원격으로 쿼리를 유발하지 못하게 합니다.

실제로 일어난 일들

2010년, 중국의 그레이트 파이어월이 우연히 국경 밖으로 새어나갔습니다.4 중국의 DNS 서버는 Facebook, YouTube, Twitter 같은 차단된 사이트에 대해 거짓 답변을 반환합니다—이것은 의도적인 검열입니다. 그러나 중국 밖의 한 ISP가 중국 DNS 서버에서 레코드를 가져와 오염된 응답을 캐싱했을 때, 칠레와 미국의 사용자들이 갑자기 해당 사이트에 접근할 수 없게 됐습니다. 검열 시스템이 의도한 경계를 벗어난 것입니다.

2016년, 공격자들은 브라질 ISP의 DNS를 오염시켜 은행 고객들을 완벽하게 복제된 피싱 사이트로 유도했습니다. 아무도 알아차리기 전에 수천 개의 계정이 침해됐습니다. 공격은 몇 시간 동안 지속됐습니다.

2023년, 공격자들은 주요 ISP의 DNS 리졸버를 표적으로 삼아 수천 명의 사용자를 피싱 사이트로 리디렉션하는 잘못된 레코드를 주입했고, 탐지되기까지 몇 시간이 걸렸습니다.5

DNS 캐시 포이즈닝은 이론적인 것이 아닙니다. 지금도 일어나고 있습니다. 문제는 여러분의 인프라가 방어되어 있느냐는 것입니다.

DNS 캐시 포이즈닝에 관한 자주 묻는 질문

오염된 캐시 항목은 얼마나 오래 지속되나요?

TTL(유효 기간)이 만료될 때까지입니다—정상 도메인이 DNS 레코드를 어떻게 설정했는지에 따라 보통 몇 분에서 몇 시간입니다. 공격자는 공격 창을 최대화하기 위해 위조된 응답에 긴 TTL을 설정하는 경우가 많습니다.

캐시 포이즈닝이 HTTPS 사이트에도 영향을 미칠 수 있나요?

그렇습니다. DNS 포이즈닝은 TLS가 시작되기도 전에 여러분을 공격자의 서버로 리디렉션합니다. 공격자의 서버는 사기성 인증서(브라우저 경고를 유발)를 제시하거나, 인증 기관을 침해한 경우 정상적으로 보이는 인증서를 제시할 수 있습니다. 리디렉션은 HTTPS 아래의 네트워크 계층에서 발생합니다.

DNSSEC가 왜 모든 곳에 배포되지 않나요?

복잡성과 관성 때문입니다. DNSSEC는 도메인 소유자(영역에 서명해야 함), 레지스트라(DS 레코드를 게시해야 함), 리졸버(서명을 검증해야 함) 사이의 조율이 필요합니다. 2024년 기준으로 약 6%의 도메인만이 DNSSEC 서명이 되어 있지만, 전 세계 DNS 쿼리의 약 30%는 리졸버에 의해 검증됩니다.6 일부 국가는 훨씬 잘하고 있습니다—스웨덴은 요청의 80% 이상을 검증합니다. 많은 조직이 이것을 우선순위로 두지 않았고, 일부는 운영 복잡성에 대한 우려가 있습니다.

내 리졸버가 DNSSEC를 검증하는지 확인할 수 있나요?

그렇습니다. dnssec-failed.org 같은 DNSSEC 테스트 사이트를 방문해 보세요—리졸버가 DNSSEC를 올바르게 검증한다면, 의도적으로 손상된 이 도메인은 확인에 실패해야 합니다. 정상적으로 접속된다면 리졸버가 검증을 하지 않는 것입니다.

캐시 포이즈닝과 DNS 하이재킹의 차이점은 무엇인가요?

캐시 포이즈닝은 위조된 응답을 통해 리졸버의 캐시에 거짓 정보를 주입합니다. DNS 하이재킹은 권한 있는 네임서버 자체를 장악합니다—침해된 자격 증명, 레지스트라 공격, 또는 BGP 하이재킹을 통해서입니다. 하이재킹은 더 직접적이지만 더 많은 접근 권한이 필요합니다; 포이즈닝은 취약한 리졸버에 대해 원격으로 수행될 수 있습니다.

출처

이 페이지가 도움이 되었나요?

😔
🤨
😃