ユーザー入力によるメモリ確保サイズの制御

ユーザー入力によるメモリ確保サイズの制御

説明

検証していないユーザー入力をメモリの確保サイズに使うと、過剰な確保や、その後のバッファーオーバーフローにつながるおそれがあります。

想定される影響

  • サービス拒否、メモリ不足、メモリ破損

対処方法

許可する最小・最大サイズを確認し、整数のオーバーフローも防ぎます。

例

変更前

c
size_t n = atoi(argv[1]);
char *buf = malloc(n);

変更後

c
#include <errno.h>
#include <inttypes.h>
#include <stdint.h>

#define MAX_ALLOCATION (16U * 1024U * 1024U)

char *end = NULL;
errno = 0;
uintmax_t parsed = strtoumax(argv[1], &end, 10);
if (errno == ERANGE || end == argv[1] || *end != '\0' ||
    parsed == 0 || parsed > MAX_ALLOCATION || parsed > SIZE_MAX) {
    return;
}
size_t n = (size_t)parsed;
char *buf = malloc(n);
if (buf == NULL) { return; }

説明:

  • 変更前: 外部入力で確保サイズを直接決めています。
  • 変更後: atoi の代わりに、変換エラーを確認できる strtoumax で文字列全体を解析します。変換エラー、0、業務上の上限と SIZE_MAX を超える値を拒否してから、size_t に変換してメモリを確保します。

参考資料