ユーザー入力によるバッファー長の制御

ユーザー入力によるバッファー長の制御

説明

ユーザー入力をコピー、読み取り、整形の長さに使うと、出力先バッファーの容量を超えるおそれがあります。

想定される影響

  • バッファーオーバーフロー、サービス拒否、メモリ破損

対処方法

長さを出力先バッファーの容量以下に制限し、検証済みのサイズだけを使います。

例

変更前

c
size_t n = atoi(argv[1]);
memcpy(dst, src, n);

変更後

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

int copy_input(char *dst, size_t dst_capacity,
               const char *src, size_t src_length,
               const char *raw_length) {
    char *end = NULL;
    errno = 0;
    uintmax_t parsed = strtoumax(raw_length, &end, 10);
    if (errno == ERANGE || end == raw_length || *end != '\0' ||
        parsed > SIZE_MAX || parsed > dst_capacity || parsed > src_length) {
        return -1;
    }

    memcpy(dst, src, (size_t)parsed);
    return 0;
}

説明:

  • 変更前: 外部入力でコピーする長さを直接決めています。
  • 変更後: ポインターに sizeof を使わず、呼び出し元から実際の出力先容量と入力データの長さを渡します。数値変換を検証し、両方のバッファーの範囲内に収まる長さだけを memcpy に渡します。

参考資料