설명
검증되지 않은 뺄셈 결과를 할당 크기로 사용하면 부호 없는 연산이 래핑되거나 음수 결과가 큰 부호 없는 값으로 변환되어, 의도보다 큰 할당을 요청할 수 있습니다.
잠재적 영향
- 의도보다 큰 할당 요청, 할당 실패, 서비스 거부가 발생할 수 있습니다.
해결 방법
뺄셈 전에 피감수가 감수보다 크거나 같은지 확인하고 결과 범위를 제한합니다.
예시
변경 전
c
#include <stdlib.h>
void *allocate(size_t total, size_t header) {
return malloc(total - header);
}
변경 후
c
#include <stdlib.h>
void *allocate(size_t total, size_t header) {
if (total >= header) {
return malloc(total - header);
}
return NULL;
}
설명:
- 변경 전:
total이header보다 작은 경우 언더플로된 결과가 할당 크기로 사용됩니다. - 변경 후: 피연산자를 할당 크기 타입인
size_t로 명시하고,total >= header인 경우에만 뺄셈과 할당을 수행합니다.