Aus Linux-Magazin 01/2014

Insecurity-Bulletin: Denial of Service in Glibc

Unerwartet umfangreiche Eingabedaten können ein Programm zum Absturz bringen, wenn der Platz auf dem Stack nicht mehr ausreicht. Eine derartige Schwachstelle fand sich jüngst im Code der GNU-C-Bibliothek, der Hostnamen in IP-Adressen auflöst.

Gibt es ein Problemin der C-Standard-Bibliothek eines Linux-Rechners, sind viele Anwendungen davon betroffen. Im Oktober 2013 entdeckte der Red-Hat-Mitarbeiter Siddhesh Poyarekar eine solche Sicherheitslücke [1] in der GNU-C-Bibliothek [2], kurz Glibc, die in vielen Linux-Distributionen zum Einsatz kommt.

Stack Overflow

Die Schwachstelle mit der CVE-Kennung 2013-4458 erlaubt es einem lokalen Angreifer, Anwendungen zum Absturz zu bringen, die die Glibc-Bibliotheksfunktion »getaddrinfo()« verwenden. Diese übersetzt Hostnamen in IP-Adressen. Durch geschickt aufgebaute Konfigurationsdateien und Anfragen lässt sich ein Stack Overflow auslösen, beispielsweise durch eine extrem große Anzahl von IPv6-Einträgen in der Datei »/etc/hosts« .

Zudem beschreibt Poyarekar in seiner Meldung noch einen Proof-of-Concept-Exploit. Dieser besteht im Grunde aus zwei Schritten:

  • Der Angreifer erzeugt eine große »/etc/hosts« -Datei: 50000 Einträge mit »127.0.0.1 host-fubar« und 50000 mit »::1 host-fubar« .
  • Der Angreifer oder ein Programm ruft »getaddrinfo()« für »host-fubar« ohne Flags sowie mit »AF_INET6« im Feld »hints->ai_family« auf.

Punkt 1 lässt sich mit einem Skript erledigen, etwa dem Ruby-Code in Listing 1, doch muss es der Angreifer auch schaffen, die Root gehörende Datei zu überschreiben. Das Ausführen eines Programms, das »getaddrinfo()« verwendet (Punkt 2), führt dann zu einem Segmentation Fault. Grund ist ein Programmierfehler in der Quelltextdatei »sysdeps/posix/getaddrinfo.c« der Glibc. Der Code verwendet das Makro »extend_alloca()« , um den Puffer »tmpbuf« zu vergrößern:

Listing 1

/etc/hosts präparieren

01 #!/usr/bin/env ruby
02 File.open('/etc/hosts', 'a') do |file|
03   50000.times {|x| file.puts '127.0.0.1 host-fubar'}
04   50000.times {|x| file.puts '::1 host-fubar'}
05 end
tmpbuf = extend_alloca (tmpbuf, tmpbuflen,2 * tmpbuflen);

Zuvor alloziert er ihn mit

tmpbuf = __alloca (tmpbuflen);

auf dem Stack. Diese Vergrößerung des »tmpbuf« -Speichers auf dem Stack besitzt allerdings eine Obergrenze, bei deren Überschreiten der Stack-Overflow-Fehler auftritt.

Mehr Speicher

Ein Patch von Siddhesh Poyarekar (Abbildung 1) löst das Problem, indem es im Fall einer zu großen Anfrage auf den Heap ausweicht und dort dynamisch Speicher alloziert. Die Entscheidung, ob dies geschehen soll, findet in einer If-Abfrage statt:

Abbildung 1: Dieses Patch sorgt für ausreichend Speicher auf dem Heap.

Abbildung 1: Dieses Patch sorgt für ausreichend Speicher auf dem Heap.

if (!malloc_tmpbuf && __libc_use_alloca(alloca_used + 2 * tmpbuflen))

Dabei dient »__libc_use_alloca()« dazu, zu entscheiden, ob noch genügend Speicher vorhanden ist. Falls nicht, kommt der folgende neue Code zum Aufruf:

char *newp = realloc (malloc_tmpbuf ?tmpbuf : NULL, 2 * tmpbuflen);
tmpbuf = newp;

Eine ähnliche Schwachstelle, allerdings für die Adressenfamilie »AF_UNSPEC« , hatte der Suse-Mitarbeiter Andreas Schwab bereits im März 2013 entdeckt (CVE-2013-1914). Übrigens ist auch die Eglibc, ein Fork der C-Bibliothek, den etwa die Linux-Distributionen Debian und Ubuntu einsetzen, durch dieselbe Art von Angriffen verwundbar [3].

Infos

  1. Siddhesh Poyarekar, “Sourceware Bugzilla – Bug 16072”: https://sourceware.org/bugzilla/show_bug.cgi?id=16072
  2. GNU C Library: http://www.gnu.org/software/libc/
  3. Debian Security Tracker, CVE-2013-4458: https://security-tracker.debian.org/tracker/CVE-2013-4458
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