[시큐어코딩 가이드] 오류상황 대응 부재

 

 

 

■ 에러처리

 

에러를 처리하지 않거나, 불충분하게 처리하여 에러 정보에 중요정보(시스템 내부정보 등)가 포함될 때, 발생할 수 있는 취약점으로 에러를 부적절하게 처리하여 발생하는 보안약점이다.

 

 

오류상황 대응 부재(시큐어코딩 가이드)

 

■ 개요

 

오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외 처리를 하지 않을 경우, 공격자는 오류 상황을 악용하여 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있다.


예외처리는 코드를 견고하게 만들고 프로그램이 제어되지 않는 방식으로 중지되도록 하는 잠재적인 오류를 방지하는데 도움이 된다.

 

 

■ 안전한 코딩 기법

 

오류가 발생할 수 있는 부분에 대하여 제어문(try-except)을 사용하여 적절하게 예외 처리 한다.

 

 

코드예제

 

다음 예제는 try 블록에서 발생하는 오류를 포착(except)하고 있지만, 그 오류에 대해서 아무 조치를 하고 있지 않음을 보여준다. 아무 조치가 없으므로 프로그램이 계속 실행되기 때문에 개발자가 의도하지 않은 방향으로 프로그램이 동작될 수 있다.

 

안전하지 않은 코드의 예
import os
import binascii
import base64
from Crypto.Cipher import AES

static_keys=[
{'key' : b'\xb9J\xfd\xa9\xd2\xefD\x0b\x7f\xb2\xbcy\x9c\xf7\x9c',
‘iv' : b'\xf1BZ\x06\x03TP\xd1\x8a\xad"\xdc\xc3\x08\x88\xda'},
{'key' : b'Z\x01$.:\xd4u3~\xb6TS(\x08\xcc\xfc',
'iv' : b'\xa1a=:\xba\xfczv]\xca\x83\x9485\x14\x17'},
]
def encryption(key_id, plain_text):
static_key = {'key':b'0000000000000000', 'iv':b'0000000000000000'}

try:
static_key = static_keys[key_id]
except IndexError:
# key 선택 중 오류 발생 시 기본으로 설정된 암호화 키인
# ‘0000000000000000’ 으로 암호화가 수행된다.
pass

cipher_aes = AES.new(static_key['key'],AES.MODE_CBC,static_key['iv'])
encrypted_data = base64.b64encode(cipher_aes.encrypt(plain_text))
return encrypted_data.decode('ASCII')

 

예외상황 발생 시에 프로그램이 개발자의 의도와 다르게 동작하지 않도록 반드시 예외를 처리해야 한다.

 

안전한 코드의 예
import os
import binascii
import base64
from Crypto.Cipher import AES

static_keys=[
{'key' : b'\xb9J\xfd\xa9\xd2\xefD\x0b\x7f\xb2\xbcy\x9c\xf7\x9c',
‘iv' : b'\xf1BZ\x06\x03TP\xd1\x8a\xad"\xdc\xc3\x08\x88\xda'},
{'key' : b'Z\x01$.:\xd4u3~\xb6TS(\x08\xcc\xfc',
'iv' : b'\xa1a=:\xba\xfczv]\xca\x83\x9485\x14\x17'},
]
def encryption(key_id, plain_text):
static_key = {'key':b'0000000000000000', 'iv':b'0000000000000000'}

try:
static_key = static_keys[key_id]
except IndexError:
# key 선택 중 오류 발생 시 랜덤으로 암호화 키를 생성하도록 설정
static_key = {'key': secrets.token_bytes(16), 'iv': secrets.token_bytes(16)}
static_keys.append(static_key)

cipher_aes = AES.new(static_key['key'],AES.MODE_CBC,static_key['iv'])
encrypted_data = base64.b64encode(cipher_aes.encrypt(plain_text))
return encrypted_data.decode('ASCII')

 

 

댓글

Designed by JB FACTORY