説明
外部入力のサイズを検証せずに 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に渡し、メモリを枯渇させる可能性があります。 - 変更後: 不正なサイズや範囲外の値を、割り当て前に拒否します。