Aus Linux-Magazin 03/2016

Sechs Jahre alter Bug umgeht Passwortschutz

Ein uralter Bug macht plötzlich Schlagzeilen, lässt sich doch mit ihm auf einfachste Weise ein eigentlich wirksamer Sicherheitsmechanismus leicht umgehen.

Ein Passwortschutz im Bootloader gilt allgemein als sicher, um lokale Zugriffe auf ein System zu verhindern. Denn dieser Schutz setzt noch vor dem eigentlichen Hochfahren des Betriebssystems an und bietet so eine recht geringe Angriffsfläche. 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 [1] enthalten, die es einem Angreifer ermöglicht, 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 eine Shell, die es ermöglicht, einen eigenen Kernel, zum Beispiel von einem USB-Stick, zu booten.

Verantwortlich für diese Schwachstelle sind zwei Fehler, die bei der Prüfung des Benutzernamens auftreten. Typische Schutzmechanismen, die auf Betriebssystemebene funktionieren, sind zu diesem Zeitpunkt noch nicht geladen.

Bei den Codeschwächen handelt es sich um Integer-Underflow-Fehler. In der »grub_username_get()« -Funktion sieht die Schwachstelle so aus, wie in Listing 1 demonstriert. Hier kann es in der zweiten If-Abfrage zu einem Integer Underflow kommen, der nicht abgefangen wird. Eine genaue Analyse ergibt, dass eine bestimmte Anzahl von Backspaces den Ablauf des Programms so verändert, dass Grub die Routine zum Öffnen der Rescue-Shell anspringt.

Listing 1

Integer-Underflow-Fehler

01 static int grub_username_get (char buf[], unsigned buf_size)
02 {
03   unsigned cur_len = 0;
04   int key;
05
06   while (1)
07     {
08       key = grub_getkey ();
09       if (key == '\n' || key == '\r')
10         break;
11
12       if (key == '\e')
13         {
14           cur_len = 0;
15           break;
16         }
17
18       if (key == '\b')  //keine Kontrolle auf Underflows
19         {
20           cur_len--;   //Integer Underflow
21           grub_printf ("\b");
22           continue;
23         }
24
25       if (!grub_isprint (key))
26         continue;
27
28       if (cur_len + 2 < buf_size)
29         {
30           buf[cur_len++] = key; //Off-by-Two Fehler
31           grub_printf ("%c", key);
32         }
33     }
34 [...]

Diese Schwachstelle ist schon sechs Jahre alt, und Patches haben die Entwickler kürzlich veröffentlicht.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 1 HeftseitePreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben