[Generic/Python] Schwachstellen im Marshalling-Code
(2002-09-02 20:08:38.99279+00)
Quelle:
http://cert.uni-stuttgart.de/archive/bugtraq/2002/07/msg00189.html
Python-Programme, die über von Python bereitgestellte Marshalling-Verfahren Daten einlesen, interpretieren bestimmte Eingaben als Programmcode.
Betroffene Systeme
- Systeme, die Python verwenden.
Einfallstor
Der Angreifer muß in der Lage sein, Marshalling-Daten an eine Python-Anwendung zu übermitteln.
Auswirkung
Marshalling-Daten können Programmcode enthalten, der vom Python-Interpreter ausgeführt wird.
Typ der Verwundbarkeit
design flaw
Gefahrenpotential
hoch bis sehr hoch (abhängig von der Python-Anwendung, auf die mit dieser Schwachstelle ein Angriff durchgeführt wird)
(Hinweise zur Einstufung des Gefahrenpotentials.)
Kontext
Marshalling ist ein Verfahren, bei dem Datenstrukturen in eine Darstellung als Bytefolge überführt werden. Diese Bytefolge kann dann in Dateien gespeichert, übertragen usw. werden. Der Empfänger macht den Marshalling-Vorgang wieder rückgängig und gewinnt damit die Datenstrukturen zurück.
Python bietet zwei Marshalling-Verfahren an: Das Modul marshal
implementiert eine plattformabhängige Variante (bei der auch Objekte gespeichert werden können, die Programmcode enthalten), pickle
implementiert eine plattformunabhängige Variante, die direkt keine Code-Objekte speichern kann. (Daneben existiert noch cPickle
, eine schnellere Reimplementierung von pickle
in C.)
Beschreibung
Bei der Umkehr des Marshalling-Vorgangs durch pickle
kann ein speziell gestalteter Eingabestrom dazu führen, daß beliebiger Code durch den Python-Prozeß ausgeführt wird. Bislang sind zwei unterschiedliche Angriffe bekannt:
-
Versionen vor Python 2.0 verwendeten
eval
, um Zeichenketten im Eingabestrom zu interpretieren; dadurch können diese Daten beliebige Python-Funktionen (z.B.os.system
) aufrufen. -
Versionen vor Python 2.2 führen beim Aufrufen von Konstruktoren für Objekte keine Prüfung durch, ob die aufzurufenden Funktionen überhaupt Konstruktoren sind (
os.system
ließe sich z.B. auch als Konstruktor verwenden) oder ob durch die Konstruktion unerwünschte Seiteneffekte auftreten.
In Python 2.2 sind zwar beide Schwachstellen behoben worden; dennoch sollte nicht davon ausgegangen werden, daß mit marshal
oder pickle
/cPickle
Daten (und nicht Programmcode) aus nicht vertrauenswürdiger Quelle sicher geladen werden kann.
Dem RUS-CERT ist keine Anwendung bekannt, bei der tatsächlich über diese Schwachstelle Angriffe durchgeführt werden können.
Gegenmaßnahmen
- Verzicht auf den Einsatz von Marshalling zum Einlesen von Daten aus nicht vertrauenswerter Quelle.
Hinweis
Die in diesem Text enthaltene Information wurde für die Mitglieder der Universität Stuttgart recherchiert und zusammengestellt. Die Universität Stuttgart übernimmt keinerlei Haftung für die Inhalte. Dieser Artikel darf ausschließlich in unveränderter Form und nur zusammen mit diesem Hinweis sowie dem folgenden Copyrightverweis veröffentlicht werden. Eine Veröffentlichung unter diesen Bedingungen an anderer Stelle ist ausdrücklich gestattet.
Copyright © 2022 RUS-CERT, Universität Stuttgart, https://cert.uni-stuttgart.de/
https://cert.uni-stuttgart.de/ticker/article.php?mid=949