説明
検証していないユーザー入力をメモリの確保サイズに使うと、過剰な確保や、その後のバッファーオーバーフローにつながるおそれがあります。
想定される影響
- サービス拒否、メモリ不足、メモリ破損
対処方法
許可する最小・最大サイズを確認し、整数のオーバーフローも防ぎます。
例
変更前
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に変換してメモリを確保します。