1. 버퍼오버플로우

O 사용자 입력 값에 메모리나 버퍼의 블록크기보다 더 많은 데이터를 넣음으로써 결함을 발생시키는 취약점


O 근거 자료 

주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드 (p.653)


O 판단 기준

양호파라미터 입력 값에 대량의 값 입력 및 전달 시 에러 페이지나 오류가 발생되지 않는 경우
취약파라미터 입력 값에 대량의 값 입력 및 전달 시 다음과 같은 에러 페이지나 오류가 발생될 경우
- 정상적인 입력에서는 미 발생한 500에러나 에러 메시지가 발생할 경우 
- 내부의 일반 코드에서 에러가 발생했다는 메시지가 표시될 경우 
- 서버에서 완전하지 않거나 이상한 응답을 할 경우
- 응답을 받지 못하고 갑자기 연결이 끊어질 경우
- 전체 웹 사이트가 반응이 없을 경우 


O 점검 방법

- 변수 값에 일반적인 버퍼 크기보다 큰 값을 입력 및 전달하여 에러 페이지나 오류가 발생하는지 점검


O 조치 방법

웹 서버 및 웹 서버 응용프로그램(WAS)의 제공사에서 안전성이 검증된 최신 보안 패치가 반영 및 적용되도록 유지

언어/플랫폼 별 정수 타입의 범위를 확인하여 사용하도록 하며, 정수형 변수를 연산에 사용하는 경우, 결과 값의 범위를 체크하는 모듈을 사용한다.


O 시큐어 코딩(Secure Coding) 예시  

# JAVA ▶ 
String msg_str = "";
String tmp = request.getParameter("slf_msg_param_num");
tmp = StringUtil.isNullTrim(tmp);

if (tmp.equals("0")) {
    msg_str = PropertyUtil.getValue(msg_id);
} else {
    // 외부 입력값을 정수형으로 사용할 때 입력값의 크기를 검증하고 사용
    try {
        int param_ct = Integer.parseInt(tmp);
        if (param_ct < 0) {
            throw new Exception();
        }
        String[] strArr = new String[param_ct];
    } catch(Exception e) {
        msg_str = "잘못된 입력(접근) 입니다.";
    }
}


# C# ▶ 
public static void Main(string[] args)
{
    // checked 구문을 사용하여 오버플로우의 발생 여부 및 크기 확인
    try {
        int usrNum = checked(Int32.Parse(args[0]));
        string[] array = {"one", "two", "three", "four"};
        if (usrNum < 3)
        {
            string num = array[usrNum];
        }
    }
    catch (System.OverflowException e) 
    { 
        // 예외 처리 코드 
    }
}


# C ▶ 
int main(int argc, char* argv[]){
    // 외부 입력값을 사용할 때, 입력 값의 크기가 너무 클 경우 오버플로우 발생
    int usr_num = 0;
    char* num_array[] = {"one", "two", "three", "four"};
    char* num = NULL;
    
    usr_num = atoi(argv[1]);
    
    if (usr_num >= 0 && usr_num < 4) {
        num = num_array[usr_num];
    }
    
    return 0;
}