Ein fast 20 Jahre alter Bug lauert in fast jedem X-Server, der auf einem Linux-Rechner läuft. Dabei lässt er sich mit einem gebräuchlichen Analysetool leicht finden.
Diefreie Bibliothek Libxfont [1] liest für das X11-System Schriftartendateien. Das ist keine aufregende Aufgabe, aber die Software sollte sie möglichst ohne Sicherheitsschwächen erfüllen, schließlich läuft X.org in der Regel mit Rootberechtigung, um in vollem Maße auf die Hardware zugreifen zu können.
Font-Format
Zum Jahreswechsel 2013/2014 entdeckte der Oracle-Entwickler Alan Coopersmith einen sicherheitskritischen Bug in der Bibliothek [2]: Beim Verarbeiten von Dateien im Glyph Bitmap Distribution Format (BDF), das Adobe zum Speichern von Bitmap-Schriften geschaffen hat, kann der X-Server abstürzen. Das Problem erhielt den Bezeichner CVE-2013-6462.
Hintergrund ist ein Pufferüberlauf in Libxfont. Enthält eine BDF-Datei Zeilen, die länger als 100 Zeichen sind, kommt es zu einem Stack Buffer Overflow. Der Programmierfehler steckt in der Quelltextdatei »lib/libXfont/src/bitmap/bdfread.c«
Die darin enthaltene Funktion »bdfReadCharacters()« zum Lesen der Schriftartinformationen verzichtet in der unsicheren Version darauf, die Länge der Eingaben zu prüfen (Listing 1). Sie befüllt »charName« einfach mit dem Inhalt der eingelesenen Zeile, obwohl Libxfont die Variable nur mit »char charName[100]« auf dem Stack alloziert.
Listing 1
Auszug aus bdfread.c
01 if (sscanf((char *) line, "STARTCHAR %s", charName) != 1)
Im harmlosesten Fall kommt es so zu einem Absturz, unter Umständen kann aber ein Angreifer über eine manipulierte Schriftartendatei sogar Code einschleusen, der mit Rootrechten ausgeführt wird. Den Fehler fand Coopersmith routinemäßig mit dem statischen Analysetool Cppcheck [3]. Das Sicherheitsloch zu stopfen ist nicht weiter schwer, wie Listing 2 zeigt. Diese korrigierte Fassung sorgt mit dem Formatstring »STARTCHAR %99s« dafür, dass maximal 99 Zeichen in der Variablen landen.
Listing 2
Auszug aus bdfread.c (korrigiert)
01 if (sscanf((char *) line, "STARTCHAR %99s", charName) != 1)
Altlast
Der Fehler kann ein stolzes Alter vorweisen: Laut Coopersmiths Recherchen befindet er sich bereits seit 1995 in jeder X11-Release – bis zur kürzlich noch aktuellen Libxfont-Version 1.4.6. In Ausgabe 1.4.7 ist das Problem behoben, die Linux-Distributoren haben den Fix aber auch in ältere eingesetzte Versionen zurückportiert. Im Mailinglisten-Thread zum Bug bedankt sich das Projekt X.org äußerst höflich bei den Cppcheck-Entwicklern, dass sie ihr Analysewerkzeug (Abbildung 1) als Open Source bereitstellen.
Infos
- Libxfont: http://xorg.freedesktop.org/releases/individual/lib/
- X.org Security Advisory CVE-2013-6462: http://lists.x.org/archives/xorg-announce/2014-January/002389.html
- Cppcheck: http://cppcheck.sourceforge.net






