SV.DOS.ARRSIZE
このエラーは、未検証のユーザー入力が配列サイズとして使用されている場合や、この入力を配列サイズとして使用するメソッドで使用されている場合に検出されます。
脆弱性とリスク
アプリケーションの外部からのデータは、アプリケーションで使用する前に検証する必要があります。このデータがアプリケーション内でオブジェクトの配列の割り当てに使用される場合には、データの内容を綿密にチェックする必要があります。攻撃者がこの脆弱性を利用して膨大な数のオブジェクトを強制的にアプリケーションに割り当てることにより、アプリケーションサーバーのリソースを枯渇させ、潜在的なサービス拒否 (DoS) 状態を引き起こすことが可能となります。
Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。
軽減と防止
ユーザー入力からの DoS 攻撃は、アプリケーションの外部からのあらゆる入力 (ユーザー入力、ファイル入力、システムパラメーターなど) を検証することで防止できます。検証には、長さと内容を含める必要があります。理想としては、オブジェクトのサイズを信頼できないユーザーソース (パラメーターなど) から取得しないようにする必要があります。この検証は、各パラメーターを HTTP 要求から読み取った場合などに、データのソースごとに実行する必要があります。また、ユーザー入力には非常に小さな値や非常に大きな値が含まれる可能性があるものとして、割り当てに使用されるデータについても値の妥当性をチェックする必要があります。
例 1
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 が 24 行目に対して報告されています。'size' は HTTP 要求から文字列を取得するため、汚染される可能性があります (16 行目)。汚染された 'size' 文字列が 19 行目で構文解析された後、その結果は 'value' に格納され、24 行目で配列の割り当てに使用されます。これは、潜在的な DoS 攻撃につながります:すなわち、攻撃者が大きな数値を指定すると、サーバーのリソース枯渇が生じます。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。