SV.UMC.THREADS
この警告は、アプリケーションがスレッドを使用している場合に報告されます。
脆弱性とリスク
多くの場合、スレッドの管理は避けるべきです。たとえば、EJB 標準には次のようなガイドラインが含まれています。Enterprise Bean は、スレッドの管理を試みてはなりません。Enterprise Bean は、スレッドの開始、停止、一時停止、再開、スレッドの優先順位や名前の変更を試みてはなりません。Enterprise Bean は、スレッドグループの管理を試みてはなりません。また、サーブレットにおけるスレッド管理もきわめて問題が多く、問題を引き起こすことがあります。一方、スレッドはアプレットやその他の GUI アプリケーションでも使用されています。このような状況においては、1 つの警告が 1 つのエラーを報告するだけではなく、このコードに対してさらに注意を払う必要があるというプログラマーへの注意喚起の役目を果たします。
Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。
軽減と防止
EJB の場合、スレッドを使用せずに、フレームワークを使用して並列実行を行います。
例 1
public class SV_UMC_THREADS_Sample_1 extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
doProcessRequest(request, response);
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
doProcessRequest(request, response);
}
private void doProcessRequest(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
final StringBuffer buffer = new StringBuffer();
Runnable r = new Runnable() {
public void run() {
buffer.append("Processing...\n");
// do something
buffer.append("Finished.\n");
}
};
Thread t = new Thread(r);
t.start();
// do something else, then get results from background thread
try {
t.join();
} catch (InterruptedException e) {
}
String log = buffer.toString();
// create page...
}
}
SV.UMC.THREADS が 36 行目の 'Thread' コンストラクタの呼び出しに対して報告されています。'Thread' メソッドが使用されています。EJB などの多くの場合では、スレッドの管理は廃止されています。また、スレッドの管理は、常に多くのエラーを生じます。 SV.UMC.THREADS が 37 行目の呼び出しに対して報告されています。'start' メソッドが使用されています。EJB などの多くの場合では、スレッドの管理は廃止されています。また、スレッドの管理は、常に多くのエラーを生じます。SV.UMC.THREADS が 40 行目の呼び出しに対して報告されます。'join' メソッドが使用されています。EJB などの多くの場合では、スレッドの管理は廃止されています。また、スレッドの管理は、常に多くのエラーを生じます。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。