메뉴 건너뛰기

app

숫자의 한계를 이용한 논리 파괴: CWE-190 정수형 오버플로우

suritam92026.01.17 20:36조회 수 1댓글 0

    • 글자 크기

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 대응 및 안전한 산술 연산 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigInteger;
 
public class NumericSecurityManager {
    private static final Logger logger = LoggerFactory.getLogger(NumericSecurityManager.class);
 
    // [CWE-190 조치] Math 클래스의 Exact 메서드를 사용한 안전한 연산
    public int calculateTotalSafe(int price, int count) {
        try {
            logger.debug("Attempting to calculate total: {} * {}", price, count);
            
            // 오버플로우 발생 시 즉시 예외 발생
            return Math.multiplyExact(price, count);
 
        } catch (ArithmeticException e) {
            // [CWE-754, CWE-390] 연산 오류 상황 대응
            logger.debug("Integer Overflow detected during calculation: {}", e.getMessage());
            throw new IllegalArgumentException("Calculation result exceeds data type range.");
        }
    }
 
    // [CWE-190 조치] BigInteger를 사용한 정밀 연산
    public String calculateLargeFinance(String val1, String val2) {
        try {
            BigInteger b1 = new BigInteger(val1);
            BigInteger b2 = new BigInteger(val2);
            
            BigInteger result = b1.multiply(b2);
            logger.debug("Large calculation completed successfully.");
            return result.toString();
 
        } catch (NumberFormatException e) {
            logger.debug("Invalid numeric input: {}", e.getMessage());
            return "0";
        }
    }
}

코멘트: 정수형 오버플로우 방어의 핵심은 "컴퓨터가 계산할 수 있는 숫자의 한계를 인지하는 것"입니다. 특히 비즈니스 로직이나 보안 결정에 사용되는 수치 연산에는 반드시 Math.addExact()와 같은 안전한 API를 도입하십시오. logger.debug()를 통해 비정상적인 수치 범위를 기록하되, 숫자의 '되돌림(Wrap-around)' 현상이 시스템의 논리적 허점으로 이어지지 않도록 철저히 검증하는 것이 시큐어 코딩의 핵심입니다.

 
    • 글자 크기
사용자의 손에 맡긴 보안: CWE-807 부적절한 입력값 기반 결정 (by suritam9) 헤더에 숨어든 공격자: CWE-113 HTTP 응답 분할 방지 전략 (by suritam9)

댓글 달기

첨부 (0)
위로