RFR 6913047: SunPKCS11 memory leak

Valerie Peng valerie.peng at oracle.com
Wed Sep 5 01:59:40 UTC 2018


These sun.security.pkcs11.wrapper classes are internal and subject to 
changes without notice.

For the time being, maybe we can leave these method intact and add a 
comment about calling the new methods which use P11Key argument instead 
of the key handle argument.

Regards,
Valerie

On 9/1/2018 11:18 AM, Michael StJohns wrote:
> Hi Valerie -
>
> I may be speaking only for myself, but there are probably a number of 
> folk using sun.security.pkcs11.wrapper.* in lieu of the PKCS11 
> provider for a number of reasons including an ability to manage the 
> key storage and wrapping efficiently.   Looking at this I'm thinking 
> there will be a large number of things breaking because of the way you 
> refactored things.
>
> While I understand that none of the sun.security.* classes are 
> "public" - these were mostly taken directly from the IAIK contribution 
> way back when and the folks I worked with used them in lieu of 
> external libraries to have a consistent PKCS11 interface java-to-java.
>
> Perhaps instead you'd consider doing something like leaving the Java 
> to Native public methods intact?
>
> Mike
>
>
>
>
> On 8/31/2018 7:53 PM, Valerie Peng wrote:
>>
>> Hi Martin,
>>
>> With the new model of "creating the key handle as needed", I think we 
>> should not allow the direct access of keyID field outside of P11Key 
>> class. This field should be made private and accessed through 
>> methods. In addition, existing PKCS11.C_XXX() methods with P11 keyID 
>> arguments can be made private and we can add wrapper methods with 
>> P11Key object argument to ensure proper usage of the P11Key object 
>> and its keyID field.
>>
>> I have also refactored the keyID management code into a separate 
>> holder class. The prototype code can be found at: 
>> http://cr.openjdk.java.net/~valeriep/6913047Exp/webrev.00/
>>
>> The main changes that I made are in P11Key.java and PKCS11.java. The 
>> other java classes are updated to call the wrapper methods in 
>> PKCS11.java.
>>
>> Thanks & have a great Labor day weekend,
>>
>> Valerie
>>
>>
>> On 8/16/2018 5:28 PM, Valerie Peng wrote:
>>>
>>> Hi Martin,
>>>
>>>
>>> Since there is no regression test for this test, you will need to 
>>> add a "noreg-xxx" label to the bug record. For this issue, it'll 
>>> probably be "noreg-hard".
>>>
>>> To understand the changes better, please find my questions and some 
>>> review comments below:
>>>
>>> <src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Cipher.java>
>>> - line 397: It's incorrect to change initialize() to 
>>> ensureInitialized(). If the cipher object were to be initialized 
>>> twice with two different keys, you need to re-initialize again.
>>> - line 471: Why do you change it to Throwable from PKCS11Exception?
>>>
>>> <src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java>
>>> - line 99: comment is somewhat unclear. typo: "temporal" should be 
>>> "temporary".
>>> - line 148-149: JDK-8165996 has been fixed. This does not apply now, 
>>> does it?
>>> - You changed the constructors of all the P11Key-related classes to 
>>> take an additional boolean argument "tmpNativeKey". However, this 
>>> boolean argument is only used when the underlying token is "NSS". 
>>> Why limiting to NSS only? It seems that all callers except for 
>>> PKCS11 KeyStore pass true for "tmpNativeKey". When "tmpNativeKey" is 
>>> true, the keyID handle first destroyed in constructor and later 
>>> created again (ref count == 1) and destroyed (when ref count drops 
>>> to 0). This replaced the PhantomReference approach in SessionKeyRef 
>>> class, right? Now both approaches seem to be used and key 
>>> destruction is taking places at different methods. I think we should 
>>> clarify the cleanup model and perhaps refactor the code so it's 
>>> easier which approach is in use. Or grouping all these 
>>> cleanup-related fields/variables into a separate class for 
>>> readability/clarity.
>>> - line 157-175: nativeKeyWrapperKeyID is a static variable, 
>>> shouldn't it be synchronized on a class level object?
>>> - line 1343: the impl doesn't look right. Why do you call both 
>>> removeObject() and addObject() here with the same check?
>>> - line 1363: the change seems incorrect, you should still call 
>>> session.removeObject(). the call setKeyIDAndSession(0, null) does 
>>> not lower the session object count.
>>>
>>> Thanks,
>>> Valerie
>>>
>>> On 8/7/2018 5:41 PM, Valerie Peng wrote:
>>>>
>>>> Hi Martin,
>>>>
>>>> Thanks for the update, I will resume the review on this one with 
>>>> your latest webrev.
>>>>
>>>> BTW, there is no webrev.07 for your other fix, i.e. JDK-8029661, 
>>>> right? Just checking.
>>>>
>>>> Regards,
>>>> Valerie
>>>>
>>>> On 8/3/2018 2:13 PM, Martin Balao wrote:
>>>>> Hi Valerie,
>>>>>
>>>>>  * 
>>>>> http://cr.openjdk.java.net/~mbalao/webrevs/6913047/6913047.webrev.10/ 
>>>>> <http://cr.openjdk.java.net/%7Embalao/webrevs/6913047/6913047.webrev.10/>
>>>>>  * 
>>>>> http://cr.openjdk.java.net/~mbalao/webrevs/6913047/6913047.webrev.10.zip 
>>>>> <http://cr.openjdk.java.net/%7Embalao/webrevs/6913047/6913047.webrev.10.zip>
>>>>>
>>>>> New in webrev 10:
>>>>>
>>>>>  * Bug fix when private DSA/EC keys are sensitive
>>>>>   * I found this bug removing "attributes = compatibility" entry 
>>>>> in NSS configuration file so keys were CKA_SENSITIVE.
>>>>>   * This is really an NSS bug when unwrapping ephemeral keys 
>>>>> (NSC_UnwrapKey function), because CKA_NETSCAPE_DB attribute is 
>>>>> required but not used/needed. There was a similar bug when 
>>>>> creating objects (NSC_CreateObject function), fixed many years ago 
>>>>> [1].
>>>>>   * In those cases in which the bug occurs (private keys, of 
>>>>> DSA/EC type, sensitive and without CKA_NETSCAPE_DB attribute set), 
>>>>> I store an empty CKA_NETSCAPE_DB attribute in the buffer that will 
>>>>> later be used for key unwrapping. I'm not doing a 
>>>>> C_SetAttributeValue call because keys are read-only. We can let 
>>>>> users set CKA_NETSCAPE_DB attribute in NSS configuration file [2] 
>>>>> but this would be a workaround on users side.
>>>>>   * Changes in:
>>>>>    * p11_keymgmt.c
>>>>>     * L175-187, L212-214 and L275-278
>>>>>
>>>>>  * Bug fix when storing sensitive RSA keys in a keystore
>>>>>   * CKA_NETSCAPE_DB attribute is not needed so we return it as 
>>>>> null (instead of failing with an "Invalid algorithm" message)
>>>>>   * Changes in:
>>>>>    * P11KeyStore.java
>>>>>     * L1909-1914
>>>>>
>>>>>  * Lines length was cut to improve code readability
>>>>>
>>>>> Regression tests on jdk/sun/security/pkcs11 category passed. I ran 
>>>>> my internal test suite too, that covers the following services 
>>>>> (with SunPKCS11 provider): Cipher, Signature, KeyAgreement, 
>>>>> Digest, Mac, KeyGenerator, KeyPairGenerator and Keystore.
>>>>>
>>>>> Kind regards,
>>>>> Martin.-
>>>>>
>>>>> --
>>>>> [1] - https://bugzilla.mozilla.org/show_bug.cgi?id=309701#c6 
>>>>> <https://bugzilla.mozilla.org/show_bug.cgi?id=309701#c6>
>>>>> [2] - 
>>>>> https://alvinalexander.com/java/jwarehouse/openjdk-8/jdk/test/sun/security/pkcs11/fips/fips.cfg.shtml 
>>>>> <https://alvinalexander.com/java/jwarehouse/openjdk-8/jdk/test/sun/security/pkcs11/fips/fips.cfg.shtml>
>>>>>
>>>>
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/security-dev/attachments/20180904/96b806c7/attachment.htm>


More information about the security-dev mailing list