Open Source im professionellen Einsatz

Kerberos: Entfernter Angreifer kann Befehle ausführen

 Kerberos ist ein sehr populärer verteilter Authentifizierungsdienst. Eine nun entdeckte Sicherheitslücke in der Kerberos Applikation Kadmind hat zur Folge, dass ein entfernter, angemeldeter Angreifer Befehle auf dem System mit höheren Rechten ausführen kann. Die Attacke ist über einen geschickt konstruierten modify_principal-Befehl möglich. Enthält dieser ein leeres DB-Argument, so kommt es zu einem Null-Zeiger-Dereferenz-Fehler in der »process_db_args()«-Funktion. Die problematische Stelle im Programmcode dieser Funktion liest sich wie folgt:

...
if (db_args) {
    for (i=0; db_args[i]; ++i) {
        arg = strtok_r(db_args[i], "=", &arg_val);
        if (strcmp(arg, TKTPOLICY_ARG) == 0) {
            dptr = &xargs->tktpolicydn;
        } else {...

Der Fehler tritt hier bei der Zuweisung der »arg«-Variablen auf. Diese wird durch die »strtok_r()«-Funktion gesetzt. Das ist eine Standardfunktion der glibc-Bibliothek, die in der »strings.h« Include-Datei deklariert ist. Diese Funktion wird verwendet, um Token aus Strings zu extrahieren. Kritisch ist hier nun, dass nicht berücksichtigt wird, dass diese Funktion NULL zurückliefert, falls die »db_args«-Variable leer ist. Die »db_args«-Variable kann allerdings von einem Angreifer beliebig vorgegeben werden. Damit kann der Angreifer sicherstellen, dass die arg-Variable NULL ist. Das führt dann im weiteren Programmcode zu Problemen, denn dieser nimmt an, dass sich hinter arg ein korrekter Zeiger verbirgt und nicht NULL. Dadurch kommt dann das Speichermanagement des Programms durcheinander, wodurch ein Angreifer in der Lage ist eigenen Programmcode auszuführen. Anfällig für dieses Problem sind Systeme, die das LDAP Kerberos Data Interface-Module verwenden. Die Schwachstelle wurde nun in einem Patch korrigiert, die zu obigen Code lediglich eine Zeile hinzufügt. Nach dem »strtok_r()-Aufruf« wurde hierzu folgender Zuweisung eingefügt:

arg = (arg != NULL) ? arg : ""

Damit wird dann sichergestellt, dass die arg-Variable nicht NULL sein kann, sondern immer korrekt initialisiert ist. Die Attacke ist somit nicht mehr möglich.

comments powered by Disqus

Ausgabe 09/2016

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.