[시큐어코딩 가이드] 2-2-15. 무결성 검사없는 코드 다운로드

무결성 검사없는 코드 다운로드

정의

  • 원격지에 위치한 소스코드 또는 실행 파일을 무결성 검사 없이 다운로드 후 이를 실행하는 프로그램이 존재한다. 이러한 프로그램은 호스트 서버의 변조, DNS 스푸핑(Spoofing), 전송 시의 코드 변조 등의 방법을 이용해 공격자가 악의적인 코드를 실행하는 위협에 취약하게 된다.
  • 파일 무결성을 확인하는 두 가지 주요 방법으로는 암호화 해시 및 디지털 서명이 있다.

 

안전한 코딩기법

  • DNS 스푸핑(Spoofing)을 방어할 수 있는 DNS lookup을 수행하고 코드 전송 시 신뢰할 수 있는 암호 기법을 이용해 코드를 암호화
  • 다운로드한 코드는 작업 수행을 위해 필요한 최소한의 권한으로 실행
  • 소스코드는 신뢰할 수 있는 사이트에서만 다운로드해야 하고 파일의 인증서 또는 해시값을 검사해 변조되지 않은 파일인지 확인

 

코드예제

다음은 안전하지 않은 코드예제로, request.get을 통해 원격에서 파일을 다운로드한 뒤 파일에 대한 무결성 검사를 수행하지 않아 파일 변조 등으로 인한 피해가 발생하는 코드입니다.

#무결성 검사없는 코드 다운로드(안전X)
def execute_remote_code_bad():
    url = 'https://www.somewhere.com/storage/code.py'
    
    file = requests.get(url)
    remote_code = file.content
    
    file_name = 'save.py'
    with open(file_name, 'wb') as f:
        f.write(remote_code)

 

다음은 안전한 코드예제로, 다운로드한 파일과 해당 파일의 해시값 비교 등을 통해 무결성 검사를 거치는 코드입니다.

#무결성 검사없는 코드 다운로드(안전O)
def execute_remote_code_good():
    config = configparser.RawConfigParser()
    config.read('sample_config.cfg')

    url = 'https://www.somewhere.com/storage/code.py'
    remote_code_hash = config.get('HASH', 'file_hash')

    file = requests.get(url)
    remote_code = file.content
    
    sha = hashlib.sha256()
    sha.update(remote_code)
    
    if sha.hexdigest() != remote_code_hash:
        raise Exception("파일이 손상되었습니다.")

    file_name = 'save.py'
    with open(file_name, 'wb') as f:
        f.write(remote_code)

 

 

 

보안기능/무결성 검사없는 코드 다운로드

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