설명
검증되지 않은 덧셈이나 곱셈 결과를 할당 크기로 사용하면 부호 없는 정수 연산의 래핑으로 필요한 크기보다 작은 버퍼가 할당될 수 있습니다.
잠재적 영향
- 힙 오버플로, 메모리 손상, 서비스 거부가 발생할 수 있습니다.
해결 방법
연산 전에 상한을 검사하고, 나눗셈 기반의 곱셈 검사를 수행하기 전에 분모가 0인지 확인합니다. 가능하면 안전한 곱셈/덧셈 유틸리티를 사용합니다.
예시
변경 전
c
#include <stdlib.h>
void *allocate_array(size_t count, size_t size) {
return malloc(count * size);
}
변경 후
c
#include <stdint.h>
#include <stdlib.h>
void *allocate_array(size_t count, size_t size) {
if (size == 0) { return NULL; }
if (count > SIZE_MAX / size) { return NULL; }
return malloc(count * size);
}
설명:
- 변경 전: 곱셈 결과를 할당 크기로 바로 사용해 래핑 여부를 확인하지 않습니다.
- 변경 후:
size가 0인지 먼저 확인해 0으로 나누는 오류를 방지한 뒤, 곱셈이SIZE_MAX를 넘지 않는 경우에만 메모리를 할당합니다.