Python Pickle Unsicherheit verstehen

7

In der Python-Dokumentation wird angegeben, dass pickle nicht sicher ist und keine nicht vertrauenswürdigen Benutzereingaben analysieren soll. Wenn du das erforschst; Fast alle Beispiele demonstrieren dies mit einem system() Aufruf über os.system .

Was mir nicht klar ist, ist, wie os.system korrekt interpretiert wird, ohne dass das os Modul importiert wird.

%Vor%

Kann jemand das erklären?

    
tMC 24.04.2012, 16:42
quelle

4 Antworten

9

Der Name des Moduls ( os ) ist Teil des Opcodes, und pickle importiert das Modul automatisch:

%Vor%

Beachten Sie die __import__(module) -Zeile.

Die Funktion wird aufgerufen, wenn die Bytecode-Anweisung GLOBAL 'os system' pickle ausgeführt wird.

Dieser Mechanismus ist notwendig, um Instanzen von Klassen, deren Module nicht explizit in den Namespace des Aufrufers importiert wurden, zu entkoppeln.

    
NPE 24.04.2012, 16:45
quelle
8

Für insgesamt zu viele Informationen über das Schreiben von bösartigen Pickles, die weit über das Standardbeispiel os.system () hinausgehen, siehe Präsentation und das dazugehörige Papier .

    
wtt 25.04.2012 00:44
quelle
6

Wenn Sie pickletools.dis verwenden, um die Beize zu zerlegen, können Sie sehen, wie das funktioniert:

%Vor%

Ausgabe:

%Vor%

Pickle verwendet eine einfache stapelbasierte virtuelle Maschine, die die Anweisungen zur Rekonstruktion des Objekts aufzeichnet. Mit anderen Worten, die eingelegten Anweisungen in Ihrem Beispiel sind:

Push self.find_class (Modulname, Klassenname), d. h. push os.system Drücke die Zeichenfolge 'ls ~' Erzeuge Tupel von den obersten Stapeln Apply auf argtuple, beide auf Stack, aufrufbar. d.h. os.system (* ('ls ~',))

Quelle

    
Charles Menguy 24.04.2012 16:47
quelle
2

Beim Importieren eines Moduls wird es nur zum lokalen Namespace hinzugefügt, der nicht unbedingt derselbe ist, in dem Sie sich befinden. Außer wenn dies nicht der Fall ist:

%Vor%     
Ignacio Vazquez-Abrams 24.04.2012 16:45
quelle

Tags und Links