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






