Open Source im professionellen Einsatz
Linux-Magazin 09/2016

Libarchive-Bibliothek: Drei kritische Sicherheitslücken

Platzprobleme

Drei Schwachstellen in der Libarchive-Bibliothek haben zur Folge, dass entfernte Angreifer Befehle mit den Rechten des Anwenders ausführen dürfen.

470

Das erste Problem tritt beim Verarbeiten speziell präparierter 7-Zip-Archive auf. Öffnet das Opfer eine solche Datei, löst das einen Buffer Overflow aus, durch den der Angreifer Schadcode ausführen kann. Der verantwortliche Programmierfehler befindet sich in der Datei »libarchive/archive_read_support_format_7zip.c« . Dort verursacht er einen klassischen Integer Overflow.

Der fehlerhafte Code berechnet die Summe von »numUnpackStreams« und speichert sie in der Variablen »unpack_streams« . Die ist Teil der »struct _7z_folder« -Struktur. Die Variable selbst ist innerhalb der Struktur als »size_t« -Typ deklariert und somit auf x86-Systemen ein vorzeichenbehafteter 32-Bit-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 größer als 42 ist.

Für das Entpacken der Zip-Datei legt »lib-archive« mehrere Datei-Streams an. Die Zahl ergibt sich aus der Summe der verschiedenen »numUnpackStreams« und ist eine Größe für die Speicherallokation verschiedener Puffer. Das bewerkstelligen »calloc()« -Aufrufe. Insgesamt werden drei Puffer alloziert:

  • »unpackSizes«
  • »digestsDefined«
  • »digests«

Durch den Overflow alloziert Libarchive diese Puffer dann mit der falschen Größe, sodass es beim Schreiben in den Puffer zu einem Buffer Overflow kommt, den Angreifer zum Ausführen von Befehlen ausnutzen.

Neben diesem Integer-Overflow-Fehler wurde außerdem noch eine Buffer-Overflow-Schwachstelle in der Datei »libarchive/archive_read_support_format_mtree.c« entdeckt. Die »parse_device()« -Funktion deklariert zunächst ein Array, das maximal drei Integer-Werte halten kann:

#define MAX_PACK_ARGS 3
unsigned long numbers[MAX_PACK_ARGS];

Die Funktion stellt dann auch beim Füllen dieses Array sicher, dass nicht mehr als drei Einträge hineingeschrieben werden (Listing 1). Die If-Abfrage passt hier auf, 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 und im Ergebnis ebenfalls Befehle ausführen. Ein dritter Fehler tritt dann noch beim Verarbeiten von Rar-Dateien auf.

Listing 1

Füllen des Array

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

Die Ursache für alle drei Schwachstellen ist aber stets die gleiche: Eingaben des Anwenders der Bibliothek werden nicht korrekt gefiltert beziehungsweise verarbeitet. Solche Fehler kommen immer wieder vor und sind nur schwer zu vermeiden. Kritisch sind sie besonders dann, wenn sie – wie im vorliegenden Fall – in Bibliotheken vorkommen. Denn dann sind gleich zahlreiche Applikationen von dem Problem betroffen.

All drei Schwachstellen [1] haben die Entwickler in Version 3.2.1 korrigiert (jcb).

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 1 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

comments powered by Disqus

Ausgabe 07/2017

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

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