SV.IL.SESSION

セッション ID のロギング

Klocwork は、サーバーまたはクライアントのセッション ID がアプリケーションログに記録されるときに、SV.IL.SESSION 欠陥を報告します。

脆弱性とリスク

セッション ID のローカルまたはリモートの開示または不正アクセスからセッションログを保護するために、セッション ID などの機密データはログに含めないでください。

軽減と防止

セッション ID を公開せずにセッション固有のログ相関を可能にするために、セッション ID 自体の代わりに、セッション 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 {
         HttpSession session = request.getSession();
         String id = session.getId();
         request.getSession().getServletContext().log("Session id is: " + id);
    }
}

Klocwork は、10 行目で「セッション ID をロギングすることで、アクティブなセッションのハイジャックを引き起こす可能性があります」という、SV.IL.SESSION 欠陥を報告します。

修正コード例 1

コピー
import jakarta.servlet.http.*;
import jakarta.servlet.*;
import java.security.*;
import java.io.*;
 
class Test{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         HttpSession session = request.getSession();
         String id = session.getId();
         String hashid = getHashValue(id);
         request.getSession().getServletContext().log("Session id: " + hashid);
    }
 
    public static String getHashValue(String str)
    {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] messageDigest = md.digest(str.getBytes("UTF-8"));
            BigInteger no = new BigInteger(1, messageDigest);
           String hashtext = no.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
}
}

この修正された例では、セッション ID のハッシュ値がロギングされるため、Klocwork は指摘を報告しなくなります。

脆弱コード例 2

コピー
import jakarta.servlet.http.*;
import jakarta.servlet.*;
import java.security.*;
import java.io.*;
 
class Test{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         String id = request.getRequestedSessionId();
         request.getSession().getServletContext().log("Session id is: " + id);
    }
}

Klocwork は、9 行目で「セッション ID をロギングすることで、アクティブなセッションのハイジャックを引き起こす可能性があります」という SV.IL.SESSION 欠陥を報告します。

修正コード例 2

コピー
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();
         String hashid = getHashValue(id);
         request.getSession().getServletContext().log("Session id: " + hashid);
    }
 
    public static String getHashValue(String str)
    {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] messageDigest = md.digest(str.getBytes("UTF-8"));
            BigInteger no = new BigInteger(1, messageDigest);
           String hashtext = no.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
}
}

この修正された例では、セッション ID のハッシュ値がロギングされるため、Klocwork は指摘を報告しなくなります。