SV.SHARED.VAR
このエラーは、メソッドでの同期なしに値が static フィールドからアクセスされ、このメソッドがサーブレットの doPost メソッドまたは doGet メソッドから推移的に呼び出される場合に表示されます。サーブレットクラスの 1 つのインスタンスが複数のスレッドで共有されるため、この問題はスレッドセーフです。
脆弱性とリスク
サーブレットはマルチスレッドであり、共有された static 変数は同時アクセスから保護されていないため、脆弱性が存在します。これは、J2EE アプリケーションにおける典型的なプログラムミスです。マルチスレッドはフレームワークによって処理されるためです。共有変数の使用は、攻撃者による情報の取得やサービス拒否 (DoS) 攻撃に利用される可能性があります。この共有データに機密情報が含まれる場合には、別のユーザーセッションで操作または表示されることがあります。このデータがアプリケーションの制御に使用された場合、その値が操作され、アプリケーションのクラッシュや低パフォーマンスの動作が発生する可能性があります。
Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。
軽減と防止
サーブレット間での static 変数の使用を取りやめるか、共有アクセスが絶対に必要な場合に保護を提供することにより、共有変数の脆弱性を回避できます。この場合、アクセスを同期化する必要があります。
例 1
public static class Counter extends HttpServlet {
static int count = 0;
protected void doGet(HttpServletRequest in,
HttpServletResponse out) throws ServletException,
IOException {
out.setContentType("text/plain");
PrintWriter p = out.getWriter();
count++;
p.println(count + " hits so far!");
}
}
SV.SHARED.VAR が 24 行目および 25 行目に対して報告されています。static 変数である 'count' への非同期アクセスがサーブレットコードから利用可能です。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。