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;
}
O 사용자 입력 값에 메모리나 버퍼의 블록크기보다 더 많은 데이터를 넣음으로써 결함을 발생시키는 취약점
O 근거 자료
☞ 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드 (p.653)
O 판단 기준
O 점검 방법
- 변수 값에 일반적인 버퍼 크기보다 큰 값을 입력 및 전달하여 에러 페이지나 오류가 발생하는지 점검
O 조치 방법
- 웹 서버 및 웹 서버 응용프로그램(WAS)의 제공사에서 안전성이 검증된 최신 보안 패치가 반영 및 적용되도록 유지
- 언어/플랫폼 별 정수 타입의 범위를 확인하여 사용하도록 하며, 정수형 변수를 연산에 사용하는 경우, 결과 값의 범위를 체크하는 모듈을 사용한다.
O 시큐어 코딩(Secure Coding) 예시
# JAVA ▶
# C# ▶
# C ▶