Angriff Python ' s pickle
Schreibe ich eine web-app, speichert die Benutzereingaben in ein Objekt. Dieses Objekt wird gebeizt.
Ist es möglich für einen Benutzer, um Handwerk schädliche Eingaben, die etwas tun könnten ungeheuerlich, wenn das Objekt unpickled?
Hier ist eine wirklich basic-code-Beispiel ignoriert, dass wunderbare Prinzipien wie Kapselung, sondern verkörpert das, was ich sehe:
import pickle
class X(object):
some_attribute = None
x = X()
x.some_attribute = 'insert some user input that could possibly be bad'
p = pickle.dumps(x)
# Can bad things happen here if the object, before being picked, contained
# potentially bad data in some_attribute?
x = pickle.loads(p)
- Ist es nur ein string? Nein, es ist sicher. Ist es ein willkürliches Objekt? Sie betcha, kann es tun schlechte Sachen.
- +1 das ist eine ausgezeichnete Frage
- Gurke.Lasten(p) behandelt eine Zeichenkette als ein willkürliches Objekt, obwohl
- Ich bin nicht allzu besorgt darüber, da mein code nur unpickle Daten, die zuvor gebeizt, es ist nur eine Sorge, ob die Daten in das Objekt, das übergeben wurde, in der von einem bösartigen Benutzer über das öffentliche web-interface kann irgendwie überlisten
pickle.loads()
zu handeln wie ein bösereval()
beliebigen code auszuführen oder machen einige andere gute. - ja, ich möchte sagen, @Not_a_Golfer ist richtig, aber Sie wollen sehr vorsichtig sein hier. Es gibt viel Platz für Tricks
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja und Nein...
Nicht - es sei denn, es gibt einen bug mit dem interpreter oder mit dem pickle-Modul, können Sie nicht das ausführen von beliebigem code mit eingelegtem text, oder so ähnlich. es sei denn, der eingelegte text ist
eval
ed später, oder du machst Sachen, wie das erstellen ein neues Objekt mit einem Typ, erwähnt in diese Daten.Ja - je nachdem, was Sie Vorhaben zu tun, mit der Informationen in das Objekt später kann ein Benutzer alle möglichen Dinge. Von SQL-injection-versuche, zu ändern Anmeldeinformationen, brute-force-Passwort-cracking, oder etwas, das sollte berücksichtigt werden, wenn Sie die Validierung von Benutzereingaben. Aber Sie sind wahrscheinlich die Prüfung für alle diese.
Bearbeiten:
Die python-Dokumentation-Staaten:
Dies ist jedoch nicht Ihr Fall - Sie bestätigen Sie die Eingabe, durch die regelmäßige überprüfung, und dann Gurke es.
Nun nach den Dokumentation
Würde es bedeuten, dass es möglich ist, zu angreifen, diese Funktion nur aufrufen, wenn die Struktur der Daten gab es in einem solchen Zustand, dass die Gurke Algorithmus geben würde, in einen Zustand, wo das Verhalten des Programms nicht gewährleistet war.
Gemäß dieser Website
ist alles, was erforderlich ist, um beliebigen code auszuführen. Es gibt auch andere Beispiele gibt, als auch eine "Verbesserung" zu Beizen für die Sicherheit.
pickle.loads()
Funktion, beliebigen code auszuführen.ls
.s
verursachen Probleme inpickle.loads(pickle.dumps(s))
?pickle.loads("cos\nsystem\n(S'ls ~'\ntR.") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: a bytes-like object is required, not 'str'
Fand ich diese in die Dokumentation der multiprocessing-Modul denen ich denke, dass beantwortet die Frage:
(Hervorhebung von mir)
Schlussfolgerung ist, dass, wenn das connection-Objekt ist produziert über eine Vertrauenswürdige Leitung, d.h. eine Vertrauenswürdige Gurke, dann kann es sicher unpickled.