[시큐어코딩 가이드] 오류상황 대응 부재
- 정보보안/시큐어코딩 가이드
- 2022. 8. 12.
■ 에러처리
에러를 처리하지 않거나, 불충분하게 처리하여 에러 정보에 중요정보(시스템 내부정보 등)가 포함될 때, 발생할 수 있는 취약점으로 에러를 부적절하게 처리하여 발생하는 보안약점이다.
오류상황 대응 부재(시큐어코딩 가이드)
■ 개요
오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외 처리를 하지 않을 경우, 공격자는 오류 상황을 악용하여 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있다.
예외처리는 코드를 견고하게 만들고 프로그램이 제어되지 않는 방식으로 중지되도록 하는 잠재적인 오류를 방지하는데 도움이 된다.
■ 안전한 코딩 기법
오류가 발생할 수 있는 부분에 대하여 제어문(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') |