Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-정수형 오버플로우 본문
작성일: 230704
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(290~296p)
구분 | - 입력데이터 검증 및 표현 |
설계단계 | - 보안기능 입력값 검증 https://cryptocurrencyclub.tistory.com/97 |
개요 | 정수형 오버플로우는 정수값이 증가하면서 허용된 가장 큰 값보다 커져서 실제 저장되는 값이 의도치않게 아주 작은 수이거나 음수가 되어 발생한다. 특히 반복문 제어, 메모리 할당, 메모리 복사 등을 위한 조건으로 사용자가 제공하는 입력값을 사용하고 그 과정에서 정수형 오버플로우가 발생하는 경우 보안상 문제를 유발할 수 있다. |
진단 세부사항 (설계단계) |
① 사용자의 역할, 권한을 결정하는 정보는 서버에서 관리해야 한다. 사용자 및 권한 확인 절차를 확인하여 서버에서 관리하는 세션정보를 사용하도록 설계하고 있는지 확인한다. ㅇ 사용자에 대한 역할을 구분하고 있으며, 각 역할 별 권한의 구분 여부 확인 ㅇ 사용자의 역할과 권한을 정의하여 저장할 수 있도록 데이터베이스가 설계되어 있는지 확인 ㅇ 사용자의 역할과 권한을 검증하는 모듈이 설계되어 있거나, 외부 라이브러리를 사용하는 경우 사용자의 권한이나 역할 검증을 위한 정보가 DB 또는 세션에 저장되도록 설계되어 있는 지 확인 ㅇ 조작된 입력 파라미터, 쿠키 등을 전달하여 사용자의 역할이나 권한 체크가 우회되는지 점검하기 위한 테스트계획이 수립되어 있는지 확인 ② 쿠키값, 환경변수, 파라미터 등 외부입력값이 보안기능을 수행하는 함수의 인자로 사용되는 경우, 입력값에 대한 검증작업을 수행한 뒤 제한적으로 사용해야 한다. 외부입력값을 이용하여 사용자 및 권한 확인 등 보안기능에 사용하는 경우 입력값을 검증하도록 명시하고 있는지 확인한다. ㅇ 보안기능 수행에 사용되는 값의 종류, 출처, 의미 등의 정의 여부 확인 ㅇ 외부 입력값을 사용해야 하는 경우, 타당한 근거/사유가 명시되어 있는지 확인 ㅇ 보안기능 수행에 외부 입력ㄱ밧이 사용되는 경우, 외부 입력값에 대한 검증 방법 정의 여부 확인(NULL 검사, 정수오버플로우 등) ㅇ 외부입력값을 조작하여 보안 기능의 무력화 또는 오작동 여부를 점검하기 위한 테스트 계획의 수립 여부 확인 ③ 중요상태정보나 인증, 권한결정에 사용되는 정보는 쿠키로 전송되지 않아야 하며, 불가피하게 전송하는 경우에는 해당 정보를 암호화해서 전송해야 한다. 생성되는 응답페이지에 외부입력값이 사용되는 경우 사용자 입력값에 스크립트가 포함되어 있는지 검증하도록 설계하고 있는지 확인한다. ㅇ 쿠키에 포함될 정보의 이름, 값, 의미, 유효기간 등을 정의하고 있는지 확인(중요정보가 포함되는 경우 근거/사유) ㅇ 중요정보를 쿠키로 전달하는 경우 암호화처리방식 설계여부 확인(암호화 통신채널 or 쿠키를 안전한 암호알고리즘을 사용하여 암호화하여 전송) ㅇ 쿠키로 전달된 중요정보의 무결성 검사 방법과 모듈의 설계 여부 확인 ㅇ 쿠키에 포함된 값을 복호화하거나 변조된 쿠키를 전달하여 정보 조작이 가능한지 점검하기 위한 테스트계획 수립 여부 확인 |
보안대책 (구현단계) |
언어·플랫폼별 정수타입의 범위를 확인하여 사용한다. 정수형 변수를 연산에 사용하는 경우, 결과값의 범위를 체크하는 모듈을 사용한다. 외부입력 값을 동적 메모리 할당에 사용하는 경우, 변수값이 적절한 범위 내에 존재하는 값인지 확인한다. |
진단방법 (구현단계) |
① 변수를 사용하여 배열의 크기를 동적으로 결정하고 있는 경우, ② 변수가 외부 입력값인지 확인하고, 해당 변수가 의도한 범위내에 존재하는지 확인하는 절차가 있는지 확인한다. 외부 입력값에 대한 검증 절차가 없다면 취약하다. |
다. 코드예제
ㅇ 분석
1: String msg_str = "";
2: String tmp = request.getParameter("slf_msg_param_num");
3: tmp = StringUtil.isNullTrim(tmp);
4: if (tmp.equals("0")) {
5: msg_str = PropertyUtil.getValue(msg_id);
6: } else {
// 외부 입력값을 정수형으로 사용할 때 입력값의 크기를 검증하지 않고 사용
7: int param_ct = Integer.parseInt(tmp);
8: String[] strArr = new String[param_ct];
ㅇ 내용
1. tmp값을 받아 r7에서 그대로 입력해서 문자형 배열 크기에 적용하고 있음.
ㅇ 수정
1: String msg_str = "";
2: String tmp = request.getParameter("slf_msg_param_num");
3: tmp = StringUtil.isNullTrim(tmp);
4: if (tmp.equals("0")) {
5: msg_str = PropertyUtil.getValue(msg_id);
6: } else {
// 외부 입력값을 정수형으로 사용할 때 입력값의 크기를 검증하고 사용
7: try {
8: int param_ct = Integer.parseInt(tmp);
9: if (param_ct < 0) {
10: throw new Exception();
11: }
12: String[] strArr = new String[param_ct];
13: } catch(Exception e) {
14: msg_str = "잘못된 입력(접근) 입니다.";
15: }
ㅇ 내용
1. 음수여부를 체크하는 기능을 넣음. 너무 큰 경우는??
ㅇ 분석
1: public static void Main(string[] args)
2: {
// 외부 입력값을 사용할 때, 입력 값의 크기가 너무 클 경우 오버플로우 발생
3: int usrNum = Int32.Parse(args[0]);
4: string[] array = {"one", "two", "three", "four"};
5: string num = array[usrNum];
6: }
ㅇ 내용
1. 이거는 인덱싱 매칭하는데 외부입력값 그대로 사용함
ㅇ 수정
1: public static void Main(string[] args)
2: {
3: // checked 구문을 사용하여 오버플로우의 발생 여부 및 크기 확인
4: try{
5: int usrNum = checked(Int32.Parse(args[0]));
6: string[] array = {"one", "two", "three", "four"};
7: if(usrNum < 3)string num = array[usrNum];
8: }
9: catch (System.OverflowException e) { … }
10: }
ㅇ 내용
1. 아래 오버플로우 체크를 넣고 + if(usrNum<3) 써서 array - num 매핑함(음수필터링 어디?)
ㅇ 분석
1: void main(int argc, char* argv[])
2: {
// 외부 입력값을 사용할 때, 입력 값의 크기가 너무 클 경우 오버플로우 발생
3: int usr_num = 0;
4: char* num_array[] = {“one”, “two”, “three”, “four”};
5: char* num = NULL;
6: usr_num = atoi(argv[1]);
7: num = num_array[usr_num];
8: }
ㅇ 내용
1. 이것도 검증 안함~
ㅇ 수정
1: void main(int argc, char* argv[])
2: {
// 외부 입력값을 사용할 때, 입력 값의 크기가 너무 클 경우 오버플로우 발생
3: int usr_num = 0;
4: char* num_array[] = {“one”, “two”, “three”, “four”};
5: char* num = NULL;
6: usr_num = atoi(argv[1]);
7: if (usr_num >= 0 && usr_num < 4) {
8: num = num_array[usr_num];
9: }
10:}
ㅇ 내용
1. 바로 이전 거랑 동일한 방식인데 음수까지 필터링함
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-메모리 버퍼 오버플로우 (0) | 2023.07.04 |
---|---|
구현단계 보안약점 제거 기준-보안기능 결정에 사용되는 부적절한 입력값 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-HTTP 응답분할 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-서버사이드 요청 위조 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-크로스사이트 요청 위조 (0) | 2023.07.04 |