2013-03-13 7 views
7

Wenn mein Code Module von Drittanbietern verwendet, die vertraut werden kann nicht, gibt es etwas Situation wie diese zu vermeiden:Schutz importierten Module von durch Drittanbieter-Code beschädigt werden

UntrustedModule.py:

import random 

random.random = lambda : 4 

MyModule .py:

import random 
import UntrustedModule 

print (random.random()) 

wo nur importieren dieses Modul Annahmen über andere, nicht verwandte bricht?

+6

Nicht vertrauenswürdige Module können viel mehr tun, als nur Funktionen und ähnliches ersetzen. Führen Sie keine nicht vertrauenswürdigen Module aus. –

+2

Diese Änderung sieht gut aus (siehe http://xkcd.com/221/). ;) – Matthias

+0

Python ist nicht wirklich darauf ausgelegt, dies zu verhindern. Wenn dies eine Voraussetzung ist, sollten Sie entweder eine Sprache verwenden, die (wie Lua oder Javascript) ist, oder ein Sandbox-Schema erstellen, das die Module in einem anderen Prozess ausführt. – millimoose

Antwort

5

Nein, eine solche Garantie kann man in Python nicht haben, zumindest nicht in der CPython-Implementierung. Wenn Sie ein Modul importieren, wird sein Code ausgeführt, und es hat vollen Zugriff auf jeden Teil des Interpreters (und wahrscheinlich große Teile Ihres Systems). Keine Möglichkeit, das zu vermeiden. Es ist unklug, jemals nicht vertrauenswürdigen Code zu laden, weil es so viel kann.

Sie könnten jedoch daran interessiert sein, den Prozess in einem isolierten Prozess auszuführen und nur mit ihm über IPC zu kommunizieren. Dies ist ein großes Thema und hängt vom Grad der Isolation ab, den Sie benötigen, und davon, wie sehr Sie dem externen Code vertrauen.


PyPy implementiert einige sandboxing features. Es ist nicht so einfach, nur Sandboxing zu aktivieren, aber es ist eine von vielen Möglichkeiten, nicht vertrauenswürdigen Code zu isolieren.

-1

können Sie ein tun

reload(random) 

, um es von der Quelle bzw. neu zu laden. um es so wiederherzustellen, wie es sein soll.

+0

Was ist falsch an dieser Antwort? – glglgl

+0

Ich denke, es ist Besorgnis, dass Sicherheitsfragen übersehen werden, da OP von "nicht vertrauenswürdigem Code" sprach. –

+0

(Nicht vertrauenswürdiger Code könnte in die Importmaschine selbst eingesteckt werden und das erneute Laden nutzlos machen) –

-1

Python importiert zuerst den lokalen Pfad (das Verzeichnis, aus dem das Skript ausgeführt wurde) und dann alle Pfade, die in der Umgebungsvariablen PYTHONPATH aufgelistet sind.

Eine bessere Lösung wäre das Testen und Schreiben von Tests gegen Ihr nicht vertrauenswürdiges Modul.

+2

"Eine bessere Lösung wäre es, Tests gegen Ihr nicht vertrauenswürdiges Modul zu prüfen und zu schreiben." - nicht wirklich. Das bedeutet nur, dass Sie wetten, dass Sie schlauer sind als potenzielle Angreifer. – millimoose

+0

@millimoose: Also, wo die Inspektion kommt. Wenn das Modul wirklich nicht vertrauenswürdig ist, dann ist es am besten, nicht verwendet zu werden. –

Verwandte Themen