[시큐어코딩 가이드] 2-7-1. DNS lookup에 의존한 보안결정

API 오용

의도된 사요에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안약점이다.

 

DNS lookup에 의존한 보안결정

정의

공격자가 DNS 엔트리를 속일 수 있으므로 도메인명에 의존해서 보안결정(인증 및 접근통제 등)을 하지 않아야 합니다. 만약, 로컬 DNS 서버의 캐시가 공격자에 의해 오염된 상황이라면, 사용자와 특정 서버 간의 네트워크 트래픽이 공격자를 경유하도록 할 수도 있고, 공격자가 마치 동일 도메인에 속한 서버인 것처럼 위장할 수도 있습니다.

 

안전한 코딩기법

보안결정에서 도메인명을 이용한 DNS lookup을 하지 않도록 해야 합니다.

 

코드예제

다음은 안전하지 않은 코드예제입니다. 도메인명을 통해 해당 요청을 신뢰할 수 있는지를 검사하는 코드로, 공격자는 DNS 캐시 등을 조작해서 쉽게 이러한 보안 설정을 우회할 수 있습니다.

#DNS lookup에 의존한 보안결정(안전X)
def is_trust(domain):
    trusted = False
    trusted_host = 'host.ex.com'

    if trusted_host == domain:
        trusted = True

    return trusted

 

다음은 안전한 코드예제로, 도메인명을 이용한 비교를 하지 않고 IP 주소를 직접 비교하는 코드입니다.

#DNS lookup에 의존한 보안결정(안전O)
def is_trust(domain):
    trusted = False
    trusted_ip = '192.168.3.2'
    dns_ip = socket.gethostbyname(domain)

    if trusted_ip == dns_ip:
        trusted = True

    return trusted

 

 

 

API오용/DNS lookup에 의존한 보안결정

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)