On Fri, 6 Aug 2021 19:27:30 GMT, Martin Balao <mba...@openjdk.org> wrote:

> I'd like to propose a fix for JDK-8270137 [1].
> 
> This bug is triggered when using a previously stored referral ticket (in the 
> Referrals Cache) at the moment of following a S4U2Proxy cross-realm referral. 
> The mistakenly-used referral ticket matched the client and service names but 
> it was obtained as a result of a non-S4U2Proxy request. In fact, it was the 
> middle service that got it while trying to determine the backend service 
> realm in a previous S4U2Proxy communication. The mistakenly-used referral 
> ticket was not bind to the impersonated user (in other words, it was not 
> obtained attaching the user's TGS as part of a S4U2Proxy request) and, thus, 
> must not be used.
> 
> Even when one possible approach to fix this issue could be to be more 
> selective at the moment of getting referral tickets from the Cache (that is: 
> do not get anything from the Cache if it's for a S4U2Proxy request), I 
> decided to go one step further and enhance the Referrals Cache. With this 
> enhancement, we add more information to the stored referral tickets such as a 
> footprint of the TGS (in the case of S4U2Proxy requests) or the user 
> principal (in the case of S4U2Self requests). We now allow to store S4U2Proxy 
> and S4U2Self referrals tickets but those will be re-used only if there is a 
> perfect match of the TGS or user principal. As an example, if a middle 
> service tries to replicate the exact S4U2Self communication for exactly the 
> same user, cached referral tickets should be okay. With this enhancement, we 
> increase the use of the Cache and the performance (time, network resources, 
> etc.).
> 
> The ReferralsTest is enhanced to reflect these new scenarios and now uses 
> cached S4U2Proxy/S4U2Self referral tickets.
> 
> No regressions observed in jdk/sun/security/krb5.
> 
> --
> [1] - https://bugs.openjdk.java.net/browse/JDK-8270137

Looks fine. Some small comments.

src/java.security.jgss/share/classes/sun/security/krb5/internal/CredentialsUtil.java
 line 90:

> 88:         Credentials creds = serviceCreds(
> 89:                 KDCOptions.with(KDCOptions.FORWARDABLE),
> 90:                 ccreds, ccreds.getClient(), sname, client,

How about we rename `client` to `user` here?

src/java.security.jgss/share/classes/sun/security/krb5/internal/CredentialsUtil.java
 line 496:

> 494:      */
> 495:     private static void handleS4U2SelfReferral(PAData[] pas,
> 496:             PrincipalName user, Credentials oldCeds, Credentials 
> newCreds)

`oldCreds` is useless now.

src/java.security.jgss/share/classes/sun/security/krb5/internal/ReferralsCache.java
 line 59:

> 57:         private byte[] clientSvcTicketEnc; // S4U2Proxy only
> 58:         ReferralCacheKey (PrincipalName cname, PrincipalName sname,
> 59:                 PrincipalName user, Ticket clientSvcTicket) {

It's probably not necessary, but I somehow feel it will be clearer to add 
S4U2Type into the key. In fact, with all these info it almost look like the key 
contains everything in a TGS-REQ (except for the timestamp maybe).

-------------

Marked as reviewed by weijun (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/5036

Reply via email to