確保サイズの整数アンダーフロー

確保サイズの整数アンダーフロー

説明

未検証の減算結果をメモリの確保サイズに使うと、符号なし演算のラップアラウンドや負の値から大きな符号なし値への変換によって、意図したよりも大きな領域を要求するおそれがあります。

想定される影響

  • 過大なメモリ確保要求、確保の失敗、サービス拒否につながる可能性があります。

対処方法

減算前に、引かれる値が引く値以上であることを確認し、結果を許容範囲に制限してください。

例

変更前

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 の場合だけ減算とメモリ確保を行います。

参考資料