SV.TAINTED.ALLOC_SIZE

メモリ割り当てで使用される未検証の入力

入力がユーザーまたは外部環境から受け入れられるときは常に、入力のタイプ、長さ、書式、および範囲を検証してから使用する必要があります。適切に検証されるまでは、そのデータは汚染していると言われます。SV.TAINTED ファミリーチェッカーは、コードでの汚染データの使用箇所を探します。

SV.TAINTED.ALLOC_SIZE チェッカーが、汚染データを使用してメモリ割り当てのサイズを決定するコードにフラグを立てます。

脆弱性とリスク

コードへの入力が適切に検証されないと、攻撃者は入力をアプリケーションが予期しない形で作成することができます。意図しない入力を受け取ると、制御フローの改変、任意リソースの制御、および任意のコードの実行につながる可能性があります。この種のチャンスがある場合、攻撃者は次のことを行えます。

  • 予期しない値を提供し、プログラムクラッシュを引き起こします。
  • 過剰なリソース消費を引き起こします。
  • 機密データを読み取る
  • 悪意のある入力を使用して、データを変更したり制御フローを改めたりします。
  • 任意のコマンドを実行します。

ユーザーが指定した整数を使用してメモリを割り当てると、リソースが過剰に消費されかねません。ユーザーが極端に大きい整数を渡した場合、アプリケーションは極端に大量のメモリを割り当てます。これにより、アプリケーションはシステムメモリを消費し、システムが停止してサービス拒否 (DoS) 攻撃が引き起こされる可能性があります。

軽減と防止

汚染入力エラーを回避するには:

  • パラメーターや引数、クッキー、ネットワークから読み取られる入力、環境変数、逆 DNS ルックアップ、クエリ結果、ファイル名、データベース、および外部システムという、信頼されていない入力がソフトウェア内に入り込む可能性がある領域すべてを把握します。
  • ブラックリスト、つまり「既知の不良な」戦略だけを信頼するのではなく、ホワイトリスト、つまり「既知の良好な」ポリシーを入力に使用します。
  • 入力の該当するプロパティがすべて検証済みであることを確認します。これには、長さ、タイプ、範囲、欠落しているか余計な入力、構文、および一貫性が含まれます。
  • アプリケーションのクライアント側でセキュリティチェックが実行される場合、サーバー側で複製されることを確認します。
  • アプリケーションで複数ソースからの入力が組み合わされる場合、ソースの組み合わせが完了したら検証を行います。

脆弱コード例

コピー
  char *buffer = NULL;
  
  void allocateBuffer()
  {
      unsigned size;
      scanf("%u", &size);
      buffer = malloc(size);
  }

Klocwork は 7 行目で指摘レポートを生成し、未検証の整数値 'size' が 6 行目での 'scanf' の呼び出しを通じて渡され、7 行目での 'malloc' の呼び出しを通じてメモリ割り当てサイズの変更に使用できることを示します。この場合、SV.TAINTED.ALLOC_SIZE チェッカーは、汚染されている可能性のあるデータを使用してメモリ割り当てのサイズを決定するコードを探します。

修正コード例

コピー
  #define MAX_BUFFER_SIZE 512
  char *buffer = NULL;
  
  void allocateBuffer()
  {
      unsigned size;
      scanf("%u", &size);
      // validate input before using it in a memory allocation
      if(size <= MAX_BUFFER_SIZE)
     {
         buffer = malloc(size);
     }
 }

Klocwork チェッカーは指摘レポートを生成しなくなります。 これは、整数値 'size' が検証されてから、11 行目でメモリ割り当てに使用されるからです。