JD.UNCAUGHT

JD.UNCAUGHT は、カスタマイズ可能な高機能チェッカーです。パラメーターでリストされたメソッドをチェックし、メソッドのボディ内で推移的にスローされる例外のすべてはキャッチしません。チェック済みのパラメーターのリストもパラメーターとなります。JD.UNCAUGHT は、理論上、メソッドのボディでスロー可能な例外のうち、おそらくセーフティーネットを必要とする例外のリストを報告します。すべての例外をキャッチする最高レベルのキャッチブロックです。デフォルトでは、メソッドのリストには、サーブレットのエントリポイントである doGet および doPost、Thread.run() and main() メソッドが含まれます。

脆弱性とリスク

サーブレットエントリメソッドでキャッチされなかった未処理の例外は、システム情報のリーク (stacktrace など) や XSS エラーにつながる可能性があります。しかし、フレームワークでは、例外を処理するために定義する必要のある特殊なメソッドをサポートします。ただし、特殊なメソッドが実装された場合、このエラーは無視されます。Thread.run() メソッドの場合、キャッチされなかった例外は、予期しないスレッド終端やデッドロックの原因となる可能性があります。main() メソッドの場合、キャッチされなかった例外は、JVM の停止の原因となる可能性があります。

軽減と防止

すべての例外をキャッチする try ブロックにメソッドボディをラップし、例外を処理する効果的な手順を作成してください。サーブレットについては、スタックトレースをサーバーログに報告してください (ユーザーには報告しないように注意してください)。

例 1

コピー
     protected void doPost(HttpServletRequest req, //
                           HttpServletResponse arg1) //
             throws ServletException, IOException {
         String ip = req.getRemoteAddr();
         InetAddress addr = InetAddress.getByName(ip);
         // ...
         arg1.getOutputStream().println("Host name is " +
                                        addr.getHostName());
         foo();
     }
 
     static class Ex1 extends RuntimeException { }
 
     private static void foo() throws Ex1 {
         throw new Ex1();
     }

JD.UNCAUGHT が 16 行目の 'doPost' メソッドの宣言に対して報告されています。'doPost' メソッドは、例外 'com.klocwork.jdefects.checkers.ast.samples.JD_UNCAUGHT_Sample_1$Ex1' をキャッチしません。セキュリティガイドライン