説明
未検証の加算や乗算の結果をメモリの確保サイズに使うと、符号なし整数の演算がラップアラウンドし、必要なサイズより小さい領域が確保されるおそれがあります。
想定される影響
- ヒープオーバーフロー、メモリ破損、サービス拒否につながる可能性があります。
対処方法
演算前に上限を確認してください。除算で乗算の上限を検証する場合は、先に除数が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かどうかを確認してゼロ除算を防ぎ、乗算結果がSIZE_MAXを超えない場合だけメモリを確保します。