Zwei Sicherheitslücken in KDE-Bibliotheken

Die Kdelibs-Bibliotheken stellen das Herzstück der Desktopumgebung KDE dar. Durch kürzlich entdeckte Schwachstellen in der Bibliothek ist ein entfernter Angreifer in der Lage, Befehle mit den Rechten des Anwenders auszuführen.

Eine Attacke auf eine der Lücken ist mit Hilfe geschickt konstruierter Cascading Style Sheets (CSS) möglich. Ursache ist ein Heap-Overflow-Fehler in der Funktion “CSSParser::parseFontFaceSrc()” in der Datei “khtml/css/cssparser.cpp”:

// There are two allowed functions: local() and format().
ValueList *args = val->function->args;
if (args && args->size() == 1) { if (!strcasecmp(domString(val->function->name), "local(") && !expectComma) { expectComma = true; allowFormat = false; Value* a = args->current(); uriValue = 0; parsedValue = new CSSFontFaceSrcValueImpl( domString( a->string ), true /*local src*/ ); } else if (!strcasecmp(domString(val->function->name), "format(") && allowFormat && uriValue) { expectComma = true; allowFormat = false; uriValue->setFormat( domString( args->current()->string ) ); uriValue = 0; valueList->next(); continue; } }

Der Code prüft, welche Funktion vorliegt: “local” oder “format”. Allerdings kann er nicht gewährleisten, dass diese auch wirklich mit String-Argumenten in “args” aufgerufen werden. Der Angreifer kann das ausnutzen, um mit den Funktionsargumenten einen Heap Overflow auszulösen.

Die Behebung der Lücke besteht einfach darin, zu prüfen, ob es sich um String-Argumente handelt:

(args->current()->unit == CSSPrimitiveValue::CSS_STRING)

Damit ist der Angriff vereitelt.

Eine zweite Sicherheitslücke tritt beim Verarbeiten spezieller HTML-Dateien auf. Hier kann es ebenfalls zu einem Heap Overflow kommen, wenn spezielle Bilddateien in die HTML-Seite eingefügt sind. Der Overflow tritt beim Berechnen der Canvas-Dimensionen in der Datei “khtml/imload/scaledimageplane.h” auf. Hier liegt der Grund in einem Integer-Overflow:

int intRatio = int(ratio*65536.0 + 1);

Die Entwickler haben ihn folgendermaßen korrigiert:

assert(ratio < 65536);
unsigned intRatio = unsigned(ratio*65536.0 + 1);

Beide Attacken kann ein Angreifer beispielsweise über den KDE-Webbrowser Konqueror ausnutzen.

Nach oben