In my web.xml I’ve defined a user-data-constraint for some resources:
<security-constraint>
<web-resource-collection>
<web-resource-name>Personal Area</web-resource-name>
<url-pattern>/personal/*</url-pattern>
</web-resource-collection>
<web-resource-collection>
<web-resource-name>User Area</web-resource-name>
<url-pattern>/user/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
- When I load the page with http I’ve got my JSESSIONID ID1 in my cookie.
- When I change to context/user/sample.faces then Tomcat makes a 302 redirect to HTTPS. But my JSESSIONID is still ID1.
I think this is a vulnerability? Or is it my configuration mistake?
The problem I see is the following: While browsing over HTTP with cookie ID1 there is an attacker who is listening to my network traffic. He “steals” my cookie ID1. Now I switch to HTTPS and my cookie is still ID1. I login. The attacker is then able to taker over my session because he knows my cookie…
If it’s a recent version of Tomcat, you may not have a problem. However, this depends on your checking the SSL ID associated with the session. This is available using code such as
(Note that the attribute key may change in the future to
javax.servlet.request.ssl_session_id– as part of the Servlet 3.0 spec).I set up a servlet with the following
doGetmethod:I then invoked a suitable unprotected URL using Firefox and the Live HTTP Headers extension, to get the session cookie. This was the response sent when I navigated to
(my web.xml, like yours, only protects /user/* and /personal/*):
Next, I tried to access a protected URL
and, as expected, I got redirected to
and the response was
Notice that the cookie/session ID is the same, but we now have a new SSLID. Now, let’s try to spoof the server using the session cookie.
I set up a Python script,
spoof.py:Now, you don’t need to know Python, particularly – I’m just trying to send an HTTP request to a (different) protected resource with the same session ID in the Cookie. Here’s the response when I ran my spoof script twice:
Notice in the above responses that the session data (a value with a timestamp of
1254034761932) which was set in the first, unprotected request, has been sent throughout, because Tomcat is using the same session because the session ID is the same. This is of course not secure. However, note that the SSL IDs were different each time and if you use those to key into your session data (e.g. as shown), you should be safe. If I refresh my Firefox tab, here’s the response:Notice that the SSLID is the same as for the earlier Firefox request. So, the server can tell the sessions apart using the SSL ID value. Notice particularly that the “protected data” is the same for each request made from the Firefox session, but different for each of the spoofed sessions and also different from the Firefox session.