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 欠陥を報告します。