Aus Linux-Magazin 05/2015

Schwachstelle in der GNU-C-Bibliothek

Ein Programmierfehler ermöglicht einen Buffer Overflow – und der das Ausführen beliebiger Kommandos mit nicht erteilten Rechten. Glücklicherweise funktioniert das nur unter speziellen Umständen.

© Ryan Jorgensen, 123RF

Am 27. Januar 2015 meldete Qualys eine Zero-Day-Schwachstelle in der GNU-C-Bibliothek, die »GHOST« getauft wurde. Durch diese Sicherheitslücke kann ein entfernter Angreifer Befehle mit fremden Rechten in zahlreichen Netzwerk-Applikationen ausführen. Ursache ist ein Programmierfehler in der »__nss_hostname_digits_dots()« -Funktion. Er hat zur Folge, dass Aufrufe der »gethostbyname()« – und »gethostbyname2()« -Funktionen einen Heap-Buffer-Overflow auslösen können. Der führt dann entweder zu einem Segmentation Fault und einer damit verbundenen Denial-of-Service-Attacke oder erlaubt dem Angreifer das Ausführen von beliebigem Programmcode. Die »gethostbyname()« – und »gethostbyname2()« -Funktionen lösen Hostnamen in IP-Adressen auf.

Auf den ersten Blick klingt die Schwachstelle recht bedrohlich, doch sind ernsthafte Attacken nur gegen eine kleine Zahl von Anwendungen möglich. So muss zum Gelingen des Angriffs das erste Zeichen des Hostnamens eine Ziffer sein, das letzte Zeichen darf kein Punkt sein, und der gesamte Hostname darf nur aus Ziffern und Punkten bestehen. Nur wenige Anwendungen akzeptieren solche Eingaben, weshalb sich der Schaden durch »GHOST« in Grenzen hält. Allerdings sind auch einige häufig verwendete Applikationen anfällig, zum Beispiel der Exim-Mailserver und »procmail« .

Der Code aus Listing 1 kann verwendet werden, um zu testen, ob ein System von der Sicherheitslücke betroffen ist. Der Code wird beim Ausführen entweder »vulnerable« oder »not vulnerable« ausgeben.

Listing 1

Prüfprogramm

01 #include <netdb.h>
02 #include <stdio.h>
03 #include <stdlib.h>
04 #include <string.h>
05 #include <errno.h>
06
07 #define CANARY "in_the_coal_mine"
08
09 struct {
10   char buffer[1024];
11   char canary[sizeof(CANARY)];
12 } temp = { "buffer", CANARY };
13
14 int main(void) {
15   struct hostent resbuf;
16   struct hostent *result;
17   int herrno;
18   int retval;
19
20   /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
21   size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
22
23
24    char name[sizeof(temp.buffer)];
25    memset(name, '0', len);
26    name[len] = '\0';
27 retval = gethostbyname_r(name, &resbuf,
      temp.buffer, sizeof(temp.buffer), &result,
      &herrno);
28   if (strcmp(temp.canary, CANARY) != 0) {
29     puts("vulnerable");
30     exit(EXIT_SUCCESS);
31   }
32   if (retval == ERANGE) {
33     puts("not vulnerable");
34     exit(EXIT_SUCCESS);
35   }
36   puts("should not happen");
37   exit(EXIT_FAILURE);
38 }

Ein Patch für diese Sicherheitslücke erschien schon am 21. Mai 2013. Allerdings wurde die Schwachstelle damals noch nicht direkt als kritisch erkannt. Betroffen sind die Version 2.2 bis 2.7.

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
Nach oben