[시큐어코딩 가이드] DNS lookup에 의존한 보안결정
- 정보보안/시큐어코딩 가이드
- 2022. 8. 9.
■ API 오용
의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점이다.
DNS lookup에 의존한 보안결정
■ 개요
공격자가 DNS 엔트리를 속일 수 있으므로 도메인명에 의존에서 보안결정(인증 및 접근 통제 등)을 하지 않아야 한다.
만약, 로컬 DNS 서버의 캐시가 공격자에 의해 오염된 상황이라면, 사용자와 특정 서버 간의 네트워크 트래픽이 공격자를 경유하도록 할 수도 있다. 또한, 공격자가 마치 동일 도메인에 속한 서버인 것처럼 위장할 수도 있다.
■ 안전한 코딩 기법
보안결정에서 도메인명을 이용한 DNS lookup을 하지 않도록 한다.
코드예제
다음의 예제는 도메인명을 통해 해당 요청을 신뢰할 수 있는지를 검사한다. 그러나 공격자는 DNS 캐쉬 등을 조작해서 쉽게 이러한 보안 설정을 우회할 수 있다.
안전하지 않은 코드의 예 |
import socket def is_trust(host_domain_name): trusted = False trusted_host = "trust.example.com" # 공격자에 의해 실행되는 서버의 DNS가 변경될 수 있으므로 # 안전하지 않다 if trusted_host == host_name: trusted = True return trusted |
도메인명을 이용한 비교를 하지 말고 IP 주소를 직접 비교하도록 수정한다.
안전한 코드의 예 |
import socket def is_trust(host_domain_name): trusted = False trusted_ip = "192.168.10.7“ # 실제 서버의 IP 주소를 비교하여 DNS 변조에 대응 dns_resolved_ip = socket.gethostbyaddr(host_domain_name) if trusted_ip == dns_resolved_ip: trusted = True return trusted |