ユーザー入力による過剰なメモリ割り当て

ユーザー入力による過剰なメモリ割り当て

説明

外部入力のサイズを検証せずに make、bytes.Repeat、strings.Repeat などに渡すと、過剰なメモリ割り当てにつながるおそれがあります。

想定される影響

  • メモリ不足や実行時のパニックによるサービス拒否
  • 小さなリクエストによる大量のリソース消費

対処方法

  • 割り当て前に、サイズを正しく数値に変換できたことと、ゼロ以上かつ許容上限以下であることを確認してください。
  • リクエスト本文、アップロード、繰り返し回数にも個別の上限を設けてください。

例

変更前

go
size, _ := strconv.Atoi(r.FormValue("n"))
buf := make([]byte, size)

変更後

go
size, err := strconv.Atoi(r.FormValue("n"))
if err != nil || size < 0 || size > 4096 {
    return nil
}
buf := make([]byte, size)

説明:

  • 変更前: 攻撃者が大きなサイズを make や繰り返し型の割り当てAPIに渡し、メモリを枯渇させる可能性があります。
  • 変更後: 不正なサイズや範囲外の値を、割り当て前に拒否します。

参考資料