V4 tickets expiring too soon

Jeffrey Hutzelman jhutz at cmu.edu
Sat Nov 20 15:37:09 EST 2004

On Saturday, November 20, 2004 01:46:20 -0500 Peter DiCamillo 
<Peter_DiCamillo at brown.edu> wrote:

>          /*
> 	 * This calculation is different than the same expiration
> 	 * calculation in  krb5.  In krb5  the ticket lasts for
> 	 * clock_skew seconds longer than its expiration; in krb4 it
> 	 * lasts clock_skew seconds less.  This difference is
> 	 * necessary to avoid using an almost expired tgt to get a new
> 	 * tgt that will last for another 5 minutes.  This code
> 	 * interacts with the login in src/kdc/kerberos_v4.c to
> 	 * back-date tickets to avoid them expiring late.  The
> 	 * combination may be overly conservative, but I'm fairly sure
> 	 * either  removing the kerberos_v4 backdating or replacing
> 	 * this check with the krb5 check is sufficient to create a
> 	 * security problem.
> 	 */
> Is the back-dating intended to have the end result of making a krb4
> ticket also last clock_skew seconds longer than its expiration?  If so,
> then it doesn't seem to be working correctly.

No.  The backdating the comment refers to is related to what happens when 
you use a TGT to ask the TGS for another ticket.  As you know, lifetimes in 
krb4 tickets are expressed in 5-minute intervals.  So, when issuing a 
ticket, the TGS needs to compute the remaining life on the TGT (that is, 
the difference between the TGT's expiration time and the current time), and 
then round to a multiple of 5 minutes so it can be expressed as a lifetime.

Simply rounding up would result in a ticket that expires later than a TGT. 
It turned out that this led to a situation where you could keep an existing 
TGT alive more or less forever, as long as you renewed it slightly more 
often than every 5 minutes.  Note here that we're talking about the 
lifetime interval, not the clock skew.

Simply rounding down would solve the problem, but would mean that in the 
last 5 minutes of a TGT's life, you couldn't use it to get any new tickets, 
because the lifetime of such tickets would be zero.  And you can't just 
special case this situation, or you get into the same infinite-renewal 
problem as above.

So what the TGS does is actually more complicated.  It rounds the lifetime 
_up_ to the next multiple of 5 minutes, and then backdates the issue date 
of the ticket by up to 5 minutes, such that the resulting expiration time 
is not later than that of the TGT.  This means that you can get tickets up 
to the last second of the TGT's lifetime, but no longer.

Note that this backdating happens only in the TGS, not when getting an 
intial ticket.  It is necessary only when the KDC needs to make sure the 
ticket it's issuing does not expire later than the TGT.

Unfortunately, the code you quoted does have the effect of making a krb4 
ticket (including a TGT) useless during the last CLOCK_SKEW of its 
lifetime.  I believe the need for this can be avoided, but I've not looked 
at the KDC code to see if the required check is already in place.

I'm also not a member of the MIT krb5 development team, so I can't speak 
for them on whether or when this will be changed.  I would suggest that you 
send mail about this issue to krb5-bugs at mit.edu so it makes it into the 
bug-tracking system; things discussed on this list without also being 
recorded there sometimes have a way of slipping through the cracks when 
release time comes around.

-- Jeffrey T. Hutzelman (N3NHS) <jhutz+ at cmu.edu>
   Sr. Research Systems Programmer
   School of Computer Science - Research Computing Facility
   Carnegie Mellon University - Pittsburgh, PA

More information about the krbdev mailing list