범위를 벗어난 쓰기

Java 배열 범위를 벗어난 인덱스에 쓰기를 시도하는 코드

설명

배열이나 버퍼의 유효 범위 밖에 쓰기를 시도하는 문제입니다. 일반적인 Java 배열은 실행 시 경계를 확인하므로 잘못된 인덱스에 쓰면 ArrayIndexOutOfBoundsException이 발생하고 대입은 수행되지 않습니다. 네이티브 코드나 비안전 메모리 API의 메모리 손상과 구분해야 합니다.

잠재적 영향

  • 처리 중단: 처리되지 않은 예외가 요청이나 작업을 실패하게 할 수 있습니다.
  • 부분 처리 상태: 예외가 발생하기 전에 수행한 다른 변경은 남을 수 있으므로 오류 처리와 트랜잭션 범위를 확인해야 합니다.

해결 방법

  1. 쓰기 전에 인덱스가 0 이상이고 배열 길이보다 작은지 확인하세요.
  2. 유효하지 않은 입력을 명확한 오류 응답으로 처리하세요. 예외가 발생하는 것 자체를 입력 검증 대신 사용하지 마세요.
  3. 복사 길이나 시작 위치를 외부에서 받는 경우 계산된 범위도 검증하세요.

예시

변경 전

경계 검사만 보여 주는 컨트롤러 발췌입니다. 배열은 호출마다 새로 만들어지며 영구 저장소를 갱신하지 않습니다. 잘못된 입력의 예외를 적절한 클라이언트 오류 응답으로 매핑하세요.

java
@GetMapping("/update")
public void updateData(@RequestParam int index, @RequestParam int value) {
    int[] data = new int[10];
    data[index] = value; // 경계 검증이 없는 코드
}

변경 후

java
@GetMapping("/update")
public void updateData(@RequestParam int index, @RequestParam int value) {
    int[] data = new int[10];
    if (index >= 0 && index < data.length) {
        data[index] = value; // 경계를 검증한 코드
    } else {
        throw new IllegalArgumentException("Invalid index");
    }
}

설명:

  • 변경 전: index를 확인하지 않으므로 범위 밖 값은 ArrayIndexOutOfBoundsException을 발생시킵니다. 이 Java 배열 대입으로 범위 밖 메모리가 손상되지는 않습니다.
  • 변경 후: 경계 안의 인덱스만 사용하고 나머지는 IllegalArgumentException으로 거부합니다.

관련 CVE

다음은 범위 밖 메모리 쓰기와 관련된 다른 플랫폼의 사례이며, 위 Java 배열 예시에서 동일한 메모리 손상이 발생한다는 뜻은 아닙니다.

참조