Libre Office: Attacke mit Lotus-Word-Pro-Dateien

Die freie Bürosuite Libre Office einen Vielzahl von Dokumentenformaten importieren. In den Routinen zum Verarbeiten von Lotus-Word-Pro-Dateien (“*.lwp”) ist eine Sicherheitslücke entdeckt worden, über die in entfernter Angreifer unter Umständen Befehle mit den Rechten des Anwenders ausführen kann.

Bei der Schwachstelle handelt es sich um einen Buffer-Overflow-Fehler, der sich in der Datei “/lotuswordpro/source/filter/lwpidxmgr.hxx” findet. Diese Header-Datei enthält Teile des Lotus-Word-Pro-Filters von Libre Office. Unter anderem definiert sie die Klasse “LwpIndexManager” wie folgt:

class LwpIndexManager
{
public: LwpIndexManager(); ~LwpIndexManager();
protected: static const sal_uInt8 MAXOBJECTIDS; std::vector<LwpKey*> m_ObjectKeys; //the <id, offset> ordered vector std::vector<LwpKey*> m_RootObjs; //For those object ids in RootObjIndex std::vector<sal_uInt32> m_TimeTable; //Time table for object low id compression //sal_uInt16 m_nKeyCount; sal_uInt32 m_nKeyCount; //the count of all object std::vector<sal_uInt32> m_TempVec; // a temp vector , store the offset of leafindex sal_uInt32 m_ChildIndex[256]; //Offset of leaf index sal_uInt16 m_nLeafCount;
protected: void ReadRootData(LwpObjectStream *pObjStrm ); //Read root index data //Add new method to handle ObjIndex void ReadObjIndexData(LwpObjectStream* pObjStrm); void ReadObjIndex( LwpSvStream *pStrm ); //Read Obj index void ReadLeafIndex( LwpSvStream *pStrm ); //Read leaf index obj void ReadLeafData( LwpObjectStream *pStrm ); //Read leaf index obj data void ReadTimeTable( LwpObjectStream *pStrm );
public: void Read( LwpSvStream *pStrm ); sal_uInt32 GetObjOffset( LwpObjectID objid ); sal_uInt32 GetObjTime( sal_uInt16 index ) { return m_TimeTable[index-1]; }
};

Die inline deklarierte Funktion “GetObjTime()” sieht auf Anhieb verdächtig aus, weil sie einen Index-Wert direkt in das Array “m_TimeTable” eingibt. In der Tat ist es möglich, mit einer geschickt konstruierten Lotus-Word-Pro-Datei hier einen Overflow zu erzeugen: Sendet der Angreifer eine entsprechend konstruierte “*.lwp”-Datei an sein Opfer, werden die vom Angreifer gewünschten Befehle mit den Rechten des Libre-Office-Anwenders ausgeführt.

Eine Korrektur dieses Programmierfehlers lässt sich leicht implementieren: da es sich bei “m_TimeTable” um ein STL-Vektor-Objekt handelt, ist es gar nicht nötig, den Vektor derart direkt zu adressieren. Stattdessen bietet es sich an dieser Stelle an, die “.at()”-Funktion der Container-Klasse zu verwenden. Diese hat den Vorteil, dass eine Exception ausgelöst wird, sobald ein Zugriff außerhalb des Wertebereichs stattfindet. Und damit lässt sich der Overflow einfach vermeiden. Die korrigierte Version sieht so aus:

sal_uInt32 GetObjTime( sal_uInt16 index ) { return m_TimeTable.at(index-1); }

Betroffen sind die Libre-Office-Versionen 3.3.1 und 3.3.2. Ein Update behebt das Problem.

Nach oben