설명
길이 값에 산술 연산을 수행한 결과를 그대로 할당 크기로 사용하면 정수 오버플로 또는 랩어라운드가 발생할 수 있습니다.
잠재적 영향
- 예상보다 작은 버퍼가 만들어지거나 런타임 패닉이 발생할 수 있습니다.
- 입력 크기를 이용한 서비스 거부로 이어질 수 있습니다.
해결 방법
- 산술 연산 전에 입력 길이와 곱셈 피연산자에 상한을 두세요.
- 계산 결과가 타입 최대값을 넘지 않는지 검증하세요.
예시
변경 전
go
func allocateImage(width, height int) []byte {
return make([]byte, width*height)
}
변경 후
go
func allocateImage(width, height int) []byte {
const maxBufferBytes = 64 * 1024 * 1024
if width <= 0 || height <= 0 || width > maxBufferBytes/height {
return nil
}
size := width * height
return make([]byte, size)
}
설명:
- 변경 전: 입력받은 너비와 높이를 검사 없이 곱해 할당 크기로 사용하면 정수 오버플로 또는 랩어라운드가 발생할 수 있습니다.
- 변경 후: 0 이하 값을 먼저 거부해 나눗셈 오류를 피하고, 서비스가 허용하는 실제 버퍼 상한을 기준으로 곱셈 전에 범위를 검사합니다. 상한이
int범위 안의 상수이므로 검사를 통과한 곱셈은 오버플로되지 않으며 과도한 정상 범위 할당도 차단됩니다.