Open Source im professionellen Einsatz

Ghostscript: Integer-Overflow-Fehler

Eine Sicherheitslücke in der Ghostscript-Applikation führt dazu, dass sie ein entfernter Angreifer zum Absturz bringen kann. Eine Exploit PS-Datei wurde ebenfalls veröffentlicht.  Versucht man diese via ps2pdf in eine PDF-Datei umzuwandeln, so kommt es zu einem Segmentation Fault:

$ ps2pdf test.ps
Segmentation fault

Genauso tritt auch ein Segmentation Fault beim Aufruf von gs selbst auf:

<u class="ezoeItemCustomTag underline" type="custom">$ /usr/bin/gs -P- -dSAFER -dCompatibilityLevel=1.4 -q -P- -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sstdout=%stderr -sOutputFile=test.pdf -P - </u><u class="ezoeItemCustomTag underline" type="custom">-dSAFER -dCompatibilityLevel=1.4 -c .setpdfwrite -f test.ps</u>

Ursache für diese Schwachstelle ist ein Programmierfehler in der »gs_heap_alloc_bytes()«-Funktion. Diese Funktion befindet sich in
»base/gsmalloc.c« und enthaelt folgende Zeilen:

uint added = size + sizeof(gs_malloc_block_t);
if (mmem->limit - added < mmem->used)
  set_msg("exceeded limit");
else if ((ptr = (byte *) Memento_label(malloc(added), cname)) == 0)
  set_msg("failed");

Sollte hier die size-Variable einen sehr großen Wert enthalten, so kann es bei der Addition

size + sizeof(gs_malloc_block_t);

zu einem Überlauf kommen. Damit wird dann auf dem Heap spaeter die falsche Speichergröße alloziert und es kommt zum Absturz der
Applikation. Der implementierte Patch korrigiert diese Problem durch eine verbesserte If()-Abfrage:

-if (mmem->limit - added < mmem->used)
+if (added <= size || mmem->limit - added < mmem->used)
   set_msg("exceeded limit");
 else if ((ptr = (byte *) Memento_label(malloc(added), cname)) == 0)
    set_msg("failed");

Damit tritt der Overflow nicht mehr auf und das Programm stürz beim Arbeiten auf test.ps nicht mehr ab.
Die aktuelle Version im Git-Repository ist entsprechend korrigiert.

comments powered by Disqus

Stellenmarkt

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