SV.TAINTED.XSS.REFLECTED

クロスサイトスクリプティングの脆弱性

このチェッカーは、CGI スクリプト (Common Gateway Interface を使用する Web サーバー) に対する潜在的なクロスサイトスクリプティングの指摘を報告します。特に、このチェッカーは、getenv() 関数の呼び出しを通じて、QUERY_STRING 環境変数から受け取った汚染された文字列が stdout ストリームに作成込む関数に渡されるたびに、欠陥を報告します。

脆弱性とリスク

クロスサイトスクリプティング (XSS) は、Web アプリケーションセキュリティの一種の脆弱性です。クロスサイトスクリプティング攻撃により、攻撃者は、別のサイトからのスクリプトを正当な Web ページに注入できるようになります。Web サーバープログラムでは、HTTP リクエストを直接 Web ページに渡すことが、クロスサイトスクリプティングの脆弱性が反映されたユースケースシナリオになる可能性があります。

軽減と防止

反映されたクロスサイトスクリプティングの指摘を軽減することは、生成された HTML ページで、信頼できないデータが挿入される場所によって異なります。一般的に、信頼できないデータを回避する方法を使用することは、(このドキュメントでの修正例と同じように) HTML 要素のコンテンツに効果があります。ただし、クロスサイトスクリプティングを防止する方法の詳細については、「OWASP ドキュメント」を参照してください。

脆弱コード例

コピー
   #include <iostream>
   #include <string>
   using namespace std;
   void vulnerableServer() {
      string query = getenv("QUERY_STRING");
      cout << "Viewing query ";
      cout << query << endl;    
   }

上記の例では、攻撃者はクエリにスクリプトを注入する可能性があり、Web ページに表示されると実行を開始し、システムから機密情報を収集する可能性があります。

Klocwork は 7 行目で SV.TAINTED.XSS.REFLECTED の欠陥を生成します。これは、5 行目の「getenv」の呼び出しを通じて、QUERY_STRING 環境変数から未検証の文字列「query」を受け取り、7 行目の「cout」を通じて stdout に作成込むことを示しています。これにより、クロスサイトスクリプティングの脆弱性が発生します。

修正コード例

コピー
   #include <iostream>
   #include <string>
   using namespace std;
   string validate(string &query);
   void secureServer() {
      string query = getenv("QUERY_STRING");
      cout << "Viewing query ";
      string validated_query = validate(query);
      cout << validated_query << endl;    
  }

この例では、汚染された文字列「クエリ」が 8 行目で検証されているため、チェッカーは SV.TAINTED.XSS.REFLECTED の欠陥を報告しません。8 行目の関数 validate() は、カスタム実装された関数であり (プロトタイプは 4 行目にある)、クエリ文字列内の特殊文字をエスケープして、クロスサイトスクリプティングが発生しないようにしています。これは、クロスサイトスクリプティングの可能性を簡単に取り除く方法です。

拡張機能

このチェッカーは、次のために Klocwork knowledge base (ナレッジベース) を通じて拡張できます。
  • 仕様フィールド TSCheckXSS を使用して、クエリ文字列を整理する関数を指定します
  • 仕様フィールド TSSinkXSS を使用して、stdout ストリームに作成込むことができる関数を指定します

詳細については、 C/C++ 解析のチューニング を参照してください。