설명
배열이나 버퍼의 유효 범위 밖에 쓰기를 시도하는 문제입니다. 일반적인 Java 배열은 실행 시 경계를 확인하므로 잘못된 인덱스에 쓰면 ArrayIndexOutOfBoundsException이 발생하고 대입은 수행되지 않습니다. 네이티브 코드나 비안전 메모리 API의 메모리 손상과 구분해야 합니다.
잠재적 영향
- 처리 중단: 처리되지 않은 예외가 요청이나 작업을 실패하게 할 수 있습니다.
- 부분 처리 상태: 예외가 발생하기 전에 수행한 다른 변경은 남을 수 있으므로 오류 처리와 트랜잭션 범위를 확인해야 합니다.
해결 방법
- 쓰기 전에 인덱스가
0이상이고 배열 길이보다 작은지 확인하세요. - 유효하지 않은 입력을 명확한 오류 응답으로 처리하세요. 예외가 발생하는 것 자체를 입력 검증 대신 사용하지 마세요.
- 복사 길이나 시작 위치를 외부에서 받는 경우 계산된 범위도 검증하세요.
예시
변경 전
경계 검사만 보여 주는 컨트롤러 발췌입니다. 배열은 호출마다 새로 만들어지며 영구 저장소를 갱신하지 않습니다. 잘못된 입력의 예외를 적절한 클라이언트 오류 응답으로 매핑하세요.
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 배열 예시에서 동일한 메모리 손상이 발생한다는 뜻은 아닙니다.
- CVE-2023-1017: The reference implementation code for a Trusted Platform Module does not implement length checks on data, allowing for an attacker to write 2 bytes past the end of a buffer.
- CVE-2021-21220: Chain: insufficient input validation (CWE-20) in browser allows heap corruption (CWE-787), as exploited in the wild per CISA KEV.
- CVE-2021-28664: GPU kernel driver allows memory corruption because a user can obtain read/write access to read-only pages, as exploited in the wild per CISA KEV.