본문 바로가기

🌐 DNS lookup에 의존한 보안결정 - 실습 시뮬레이터

CWE-350: Reliance on Reverse DNS Resolution for Security Decision

KISA 소프트웨어 보안약점 진단가이드(2021) · API 오용
💡 쉽게 말하면
"옆 동네에서 왔다"는 말(DNS 이름)만 믿고 권한을 주면 거짓말(스푸핑)에 속습니다. 인증 토큰으로 신원을 확인해야 합니다.
✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ DNS 의존 식별
  • ⬜ 인증 기반 전환
☕ Java 코드 에디터 취약한 코드
AccessControl.java 💡 역DNS 이름 대신 인증 토큰/검증으로 인가하세요.
// [취약] 역DNS 이름으로 인가 결정 → DNS 스푸핑으로 우회 가능
String host = request.getRemoteHost();   // 역DNS 조회 결과
if (host.endsWith(".trusted.com")) {
    grantAdmin();
}
💡 수정 가이드 (KISA 기준)
1. 신뢰 기반 변경

DNS 대신 인증된 자격증명.

// 호스트명 대신 서명된 토큰/상호TLS로 신원 검증 if (auth.verifyToken(request.getHeader("Authorization")) && auth.hasRole("ADMIN")) { grantAdmin(); }
📊 분석 결과 및 설명
🎯 목표

보안 결정을 위조 가능한 역DNS가 아닌 인증/암호 검증에 기반해야 합니다.

⚠️ 현재 취약점

Reverse DNS Trust

DNS 스푸핑으로 호스트명 기반 인가가 우회됩니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ DNS 의존 식별
  • ⬜ 검증 기반 전환
🐍 Python 코드 에디터 취약한 코드
access_control.py 💡 역DNS(PTR) 대신 토큰/HMAC 검증으로 신뢰를 판단하세요.
import socket
# [취약] 역DNS(PTR) 이름으로 신뢰 판단 → 스푸핑 우회 가능
name = socket.gethostbyaddr(client_ip)[0]
if name.endswith(".trusted.com"):
    grant_admin()
💡 수정 가이드 (KISA 기준)
1. 검증 기반

DNS 대신 토큰/HMAC.

# PTR 이름 대신 서명 토큰 검증 if verify_token(request.headers.get("Authorization")): grant_admin()
📊 분석 결과 및 설명
🎯 목표

보안 결정을 DNS가 아닌 암호학적 검증에 기반합니다.

⚠️ 현재 취약점

Reverse DNS Trust

PTR 스푸핑으로 인가가 우회됩니다.

📰 실제 사고사례 & 표준 매핑
2008년 Kaminsky DNS 캐시 포이즈닝으로 DNS 응답을 신뢰한 시스템들이 위조 주소로 유도될 수 있었습니다.
🏷️ CWE-350
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류