Open Source im professionellen Einsatz

libarchive-Bibliothek: drei kritische Sicherheitslücken

Drei Schwachstellen in der libarchive-Bibliothek haben zur Folge, dass entfernte Angreifer Befehle mit den Rechten des Anwenders ausführen können. Das erste Problem tritt beim Verarbeiten spezieller 7-Zip-Archive auf. Öffnet das Opfer eine solche Datei, so wird ein Buffer Overflow ausgelöst womit der Angreifer dann Schadcode ausführen kann. Der verantwortliche Programmierfehler befindet sich in der »libarchive/archive_read_support_format_7zip.c«-Datei. Hier kann es zunächst zu einem klassischen Integer-Overflow kommen. Im fehlerhaften Code wird die Summe von »numUnpackStreams« berechnet und diese Summe wird in der »unpack_streams«-Variable gespeichert. Diese Variable ist aber als Size_t-Typ deklariert, und somit auf x86-Systemen ein 32-Bit vorzeichenbehafteter Integer. Der maximal mögliche Wert für »numUnpackStreams« ist aber im Code als »UMAX_ENTRY=100000000« definiert, wodurch es zu einem Overflow beim Summieren kommen kann. Der Overflow tritt genau dann auf, wenn die Zahl der Verzeichnisse (numFolders) größer als 42 ist. Anschließend wird die so ermittelte Summe als Größe für eine Speicherallokation eines Puffers verwendet. Durch den Overflow wird dieser Puffer dann mit der falschen Größe alloziert, so dass es beim Schreiben in den Puffer zu einem Buffer Overflow kommt, den der Angreifer zum Ausführen von Befehlen ausnutzen kann. Ein weiterer Buffer-Overflow-Fehler befindet sich in der »libarchive/archive_read_support_format_mtree.c«-Datei. In der »parse_device()«-Funktion wird zunächst ein Array deklariert, welches maximal drei Integer-Werte halten kann:

#define MAX_PACK_ARGS 3 unsigned long numbers[MAX_PACK_ARGS]; 

Die Funktion stellt dann auch beim Befüllen dieses Arrays sicher, das nicht mehr als drei Einträge hineingeschrieben werden:

numbers[argc++] = (unsigned long)mtree_atol(&p); 
if (argc > MAX_PACK_ARGS) { 
   archive_set_error(a, ARCHIVE_ERRNO_FILE_FORMAT, "Too many arguments"); 
   return ARCHIVE_WARN; 
}

Die If()-Abfrage stellt hier sicher, dass kein Overflow auftritt. Allerdings stellt die Funktion nicht sicher, dass auch nur unsigned long Werte in das Array geschrieben werden. Ein Angreifer kann dies ausnutzen, um ebenfalls Befehle auszuführen. Auch das Verarbeiten von Rar-Dateien ist fehlerhaft implementiert und kann von einem entfernten Angreifer zum Ausführen von Befehle ausgenutzt werden. Der hier verantwortliche Programmierfehler ist etwas komplexer und tritt durch einen Heap Overflow auf. Die Schachstellen wurden in der Version 3.2.1 korrigiert.        

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.