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.
Kann jemand das erklären?
Der Name des Moduls ( os
) ist Teil des Opcodes, und pickle
importiert das Modul automatisch:
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.
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 .
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 ~',))
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%Tags und Links python security namespaces pickle