Kerberos-Telnet: Root-Rechte durch Buffer Overflow

Eine Sicherheitslücke im Verschlüsselungs-Feature von Kerberos hat zur Folge, dass ein entfernter Angreifer Befehle mit Root-Rechten ausführen kann. Die Attacke lässt sich ohne Authentifizierung durchführen und wird laut offiziellem Advisory derzeit aktiv ausgenutzt.

Der Programmierfehler befindet sich in der Funktion “encrypt_keyid()” in der Datei “libtelnet/encrypt.c”:

static void encrypt_keyid(struct key_info *kp, unsigned char *keyid, int len)
{ Encryptions *ep; unsigned char *strp, *cp; int dir = kp->dir; int ret = 0; if (!(ep = (*kp->getcrypt) (*kp->modep))) { if (len == 0) return; kp->keylen = 0; } else if (len == 0) { /* * Empty option, indicates a failure. */ if (kp->keylen == 0) return; kp->keylen = 0; if (ep->keyid) (*ep->keyid) (dir, kp->keyid, &kp->keylen); } else if ((len != kp->keylen) || (memcmp (keyid, kp->keyid, len) != 0)) { /* * Length or contents are different */ kp->keylen = len; memmove (kp->keyid, keyid, len); if (ep->keyid) (*ep->keyid) (dir, kp->keyid, &kp->keylen); } else { if (ep->keyid) ret = (*ep->keyid) (dir, kp->keyid, &kp->keylen); if ((ret == 0) && (dir == DIR_ENCRYPT) && autoencrypt) encrypt_start_output (*kp->modep); return; } encrypt_send_keyid (dir, kp->keyid, kp->keylen, 0);
}

Dabei ist die Struktur “key_info” in derselben Datei wie folgt definiert:

static struct key_info
{ unsigned char keyid[MAXKEYLEN]; int keylen; int dir; int *modep; Encryptions *(*getcrypt) ();
} ki[2] = { {{0}, 0, DIR_ENCRYPT, &encrypt_mode, findencryption}, {{0}, 0, DIR_DECRYPT, &decrypt_mode, finddecryption},
};

Die Funktion “encrypt_keyid()” kopiert unter anderem den “keyid”-Parameter mit der Länge “len” in die “key_info”-Struktur. Dabei wird allerdings nicht kontrolliert, dass “len” auch wirklich kleiner als “MAXKEYLEN” ist, was zu einem klassischen Buffer Overflow führt.

Der Patch besteht einfach darin, die Länge am Anfang der “encrypt_keyid()”-Funktion zu beschränken:

if (len > MAXKEYLEN) len = MAXKEYLEN;

Betroffen sind alle Telnet-Daemons von MIT krb5 vor Version 1.8, ebenso sind alle krb5-appl-Versionen anfällig für diese Attacke.

Nach oben