SV.IL.SESSION.CLIENT
HttpServletRequest.getRequestedSessionId メソッドは使用しないでください
HttpServletRequest.getRequestedSessionId() メソッドが使用されると、Klocwork は SV.IL.SESSION.CLIENT 欠陥を報告します。
脆弱性とリスク
Oracle Java API によれば、HttpServletRequest.getRequestedSessionId() メソッドは、「クライアントによって指定されたセッション ID を返します。これは、このリクエストの現在の有効なセッションの ID と同じではない場合があります。クライアントがセッション ID を指定しなかった場合、このメソッドは null を返します。」
メソッドが返すセッション ID は、cookie または URL パラメーターのいずれかで送信されるため、定義上、エンドユーザーが HTTP リクエストでこのセッション ID の値を手動で更新できないようにする障害は何もありません。
ここで、更新された HTTP ヘッダーの例を示します:
GET /pageSomeWhere HTTP/1.1
Host: webSite.com
User-Agent: Mozilla/5.0
Cookie: JSESSIONID=Hacked_Session_Value'''">
エンドユーザーは値を手動で変更できるため、リクエスト内のセッション ID は、値が既存のセッションの ID と一致するかどうかを確認するために、サーブレットコンテナー (例: Tomcat や Jetty) のみによって使用される必要があります。セッション ID が一致しない場合、ユーザーは未認証と見なされることになります。
軽減と防止
HttpServletRequest.getRequestedSessionId メソッドを使用しないでください。代わりに、ユーザーのログイン時に、新たなセッション ID を生成してください。
脆弱コード例 1
import javax.servlet.http.*;
import javax.servlet.*;
import java.security.*;
import java.io.*;
class Test{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getRequestedSessionId();
if(authenticate(id)) {
...
}
}
}
Klocwork は、8 行目で「クライアントにより提示されたセッション ID は手動で変更できます。それにより、HttpRequest 内のこの値を更新します」という、SV.IL.SESSION.CLIENT 欠陥を報告します。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。