SV.XSS.REF

クロスサイトスクリプティング (Reflected XSS)

このエラーは、アプリケーションデータベースからのクロスサイトスクリプティングを示します。クロスサイトスクリプティングの脆弱性は、未検証のユーザー入力が Web インターフェイスに反映される場合に発生します。

リリース 2023.2 の時点で、このチェッカーは Jakarta EE をサポートしています。

脆弱性とリスク

XSS (クロスサイトスクリプティング) の脆弱性は、情報内の未検証のユーザー入力が Web インターフェイスで使用される情報に使用されることにより生じます。このデータには、HTML タグや SCRIPT タグなどの任意の内容が含まれる場合があります。この情報がシステムの別のユーザーに対して表示される場合、これらのスクリプトを使用して、ユーザーのセッションを操作したり、これらのスクリプトを別の Web サイトに誘導してフィッシング攻撃を実行することや、その他の悪意あるスクリプトコンテンツを実行することが可能となります。この脆弱性は、ユーザーが別のユーザーに情報を投稿できるような Web アプリケーションのメッセージボードで一般的に存在します。この内容を注意深く選別することにより、他のユーザーに表示される出力に HTML タグや SCRIPT タグが挿入されるのを防止する必要があります。

Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。

軽減と防止

通常、クロスサイトスクリプティングの脆弱性は、アプリケーションの外部からのあらゆる入力 (ユーザー入力、ファイル入力、システムパラメーターなど) を検証することで防止できます。検証には、長さと内容を含める必要があります。通常、英数字文字 (A ~ Z、a ~ z、0 ~ 9) のみが必要とされます。受け取ったその他の文字はすべてエスケープする必要があります。特に XSS の脆弱性に対応するには、ユーザー入力内のタグを許可しないようにする必要があります。この検証は、各パラメーターを HTTP 要求から読み取った場合などに、データのソースごとに実行する必要があります。検証はサーバー側で実行する必要があります。クライアントブラウザーでの必要性がなくとも、ユーザーが生の HTTP パケットを送信できるため、クライアント側での検証は XSS に対する保護として不十分です。

脆弱コード例 1

コピー
     import javax.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
         String action = req.getParameter("action");
         if ("chart".equals(action)) {
             renderChart(res.getOutputStream());
         } else if ("table".equals(action)) {
             renderTable(res.getOutputStream());
         } else {
             throw new ServletException("Cannot find action " + action);
         }
     }
 
     private void renderTable(ServletOutputStream outputStream) {
         //...
     }
 
     private void renderChart(ServletOutputStream outputStream) {
         //...
     }

Klocwork は、9 行目で SV.XSS.REF の欠陥を報告し、次を示します。'action' には HTTP 要求パラメーターからのデータが含まれているため、汚染される可能性があります (3 行目)。この値は、9 行目でスローされた ServletException のメッセージとして使用されます。このメッセージは、ブラウザーに表示されます。これは、折り返し型のクロスサイトスクリプティング (Reflected XSS) と呼ばれる脆弱性です:未検証のユーザー入力が Web アプリケーションの出力に使用されており、ここには任意の HTML や JavaScript が含まれている可能性があります。

脆弱コード例 2

コピー
     import jakarta.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
         String action = req.getParameter("action");
         if ("chart".equals(action)) {
             renderChart(res.getOutputStream());
         } else if ("table".equals(action)) {
             renderTable(res.getOutputStream());
         } else {
             throw new ServletException("Cannot find action " + action);
         }
     }
 
     private void renderTable(ServletOutputStream outputStream) {
         //...
     }
 
     private void renderChart(ServletOutputStream outputStream) {
         //...
     }

Klocwork は、9 行目で SV.XSS.REF の欠陥を報告し、次を示します。'action' には HTTP 要求パラメーターからのデータが含まれているため、汚染される可能性があります (3 行目)。この値は、9 行目でスローされた ServletException のメッセージとして使用されます。このメッセージは、ブラウザーに表示されます。これは、折り返し型のクロスサイトスクリプティング (Reflected XSS) と呼ばれる脆弱性です:未検証のユーザー入力が Web アプリケーションの出力に使用されており、ここには任意の HTML や JavaScript が含まれている可能性があります。

関連チェッカー

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。