[3269] in Kerberos-V5-bugs

home help back first fref pref prev next nref lref last post

krb5-libs/1014: decrypt_credencdata() double-free()s on error.

daemon@ATHENA.MIT.EDU (jhawk@MIT.EDU)
Mon Nov 12 23:07:04 2001

Resent-From: gnats@rt-11.mit.edu (GNATS Management)
Resent-To: krb5-unassigned@rt-11.mit.edu
Resent-Reply-To: krb5-bugs@MIT.EDU, jhawk@MIT.EDU
Message-Id: <200111130403.XAA03787@PICKLED-HERRING.MIT.EDU>
Date: Mon, 12 Nov 2001 23:03:00 -0500
From: jhawk@MIT.EDU
Reply-To: jhawk@MIT.EDU
To: krb5-bugs@mit.edu


>Number:         1014
>Category:       krb5-libs
>Synopsis:       decrypt_credencdata() double-free()s on error.
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    krb5-unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   unknown
>Arrival-Date:   Mon Nov 12 23:07:00 EST 2001
>Last-Modified:
>Originator:     John Hawkinson
>Organization:
	MIT
>Release:        krb5-1.2
>Environment:
	
System: Linux PICKLED-HERRING.MIT.EDU 2.4.9-6 #1 Thu Oct 18 09:39:55 EDT 2001 i686 unknown
Architecture: i686

>Description:
	decrypt_credencdata() can double free() a pointer in the event
of an error. Herein:

      38     /*  now decode the decrypted stuff */
      39     if ((retval = decode_krb5_enc_cred_part(&scratch, &ppart)))
      40         goto cleanup_encpart;

however, decode_krb5_enc_cred_part() will free ppart in the event of
an error return:

      45 cleanup_encpart:
      46     memset(ppart, 0, sizeof(*ppart));
      47     krb5_xfree(ppart);

Unfortunately, decode_krb5_enc_cred_part() has already freed it:

     601 krb5_error_code decode_krb5_enc_cred_part(code, rep)
     602      const krb5_data * code;
     603      krb5_cred_enc_part ** rep;
...
     606   alloc_field(*rep,krb5_cred_enc_part);
...
     624 error_out:
     625   if (rep && *rep) {
     626       free_field(*rep,r_address);
     627       free_field(*rep,s_address);
     628       free(*rep);

(*rep is ppart here).

>How-To-Repeat:
	Have a krb5 exchange where the server and the client have
	different ideas of what is encrypted and what is not, or
	perhaps a case where you try to forward tickets in the context
	of having failed authorization (i.e. failed kuserok), and
	end up having decode_krb5_enc_cred_part() fail with
	"ASN.1 identifier doesn't match expected value."
>Fix:
	One of them shouldn't be free()-ing this. You figure out which.
>Audit-Trail:
>Unformatted:

home help back first fref pref prev next nref lref last post