1. 정의
정수 오버플로우 (Integer Overflow or Wraparound)
정수형 변수의 오버플로우는 정수값이 증가하면서 java에서 허용된 가장 큰 값보다 더 커져서 실제 저장되는 값은 의도하지 않게 아주 작은 수이거나 음수가 될 수 있다. 특히 반복문 제어, 메모리 할당, 메모리 복사 등을 위한 조건으로 사용자가 제공하는 입력값을 사용하고 그 과정에서 정수 오버플로우가 발생하는 경우 보안상 문제를 유발할 수 있다.
2. 해결방법
- 언어/플랫폼 별 정수타입의 범위를 확인하여 사용한다. 정수형 변수를 연산에 사용하는 경우 결과값이 범위 체크하는 모듈을 사용한다. 특히 외부 입력값을 동적으로 할당하여 사용하는 경우 값 범위를 검사하여 적절한 범위 내에 존재하는 값인지 확인한다.
3. 예제
========================== 안전하지 않은 코드의 예 ==========================
int size = new Integer(args[0]).intValue();
size += new Integer(args[1]).intValue();
MyClass[] data = new MyClass[size];
============================================================================
위의 예제는 외부의 입력(args[0], args[1])을 이용하여 동적으로 계산한 값을 배열의 크기(size)를 결정하는데 사용하고 있다. 만일 외부 입력으로부터 계산된 값(size)이 오버플로우에 의해 음수값이 되면 배열의 크기가 음수가 되어 코드에 문제가 발생할 수 있다.
============================== 안전한 코드의 예 =============================
int size = new Integer(args[0]).intValue();
size += new Integer(args[1]).intValue();
// 배열의 크기 값이 음수가 아닌지 검사한다.
if (size < 0) return ;
MyClass[ ] data = new MyClass[size];
============================================================================
위의 코드처럼 동적 메모리 할당을 위해 크기를 사용하는 경우 그 값이 음수가 아닌지 검사하는 문장이 필요하다.
'04. 시큐어코딩' 카테고리의 다른 글
시큐어코딩(16) - SQL Injection: JDO (0) | 2017.11.18 |
---|---|
시큐어코딩(15) - Reliance on Untrusted Inputs in a Security Decision (0) | 2017.11.18 |
시큐어코딩(13) - HTTP Response Splitting (0) | 2017.11.17 |
시큐어코딩(12) - Absolute Path Traversal (0) | 2017.11.17 |
시큐어코딩(11) - Relative Path Traversal (1) | 2017.11.17 |