Nehmen wir an, es gibt einen Server im Internet, an den man einen Code zur Auswertung senden kann. Irgendwann nimmt der Server den gesamten übergebenen Code und startet ihn und bewertet ihn. Irgendwann wird es jedoch definitiv auf "os.system ('rm -rf *')" stoßen, das von irgendeinem bösen Programmierer gesendet wird. Abgesehen von "rm -rf" könnte man erwarten, dass Leute versuchen, den Server zu benutzen, um Spam zu verschicken oder jemanden zu belügen, oder herumalbern mit "while True: pass" Dinge.
Gibt es eine Möglichkeit, mit solch unfreundlichem / nicht vertrauenswürdigem Code zusammenzuarbeiten? Insbesondere interessiert mich eine Lösung für Python. Wenn Sie jedoch Informationen für eine andere Sprache haben, teilen Sie diese bitte mit.
Sie können pysandbox überprüfen, was genau das tut, obwohl die VM-Route wahrscheinlich sicherer ist, wenn Sie es sich leisten können.
>Wenn Sie nicht spezifisch für die CPython-Implementierung sind, sollten Sie PyPy [wiki ] für diese Zwecke - dieser Python-Dialekt ermöglicht transparentes Code-Sandboxing.
Andernfalls können Sie den __builtin__
und __builtins__
in den entsprechenden globals / locals-Argumenten exec
oder eval
angeben.
Darüber hinaus können Sie ein Wörterbuch-ähnliches Objekt anstelle eines echten Wörterbuchs bereitstellen und verfolgen, was nicht vertrauenswürdiger Code mit seinem Namensraum macht.
Außerdem können Sie diesen Code tatsächlich verfolgen (indem Sie sys.settrace()
in einer eingeschränkten Umgebung ausgeben, bevor ein anderer Code ausgeführt wird), damit Sie die Ausführung unterbrechen können, wenn etwas schief geht.
Wenn keine der Lösungen akzeptabel ist, verwenden Sie Sandboxing auf OS-Ebene wie chroot
, unionfs
und standard multiprocess
python, um den Code-Worker in einem separaten sicheren Prozess zu erzeugen.
Es ist unmöglich, eine absolute Lösung dafür zu finden, weil die Definition von "schlecht" ziemlich schwer zu fassen ist.
Öffnen und Schreiben in eine Datei schlecht oder gut? Was ist, wenn diese Datei / dev / ram ist?
Sie können Verhaltenssignaturen profilieren, oder Sie können versuchen, alles zu blockieren, was schlecht sein könnte, aber Sie werden niemals gewinnen. Javascript ist ein ziemlich gutes Beispiel dafür, dass Leute auf ihren Computern ständig Javascript-Code ausführen - es sollte Sandboxed sein, aber es gibt alle Arten von Sicherheitsproblemen und Randbedingungen, die auftauchen.
Ich sage nicht, versuch es nicht, du wirst viel aus dem Prozess lernen.
Viele Unternehmen haben Millionen ausgegeben (Intel hat gerade Milliarden für McAffee ausgegeben), um herauszufinden, wie "schlechter Code" erkannt werden kann - und Maschinen, auf denen McAffe Anti-Virus läuft, werden jeden Tag mit Viren infiziert. Python-Code ist nicht weniger gefährlich als C. Sie können Systemaufrufe ausführen, an C-Bibliotheken binden usw.
Ich würde ernsthaft in Erwägung ziehen, die Umgebung zu virtualisieren, um dieses Zeug zu betreiben, so dass Exploits in jedem von Ihnen implementierten Mechanismus durch die Konfiguration der virtuellen Maschine noch einmal ausgelöst werden können.
Die Anzahl der Benutzer und die Art des Codes, den Sie testen / ausführen möchten, hätten erheblichen Einfluss auf die Auswahlmöglichkeiten. Wenn von ihnen nicht erwartet wird, dass sie mit Dateien oder Datenbanken verbunden sind oder rechenintensive Aufgaben ausführen und Sie sehr wenig Druck haben, können Sie fast den gesamten Dateizugriff verhindern und dem Prozess ein Zeitlimit auferlegen, bevor er beendet wird die Einreichung wird als zu teuer oder bösartig gekennzeichnet.
Wenn der Code, den Sie testen sollten, eine beliebige Django-Erweiterung oder -Seite ist, dann sind Sie vermutlich sehr beschäftigt.
Sie können ein generisches Sanbox versuchen, zB Sydbox oder Gentoo's Sandbox . Sie sind nicht Python-spezifisch.
Beide können so konfiguriert werden, dass sie das Lesen / Schreiben auf einige Verzeichnisse beschränken. Sydbox kann sogar Sandbox-Sockets.
Ich denke, ein solcher Fehler wird sehr schwer sein und mich an einen Vortrag erinnern, den ich über die Vorteile der Programmierung in einer virtuellen Umgebung gelesen habe. Wenn Sie es tun, ist es praktisch cool, wenn sie es verarschen. Es wird nicht eine Weile lösen. Wahr: passiere aber rm -rf / spielt keine Rolle.
Wenn ich mich nicht täusche (und das kann sehr gut sein), ist dies der Grund dafür, dass Google Python für die App Engine geändert hat. Sie führen Python-Code auf ihrem Server aus, aber sie haben die Fähigkeit zum Schreiben in Dateien entfernt. Alle Daten werden in der Datenbank "nosql" gespeichert.
Es ist keine direkte Antwort auf Ihre Frage, sondern ein Beispiel dafür, wie dieses Problem unter bestimmten Umständen gelöst wurde.
Tags und Links python trusted-vs-untrusted