The question about 8211018: Session Resumption without Server-Side State
Sergey Bylokhov
bylokhov at amazon.com
Wed Dec 7 21:00:55 UTC 2022
Hello, Security team.
Right now I am working on some issues related to the sslContext and would like to clarify a few
questions about how the feature implemented by the JDK-8211018 is intended to work.
That feature is mostly implemented by this class:
https://github.com/openjdk/jdk/blob/4cec141a90bc5d3b8ec17c024291d9c74a112cd4/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java
Here is some questions about thread safeness of this code:
- The SessionTicketExtension class uses the currentKeyID to track the currently used keyID.
https://github.com/openjdk/jdk/blob/4cec141a90bc5d3b8ec17c024291d9c74a112cd4/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java#L77
* Note that the field is static and could be shared across the threads. There is even a
synchronization block in place where we increment the key:
https://github.com/openjdk/jdk/blob/4cec141a90bc5d3b8ec17c024291d9c74a112cd4/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java#L175
* It seems wrong that it is synchronized on the "hc.sslContext.keyHashMap" since the static key
can be shared across the different sslcontext's?
* In another place the synchronization is not used at all:
https://github.com/openjdk/jdk/blob/4cec141a90bc5d3b8ec17c024291d9c74a112cd4/src/java.base/share/classes/sun/security/ssl/SessionTicketExtension.java#L158
* Probably the intention was to use one currentKeyID per sslcontext?
- The hashmap to store the keys are located in the SSLContextImpl class:
https://github.com/openjdk/jdk/blob/4cec141a90bc5d3b8ec17c024291d9c74a112cd4/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java#L74
* It seems that the usage of this map is not synchronized at all, does it mean that it cannot be
used across the threads? -> And it is expected that one SSLContextImpl is created per thread?
- If the hashmap above can be used across the threads, then the code for "clean" the expired keys
is unclear:
https://github.com/openjdk/jdk/commit/94e1d7530ff03978be305211f6a1e6d14acb6d1c#diff-8eeef23d966ed2ebe6ecf02d16e549b8cef94f54bb17f6c9ac8d8dc151eed8fcR197
============
// Clean up any old keys, then return the current key
cleanup(hc);
return ssk;
============
Note that it is executed outside of the synchronized block, is that right?
- Another question is about using "SessionTicketExtension#getCurrentKey+cleanup" on a different
threads. I think it is possible to get the next situation:
1. Thread1 call getCurrentKey() and return the key which is mostly ready to expire, but valid
for now, This key started to be used by the SessionTicketSpec#encrypt
2. Thread2 calls getCurrentKey() and creates a new key, then call "cleanup" and destroys the key
used by Thread1, since it is expired now.
3. Thread1 is in trouble.
Note that the specification does not have any hints about how the code in question should work
concurrently.
--
Best regards, Sergey.
More information about the security-dev
mailing list