Premature Error 32 (tickets expired) in K4?
Ron DiNapoli
rd29 at cornell.edu
Wed Dec 10 15:23:19 EST 2003
Hi Sam--
See comments below...
On Dec 10, 2003, at 2:26 PM, Sam Hartman wrote:
>
> [Jeff please note that the KFW behavior on this issue is wrong and
> should not be migrated to the krb5 tree. KFW 3.0 will have a change
> in functionality.]
>
>>>>>> "Ron" == Ron DiNapoli <rd29 at cornell.edu> writes:
>
> Ron> Hi All-- We recently stumbled onto a problem here at Cornell
> Ron> with short TGT lifetimes in a K4 environment. Some public
> Ron> In the krb5-1.3.1 source tree, the file src/lib/krb4/rd_req.c
> Ron> has the following code at line 403 to help determine if a
> Ron> ticket is still valid...
>
> Ron> else if (krb_life_to_time((KRB4_32)ad->time_sec, ad->life) <
> Ron> t_local + CLOCK_SKEW) { ret = RD_AP_EXP; goto cleanup;
> Ron> }
>
> Ron> I've loosely interpreted this as
>
> Ron> if (ticket_end_time < current_time + CLOCK_SKEW)
> Ron> ticket_is_expired else ticket_is_valid
>
> Ron> That means that if the client and server are perfectly time
> Ron> sync'd, the ticket will start to "fail" EARLIER than it's
> Ron> actual end time... to be more precise at
>
> Ron> end_time - CLOCK_SKEW
>
> Ron> which happens to be defined to be 300 seconds (5 minutes).
>
> Ron> Sure enough, when a TGT (K4) has less than 5 minutes of life
> Ron> left, we can no longer obtain service tickets. This is a
> Ron> problem in the situation mentioned above with public library
> Ron> machines.
>
> Ron> Now, I compared this code to code that seems to test for when
> Ron> K5 credentials are no longer valid. In
> Ron> src/lib/krb5/krb/valid_times.c, about line 58, we see the
> Ron> following code:
>
> Ron> if ((currenttime - times->endtime) >
> Ron> context->clockskew) return KRB5KRB_AP_ERR_TKT_EXPIRED; /*
> Ron> ticket expired */
>
> Ron> Which obviously only becomes true when currenttime is more
> Ron> than
> context-> clockskew seconds PAST the endtime! If
> context-> context->clockskew is
> Ron> 300 (5 minutes) then you wouldn't see ticket expired errors
> Ron> until more than 5 minutes passes beyond the endtime of the
> Ron> ticket. This seems to be in conflict with the K4 version,
> Ron> but also seems to be the desired behavior.
>
> Ron> Is there any reason not to change the K4 code to this?:
>
> I believe that my previous mail to you also applies, but dinner
> discussions with Mark Eichin revealed a technical reason not to make
> the change you propose.
>
> The problem is that K4 stores a ticket lifetime not an end time. The
> life time is (for these purposes) in increments of five minutes. So,
> let's say I have a ticket that is valid for 30 more seconds and I ask
> the KDC for a new ticket. The KDC can either issue me no ticket, or
> it can issue me a ticket valid for five minutes. If it issues me a
> ticket valid for five minutes then I can continue renewing this ticket
> for ever every five minutes.
>
I understand that, in this scenario, your service ticket would be good
for 5 minutes, but that wouldn't change the fact that your TGT expires
in 30 seconds right? And once the TGT is expired (+ 5minutes if you
are perfectly sync'd timewise with the KDC and have applied my proposed
mod) doesn't that prevent you from obtaining/renewing more service
tickets?
> According to Mark, the folks at Cygnus fixed this problem by changing
> the krb4 boundary conditions such that tickets had five minutes less
> lifetime than apparent instead of five minutes more lifetime than
> apparent.
>
>
Just to clarify, does this mean that the code in the krb5-1.3.1 tree in
question was purposely made that way due to this Cygnus fix?
> You could make a change to the code to revert the boundary conditions
> back, but you'd need to make a corresponding change to the KDC to
> avoid this attack. In practice this would still make your library
> machine TGTs useless.
>
thanks for continuing to think about this...
--Ron
> _______________________________________________
> krbdev mailing list krbdev at mit.edu
> https://mailman.mit.edu/mailman/listinfo/krbdev
>
>
_________________________________________________________________
Ron DiNapoli
Programmer/Analyst, Lead
Cornell University, CIT/I&D
rd29 at cornell.edu
(607) 255-7605
More information about the krbdev
mailing list