[krbdev.mit.edu #8654] Prevent fallback from SPAKE to encrypted timestamp

Greg Hudson via RT rt-comment at KRBDEV-PROD-APP-1.mit.edu
Fri Mar 30 00:40:52 EDT 2018


Some thoughts on preauth fallback in various specific scenarios:

* If the client attempts optimistic encrypted timestamp (or 
challenge), and fails, trying again with the correct etype-info 
(presented with PREAUTH_FAILED, or obtained with an unauthenticated 
request) might succeed, although if the password was wrong, there 
could be two increments on the lockout counter.  The current preauth 
framework resets the list of failed preauth mechanisms after 
optimistic preauth fails in order to support cases like this.

* If the client attempts optimistic SPAKE and it fails, trying again 
with the same user input won't help, since the initial SPAKE support 
message doesn't require any guesses.  So the reset behavior mentioned 
above is purely detrimental when applied to client optimistic SPAKE.

* If the KDC offers PKINIT and something else (like encrypted 
timestamp, or SPAKE, or both), and the client doesn't have any PKINIT 
configuration, falling back to the other things is crucial, as this 
could easily just be a client principal that uses PKINIT (or, less 
commonly, a client principal that can do either PKINIT or password 
auth, and this device doesn't have the client cert so we should do 
password auth).

* On the other hand, if the client has PKINIT configuration and it's 
wrong enough that no request can be generated, erroring out with a 
message about the misconfiguration might be a better user experience 
than trying something else.  It's hard to reliably make a good 
decision here as erroring out effectively locks the client out of 
authenticating when it otherwise might be able to.

* If the client actually makes a PKINIT request and gets a KDC 
failure, erroring out seems more likely to be useful than trying 
something else like password auth, although there might be 
exceptions.

* A 1FA-authenticated SPAKE request should not be followed with an 
encrypted timestamp request (the point of this ticket).

* If we're going to follow up actual failed attempts at 
preauthenticating (as distinct from, say, PKINIT having no client 
configuration, or SPAKE failing due to group/factor negotiation) with 
attempts using other mechanisms, following up 2FA SPAKE with 1FA 
SPAKE or a different factor type makes just as much sense, although 
our preauth framework won't currently allow it.

* If we're not going to follow up failed attempts with other 
mechanisms, it might be nice to have a way to skip a preauth mech so 
that we try the next one (e.g. to skip PKINIT so we can try password 
auth).


More information about the krb5-bugs mailing list