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

 

 

 

■ 보안기능

 

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.

 

 

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

 

■ 개요

 

원격으로부터 소스코드 또는 실행파일을 무결성 검사 없이 다운로드 받고, 이를 실행하는 제품들이 종종 존재한다. 이는 호스트 서버의 변조, DNS 스푸핑(Spoofing) 또는 전송 시의 코드 변조 등의 방법을 이용하여 공격자가 악의적인 코드를 실행할 수 있도록 한다.


파일(및 해당 소프트웨어) 무결성을 확인하는 두 가지 주요 방법으로는 암호화 해시 및 디지털 서명이 있다. 무결성을 보장하기 위해 해시를 사용하고 가능하면 적절한 코드 서명 인증서를 사용하고 확인하는 것이 더 안전하다.

 

 

■ 안전한 코딩 기법

 

DNS 스푸핑(Spoofing)을 방어할 수 있는 DNS lookup을 수행하고 코드 전송 시 신뢰할 수 있는 암호 기법을 이용하여 코드를 암호화한다.

 

또한 다운로드한 코드는 작업 수행을 위해 필요한 최소한의 권한으로 실행하도록 한다.


소스는 신뢰할 수 있는 사이트에서 다운로드하여야 하고 파일의 인증서 또는 해쉬값을 검사하여 변조되지 않은 파일인지 확인하여야 한다.

 

 

코드예제

 

이 예제는 requests.get을 통해 원격에서 파일을 다운로드한 뒤 파일에 대한 무결성 검사를 수행하지 않아 파일변조 등으로 인한 피해가 발생할 수 있는 경우이다. 이러한 경우 공격자는 악의적인 코드를 실행할 수 있다.

 

안전하지 않은 코드의 예
import os
import requests
from urllib.parse import urlparse

def execute_remote_code():
#신뢰되지 않는 사이트에서 코드를 다운로드
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(file.content)
......

 

안전한 코드 실행을 위하여 다운로드한 파일과 해당 파일의 해시값 비교 등을 통해 무결성 검사를 거치고 코드를 실행하여야 한다.

 

안전한 코드의 예
import requests
import hashlib

def execute_remote_code():
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(file.content)
......

 

 

댓글

Designed by JB FACTORY