소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.
SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.
해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.
12. 정수형 오버플로우
가. 개요
정수형 오버플로우는 정수값이 증가하면서 허용된 가장 큰 값보다 커져서 실제 저장되는 값이 의도 치 않게 아주 작은 수이거나 음수가 되어 발생한다. 특히 반복문 제어, 메모리 할당, 메모리 복사 등을 위한 조건으로 사용자가 제공하는 입력값을 사용하고 그 과정에서 정수형 오버플로우가 발생하는 경우 보안상 문제를 유발할 수 있다.
나. 보안대책
언어·플랫폼별 정수타입의 범위를 확인하여 사용한다. 정수형 변수를 연산에 사용하는 경우, 결과값 의 범위를 체크하는 모듈을 사용한다. 외부입력값을 동적 메모리 할당에 사용하는 경우, 변수값이 적절한 범위 내에 존재하는 값인지 확인한다.
다. 코드예제
다음의 예제는 외부의 입력(slf_msg_param_num)을 이용하여 동적으로 계산한 값을 배열의 크기 (size)를 결정하는데 사용하고 있다. 만일 외부 입력으로부터 계산된 값(param_ct)이 오버플로우에 의해 음수값이 되면, 배열의 크기가 음수가 되어 시스템에 문제가 발생할 수 있다.
- 안전하지 않은 코드의 예 JAVA -
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];
- 안전한 코드의 예 JAVA -
동적 메모리 할당을 위해 외부 입력값을 배열의 크기로 사용하는 경우 그 값이 음수가 아닌지 검사 하는 작업이 필요하다.
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: …
2: String cnt = request.getParameter(“cnt”);---------------------②
3: if( cnt == null ) {
4: cnt = “0”;
5: }
6: int cntI = Integer.parseInt(cnt);
7: String[] arr = new String[cntI];-----------------------------①
8: for( int i = 0 ; i <cntI ; i++ ) {
9: arr[i] = request.getParameter(“r”+i);
10: }
11: …
- 정탐코드의 예 -
정수형 변수의 값이 증가하면서 정수형 한계값보다 더 커지는 경우 아주 작은 값이 되거나 음수가 될 수 있다. 이러한 상황에 대한 검사가 이루어지지 않고 진행하는 경우 취약하다.
1: public static Vector parsFileBySize(String parFile, int[] parLen, int parLine) throws
Exception {
2: // 파싱결과 구조체
3: Vector parResult = new Vector();
4: // 파일 오픈
5: String parFile1 = parFile.replace(‘\\’, FILE_SEPARATOR).replace(‘/’, FILE_SEPARATOR);
6: File file = new File(parFile1);
7: BufferedReader br = null;
8: try {
9: // 파일이며, 존재하면 파싱 시작
10: if (file.exists() && file.isFile()) {
11: // 1. 입력된 라인수만큼 파일 텍스트 내용을 읽어서 String[]에 쌓는다.
12: br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
13: String [] strArr = new String [parLine];
14: String line = “”;
15: int readCnt = 0;
16: while ((line = br.readLine()) != null && readCnt <
parLine) {
17: if (line.length() <= MAX_STR_LEN) strArr[readCnt++] = line;
18: }
- 오탐코드의 예 -
다음의 예제에서 pubKey.available() 함수는 int 값을 리턴 한다. 그러므로 정수 값 한계를 벗어난 값은 발생하지 않는다.
31: try {
32: URL url = Util.class.getClassLoader().getResource(publicKeyFilepath);
33: pubKey = url.openStream();
34: } catch (MalformedURLException e) {
35: pubKey = new FileInputStream(publicKeyFilepath);
36: }
37: byte[] bytes = new byte[pubKey.available()];
'보안 공부 > 소스코드 보안약점 진단' 카테고리의 다른 글
소스코드 보안약점 진단 - 메모리 버퍼 오버플로우 (0) | 2021.12.29 |
---|---|
소스코드 보안약점 진단 - 보안기능 결정에 사용되는 부적절한 입력값 (0) | 2021.12.28 |
소스코드 보안약점 진단 - HTTP 응답분할 (0) | 2021.12.24 |
소스코드 보안약점 진단 - 크로스사이트 요청위조 (0) | 2021.12.23 |
소스코드 보안약점 진단 - LDAP 삽입 (0) | 2021.12.17 |