할당 크기 계산 중 정수 오버플로 가능성

할당 크기 계산 중 정수 오버플로 가능성

설명

길이 값에 산술 연산을 수행한 결과를 그대로 할당 크기로 사용하면 정수 오버플로 또는 랩어라운드가 발생할 수 있습니다.

잠재적 영향

  • 예상보다 작은 버퍼가 만들어지거나 런타임 패닉이 발생할 수 있습니다.
  • 입력 크기를 이용한 서비스 거부로 이어질 수 있습니다.

해결 방법

  • 산술 연산 전에 입력 길이와 곱셈 피연산자에 상한을 두세요.
  • 계산 결과가 타입 최대값을 넘지 않는지 검증하세요.

예시

변경 전

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 범위 안의 상수이므로 검사를 통과한 곱셈은 오버플로되지 않으며 과도한 정상 범위 할당도 차단됩니다.

참조