[시큐어코딩 가이드] 2-2-11. 부적절한 인증서 유효성 검증

부적절한 인증서 유효성 검증

정의

인증서가 유효하지 않거나 악성인 경우, 공격자가 호스트와 클라이언트 사이의 통신 구간을 가로채 신뢰하는 엔티티인 것처럼 속일 수 있다. 이로 인해 대상 호스트가 신뢰 가능한 것으로 믿고 악성 호스트에 연결하거나 신뢰된 호스트로부터 전달받은 것처럼 보이는 스푸핑 된(또는 변조된 데이터)를 아무런 의심 없이 수신하는 상황이 발생할 수 있다.

 

안전한 코딩기법

데이터 통신에 인증서를 사용하는 경우 송신 측에서 전달한 인증서가 유효한지 검증한 후 데이터를 송수신해야 한다.

 

코드예제

다음은 안전하지 않은 코드예제로, SSL 기반 소켓 연결 코드입니다. 클라이언트 측에서 통신 대상 서버를 인증하지 않고 접속하는 상황입니다. 이런 경우 서버를 신뢰할 수 없으며 클라이언트 시스템에 영향을 주는 악성 데이터를 수신할 수 있습니다.

#부적절한 인증서 유효성 검증(안전X)
HOST, PORT = '127.0.0.1', 7917
def connect_with_server_bad():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
        context = ssl.SSLContext()

        context.verify_mode = ssl.CERT_NONE

        with context.wrap_socket(sock) as ssock:
            try:
                ssock.connect((HOST, PORT))
                ssock.send('Hello~ I am a vulnerable client :)'.encode('utf-8'))
                data = ssock.recv(1024).decode('utf-8')
                print(f'server from ({HOST}, {PORT}: {data}\n')
            finally:
                ssock.close()

 

다음은 안전한 코드예제입니다. SSL 연결 시 PROTOCOL_TLS_CLIENT 프로토콜을 추가하여 인증서 유효성 검사와 호스트 이름 확인을 위한 context를 구성하면 verify_mode가 CERT_REQUIRED로 설정되면서 서버의 인증서 유효성을 검증할 수 있습니다.

#부적절한 인증서 유효성 검증(안전O)
CURRENT_PATH = os.getcwd()
HOST_NAME = 'test-server'
HOST, PORT = '127.0.0.1', 7917
SERVER_CA_PEM = f'{CURRENT_PATH}/rsa_server/CA.pem'
def connect_with_server_good():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
        context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
        context.load_verify_locations(SERVER_CA_PEM)
        
        with context.wrap_socket(sock, server_hostname=HOST_NAME) as ssock:
            try:
                ssock.connect((HOST, PORT))
                ssock.send('Hello I am a patched client :)'.encode('utf-8'))
                data = ssock.recv(1024).decode('utf-8')
                print(f'server from ({HOST}, {PORT}: {data}\n')
            finally:
                ssock.close()

 

 

 

보안기능/부적절한 인증서 유효성 검증

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