Open Source im professionellen Einsatz

Grub: 6 Jahre alter Bug umgeht Passwort-Schutz

Ein Passwortschutz im Bootloader gilt allgemein als recht sicher, um lokale Zugriffe auf ein System zu verhindern. Denn dieser Schutz setzt noch vor dem eigentlichen Hochfahren des Betriebssystems an und bietet einem potentiellen Angreifer so eine recht geringe Angriffsfläche. Grub ist De Facto Standard
für Bootloader unter Linux. Auch Grub enthält Mechanismen, um den Zugriff auf das System durch ein Passwort zu schützen.
Nun stellte sich allerdings heraus, dass alle Grub-2-Releases ab Version 1.98 eine Schwachstelle enthalten, die es einem Angreifer ermöglichen diesen Schutz zu umgehen. Die Attacke ist denkbar einfach durchzuführen. Bei der Eingabe des Benutzernamens muss der Angreifer lediglich 28 Mal die Backspace-Taste und dann Return drücken. Dadurch öffnet sich dann eine Rescue-Shell, die es dem Angreifer ermöglicht einen eigenen Kernel um Beispiel  von einem USB-Stick zu booten.

Verantwortlich für diese Schwachstelle sind zwei Fehler im Speichermanagement von Grub, die bei der Prüfung des Benutzernamens auftreten. Typische
Schutzmechanismen, die auf Betriebssystem eben funktionieren (Address Space Layout Randomization (ASLR) und Data Execution Prevention (DEP)) sind zu diesem Zeitpunkt nicht geladen und können entsprechende Angriffe nicht verhindern. Bei den Programmierfehlern handelt es sich um Integer-Underflow-Fehler, die in den »grub_username_get()«- (g»rub-core/normal/auth.c«) und »grub_password_get()«-Funktionen (»lib/crypto.c«) auftreten.

In der »grub_username_get()«-Funktion sieht die Schwachstelle wie folgt aus:

static int grub_username_get (char buf[], unsigned buf_size)
{
  unsigned cur_len = 0;
  int key;

  while (1)
    {
      key = grub_getkey (); 
      if (key == '\n' || key == '\r')
    break;

      if (key == '\e')
    {
      cur_len = 0;
      break;
    }

      if (key == '\b')  //keine Kontrolle auf Underflows
    {
      cur_len--;   //Integer Underflow
      grub_printf ("\b");
      continue;
    }

      if (!grub_isprint (key))
    continue;

      if (cur_len + 2 < buf_size)
    {
      buf[cur_len++] = key; //Off-by-Two Fehler 
      grub_printf ("%c", key);
    }
    }
...

Hier kann es in der zweiten If()-Abfrage zu einem Integer Underflow kommen, der nicht abgefangen wird.  Dieser Underflow hat dann zur Folge, dass der Angreifer ausserhalb des Allokationsbereichs des buf-Speichers Daten schreiben kann. Der Underflow wird durch das Drücken der Backspace-Taste erreicht (»\b«). Eine genaue Analyse des Grub-Programmcodes ergibt, dass eine bestimte Zahl von Backspaces (nämlich 28) dazu führen, dass der Ablauf des Programm so verändert wird, das die Routine zum Oeffnen der Rescue-Shell angesprungen wird.

Diese Schwachstelle ist schon sechs Jahre alt und Patches wurden kürzlich veröffentlicht. Betroffen sind alle Versionen ab 1.98.

comments powered by Disqus

Stellenmarkt

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