確保サイズの整数オーバーフロー

確保サイズの整数オーバーフロー

説明

未検証の加算や乗算の結果をメモリの確保サイズに使うと、符号なし整数の演算がラップアラウンドし、必要なサイズより小さい領域が確保されるおそれがあります。

想定される影響

  • ヒープオーバーフロー、メモリ破損、サービス拒否につながる可能性があります。

対処方法

演算前に上限を確認してください。除算で乗算の上限を検証する場合は、先に除数が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 を超えない場合だけメモリを確保します。

参考資料