SV.DOS.ARRINDEX

汚染サイズが配列割り当てに使用されています

このエラーは、未検証のユーザー入力が配列のインデックスとして使用されている場合や、この入力を配列のインデックスとして使用するメソッドで使用されている場合に発生します。

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

脆弱性とリスク

未検証のユーザー入力が配列のインデックスとして使用されている場合や、この入力を配列のインデックスとして使用するメソッドで使用されている場合、メソッドに ArrayOutOfBounds 例外をスローさせる攻撃を受ける可能性があります。さらに、これを使用してサービス拒否が引き起こされたり、規定オブジェクトを操作することにより、攻撃者に都合のよい代替制御フローが作成される可能性があります。たとえば、エラーが出力されると、このエラーから情報が攻撃者に漏洩する可能性があります。また、認証中にエラーが発生すると、オープンオンフェイル状態となり、攻撃者にセッションの不正取得を許す可能性があります。

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

軽減と防止

ユーザー入力からのサービス拒否 (DoS) 攻撃を防止するには、アプリケーションの外部からのあらゆる入力 (ユーザー入力、ファイル入力、システムパラメーターなど) を検証します。検証には、適切でアクセス可能なコンテナからの情報を使用した範囲検証を含める必要があります。

脆弱コード例 1

コピー
     import javax.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                                                                                    IOException {
         String size = req.getParameter("size");
         final int value;
         try {
             value = Integer.parseInt(size);
         } catch (NumberFormatException e) {
             resp.sendError(505, "Internal Error");
             return;
         }
         String arr[] = new String[value];
         for (int i = 0; i < arr.length; i++) {
             arr[i] = req.getParameter("field" + i);
         }
         // ...
     }

SV.DOS.ARRSIZE が 12 行目で報告され、次を示します。'size' には HTTP 要求からの文字列が含まれているため、汚染される可能性があります (4 行目)。汚染された 'size' 文字列は 7 行目で構文解析され、その結果が 'value' に格納され、12 行目で配列の割り当てに使用されます。これにより、攻撃者は大きな数値を指定できるため、潜在的な DoS 攻撃を引き起こし、サーバーでのリソース使用量が高まります。

脆弱コード例 2

コピー
     import jakarta.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                                                                                    IOException {
         String size = req.getParameter("size");
         final int value;
         try {
             value = Integer.parseInt(size);
         } catch (NumberFormatException e) {
             resp.sendError(505, "Internal Error");
             return;
         }
         String arr[] = new String[value];
         for (int i = 0; i < arr.length; i++) {
             arr[i] = req.getParameter("field" + i);
         }
         // ...
     }

SV.DOS.ARRSIZE が 12 行目で報告され、次を示します。'size' には HTTP 要求からの文字列が含まれているため、汚染される可能性があります (4 行目)。汚染された 'size' 文字列は 7 行目で構文解析され、その結果が 'value' に格納され、12 行目で配列の割り当てに使用されます。これにより、攻撃者は大きな数値を指定できるため、潜在的な DoS 攻撃を引き起こし、サーバーでのリソース使用量が高まります。

拡張機能

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