SV.TAINTED.INJECTION

ダウンストリーム挿入の未検証の入力

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

挿入問題には、コントロールプレーンデータをユーザー制御のデータプレーンに挿入することで特色付けられるさまざまな問題が含まれます。SQL インジェクションは、挿入状況の典型的な一例です。SV.TAINTED.INJECTION チェッカーは、未検証データがコマンド (SQL ステートメントやプロセス作成コマンドなど) を実行する関数およびファイル操作関数にパラメーターとして渡される状況にフラグを立てます。

脆弱性とリスク

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

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

通常、挿入攻撃には、機密データおよびさらなる悪用を可能にするデータの開示が関係します。この種の攻撃では、プロセスフローが変わることがよくあり、任意のコードの実行が頻繁に行われます。

軽減と防止

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

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

脆弱コード例

コピー
  #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>
  
  int main() {
    char buf[1024];
    char *s;
    char command[2048];
  
   printf("Enter Name to look:\n");
   fgets(buf, 1023, stdin);
   buf[1023] = '\0';
   s = strchr(buf,'\n');
   if (s != NULL) {
     *s = '\0';
   }
   strcpy(command, "grep \"");
   strcat(command, buf);
   strcat(command, "\" phone_book");
   system(command);
   return 0;
 }

Klocwork は 20 行目で指摘レポートを生成し、未検証文字列 'command' が 'fgets' の呼び出しを通じて渡され、'system' の呼び出しを通じてコマンドラインとして実行できることを示します。この場合、SV.TAINTED.INJECTION チェッカーは、コマンドを実行する関数に渡される汚染されている可能性のあるデータにフラグを立てます。これは、悪意のあるユーザーによって悪用される可能性があります。Klocwork 警告により、汚染データが system 関数に渡されないようにすることができます。