1. 정수형 오버플로우의 위험성
CWE-190은 정수형 변수(int, long 등)가 가질 수 있는 최대값을 초과하는 계산을 수행할 때 발생합니다. 예를 들어, 자바의 Integer.MAX_VALUE에 1을 더하면 가장 작은 음수인 Integer.MIN_VALUE로 바뀌는 현상이 나타납니다. 공격자는 이를 악용하여 루프(Loop)를 무한 반복시키거나, 자금 이체 시 음수 값을 만들어 잔액을 조작하고, 메모리 할당 크기를 작게 속여 버퍼 오버플로우(Buffer Overflow)를 유도할 수 있습니다.
2. 흔히 발생하는 취약한 패턴
가장 대표적인 사례는 수량이나 금액 계산, 파일 크기 검사, 배열의 인덱스 계산 로직입니다. 특히 totalPrice = price * count와 같이 두 값을 곱하는 연산에서 입력값이 매우 클 경우, 결과값이 음수가 되거나 예상보다 훨씬 작은 값이 되어 보안 검증 로직(예: if (totalPrice < balance))을 무력화할 수 있습니다.
3. 실무적 대응: 범위 체크와 전용 API 활용
단순한 산술 연산 대신 다음과 같은 안전장치를 마련해야 합니다.
• 산술 연산 전 범위 체크: 연산을 수행하기 전, 결과값이 해당 데이터 타입의 최소/최대 범위를 벗어나는지 미리 검사합니다.
• Math.addExact() 등 사용: Java 8부터 제공되는 addExact, multiplyExact 등의 메서드를 사용하십시오. 이 메서드들은 오버플로우 발생 시 ArithmeticException을 던져 즉시 감지할 수 있게 해줍니다.
• 더 큰 데이터 타입 사용: int 대신 long을 사용하거나, 아주 큰 숫자를 다룰 때는 BigInteger 클래스를 활용하여 범위를 확장합니다.
4. CWE-190 대응 및 안전한 산술 연산 자바 코드 예시
코멘트: 정수형 오버플로우 방어의 핵심은 "컴퓨터가 계산할 수 있는 숫자의 한계를 인지하는 것"입니다. 특히 비즈니스 로직이나 보안 결정에 사용되는 수치 연산에는 반드시 Math.addExact()와 같은 안전한 API를 도입하십시오. logger.debug()를 통해 비정상적인 수치 범위를 기록하되, 숫자의 '되돌림(Wrap-around)' 현상이 시스템의 논리적 허점으로 이어지지 않도록 철저히 검증하는 것이 시큐어 코딩의 핵심입니다.
댓글 달기