[시큐어코딩 가이드] 2-1-14. 정수형 오버플로우

정수형 오버플로우

정의

정수형 크기가 고정된 상태에서 변수가 저장할 수 있는 범위를 넘어선 값을 저장하려 할 때 실제 저장되는 값이 의도치 않게 아주 작은 수 또는 음수가 되어 프로그램이 예기치 않게 동작하게 되는 취약점

 

안전한 코딩기법

기본 파이썬 자료형을 사용하지 않고 패키지에서 제공하는 데이터 타입을 사용할 경우 해당 패키지에서 제공하는 데이터 타입의 표현 방식과 최대 크기를 반드시 확인

 

코드예제

다음 코드는 안전하지 않은 코드예제로, 거듭제곱을 계산해 그 결과를 반환하는 코드입니다. 계산 가능한 숫자에 대한 검증이 없어 에러는 발생하지 않지만, 반환값을 처리하는 함수에서 예기치 않은 오류가 발생할 수 있습니다.

import numpy as np

def handle_data_bad(num, pow):
    res = np.power(num, pow, dtype=np.int64)
    return res

handle_data_bad(64,10) # 1152921504606846976
handle_data_bad(50,1000) # 0

 

오버플로우 발생을 막기위해 입력값이 사용하는 데이터 타입의 최소보다 크거나 최대보다 작은지 확인을 해야 합니다.

다음은 안전한 코드예제입니다.

import numpy as np

MAX_NUM = np.iinfo(np.int64).max
MIN_NUM = np.iinfo(np.int64).min
def handle_data_good(num, pow):
    cal = num ** pow
    if cal > MAX_NUM or cal < MIN_NUM:
        return -1
    res = np.power(num, pow, dtype=np.int64)
    return res

handle_data_good(12,10) # 61917364224
handle_data_good(50,1000) # -1

 

 

 

입력데이터 검증 및 표현/정수형 오버플로우

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