2009-11-15 2 views
7

Ich freue mich auf das Starten eines Projekts, die Ausführung von Python-Code, den der Benutzer über ein HTML-Formular eingibt. Ich weiß, dass dies potenziell tödlich sein kann (exec), aber ich habe es in mindestens one instance erfolgreich durchgeführt gesehen.Sicher ausgeführte Benutzer-Python-Code auf dem Server

Ich schickte eine E-Mail an die Entwickler der Python Challenge und mir wurde gesagt, dass sie eine Lösung verwenden, die sie selbst entwickelt haben, und sie gaben nur an, dass sie "Sicherheitsfunktionen des Betriebssystems" und das verwenden "Das Betriebssystem [Linux] bietet die meiste Sicherheit, die Sie brauchen, wenn Sie wissen, wie man es benutzt."

Würde jemand wissen, wie man dies sicher und sicher tun kann? Ich dachte darüber nach, für jede Einreichung eine neue VM zu erstellen, aber das hätte viel zu viel Aufwand und wäre nahezu unmöglich effizient zu implementieren.

+0

+1 für Selbstmord-Tag .. lol –

+0

Kommen Sie, daran zu denken ... ist nicht diese Frage besser geeignet für SF (oder vielleicht SU)? – Stephan202

+1

@ Stephan202: nicht notwendig, denn das * ist * ein ** Programmier ** Problem. – voyager

Antwort

0

Unter Verwendung von chroot (Wikipedia) kann ein Teil der Lösung, z.B. kombiniert mit ulimit und einigen anderen gebräuchlichen (oder benutzerdefinierten) Tools.

2

Wenn Sie das Skript als Benutzer nobody (unter Linux) ausführen, kann es praktisch nirgendwo schreiben und liest keine Daten, deren Berechtigungen ordnungsgemäß eingerichtet wurden. Aber es könnte noch einen DoS-Angriff verursachen, indem sie zum Beispiel:

  • füllt /tmp
  • essen alle RAM
  • essen alle CPU

Darüber hinaus kann außerhalb Netzwerkverbindungen geöffnet werden, und so weiter und so weiter. Sie können wahrscheinlich alle diese mit Kernel-Grenzen sperren, aber Sie sind verpflichtet, etwas zu vergessen.

Also ich denke, dass eine virtuelle Maschine ohne Zugriff auf das Netzwerk oder die echte Festplatte die einzige (einigermaßen) sichere Route wäre. Vielleicht verwenden die Entwickler der Python Challenge KVM, was im Prinzip "vom Betriebssystem bereitgestellt" ist.

Aus Effizienzgründen können Sie alle Übermittlungen in derselben VM ausführen. Das spart Ihnen viel Aufwand und im schlimmsten Fall behindern sie sich gegenseitig, aber nicht Ihren Server.

3

Auf einem modernen Linux neben chroot (2) können Sie den Prozess weiter einschränken, indem Sie clone (2) anstelle von fork (2) verwenden. Es gibt mehrere interessante Klon (2) Fahnen:

CLONE_NEWIPC (new namespace for semaphores, shared memory, message queues) 
CLONE_NEWNET (new network namespace - nice one) 
CLONE_NEWNS (new set of mountpoints) 
CLONE_NEWPID (new set of process identifiers) 
CLONE_NEWUTS (new hostname, domainname, etc) 

Bisher wurde diese Funktionalität in OpenVZ implementiert und fusionierte dann stromaufwärts, so gibt es keine Notwendigkeit für gepatchten Kernel mehr.

1

http://codepad.org/about hat ein solches System erfolgreich (als öffentliche Code Einfügen/Laufen Service!)

codepad.org ist ein Online-Compiler/Interpreter und ein einfaches Tool für die Zusammenarbeit umgesetzt. Es ist ein Pastebin, der Code für Sie ausführt. [...]

Wie es

Codeausführung arbeitet wird von einem Supervisor behandelt basierend auf geordi. Die Strategie besteht darin, alles unter ptrace auszuführen, wobei viele Systemaufrufe nicht erlaubt oder ignoriert werden.Compiler und ausführbare Enddateien werden beide in einem Chroot-Gefängnis mit strengen Ressourcenbeschränkungen ausgeführt. Der Supervisor ist in Haskell geschrieben.

[...]

Wenn Ihre App Remotecodeausführung ist, müssen Sie Sicherheitsprobleme erwarten. Anstatt verlassen sich auf nur die chroot und ptrace Supervisor habe ich einige zusätzliche Vorsichtsmaßnahmen getroffen:

  • Der Supervisor-Prozesse auf virtuellen Maschinen laufen, die eine solche Firewall geschützt sind, dass sie zur Herstellung von ausgehenden Verbindungen nicht in der Lage sind.

  • Die Computer, auf denen die virtuellen Maschinen ausgeführt werden, sind ebenfalls stark ausgelagert und werden regelmäßig aus ihren Quellbildern wiederhergestellt.

Verwandte Themen