Sandboxing unter Linux

Lesezeit: 7 Minuten

Benutzer-Avatar
ogie

Ich möchte eine Webanwendung erstellen, die es dem Benutzer ermöglicht, C-Code hochzuladen und die Ergebnisse seiner Ausführung anzuzeigen (der Code würde auf dem Server kompiliert). Die Benutzer sind nicht vertrauenswürdig, was offensichtlich einige enorme Auswirkungen auf die Sicherheit hat.

Also muss ich eine Art Sandbox für die Apps erstellen. Auf der einfachsten Ebene möchte ich den Zugriff auf das Dateisystem auf einige angegebene Verzeichnisse beschränken. Ich kann Chroot-Jails nicht direkt verwenden, da die Web-App nicht als privilegierter Benutzer ausgeführt wird. Ich denke, eine ausführbare Suid-Datei, die das Gefängnis einrichtet, wäre eine Option.

Die hochgeladenen Programme wären ziemlich klein, daher sollten sie schnell ausgeführt werden (höchstens ein paar Sekunden). Daher kann ich den Prozess nach einem voreingestellten Timeout beenden, aber wie stelle ich sicher, dass er keine neuen Prozesse hervorbringt? Oder wenn ich es nicht kann, ist das Töten der gesamten pgid eine zuverlässige Methode?

Was wäre der beste Weg, dies zu tun – außer “überhaupt nicht tun”? 🙂 Welche anderen krassen Sicherheitsprobleme habe ich übersehen?

FWIW, die Web-App wird in Python geschrieben.

  • Willkommen in der Welt der Antivirensoftware. Kann „dem Benutzer“ vertraut werden? Wenn ja, einfach kompilieren und ausführen und sich darüber keine Gedanken machen. Wenn dem Benutzer nicht vertraut werden kann, was kann verhindern, dass er zum Hackerzentrum wird, wenn jeder versucht, Ihren Server zu einem Teil eines Bot-Netzes zu machen?

    – S. Lott

    19. Juni 2009 um 20:05 Uhr

  • Ähnliche Fragen zu Sandboxing-/Jailing-Prozessen in Linux oder Unix: * unix.stackexchange.com/q/6433/4319 * stackoverflow.com/q/3859710/94687 * stackoverflow.com/q/4410447/94687 * stackoverflow.com/q/4249063/94687

    – imz – Ivan Zakharyaschev

    13. März 2011 um 13:38 Uhr

  • mögliches Duplikat von Secure way to run other people code (sandbox) on my server?

    – Ciro Santilli Путлер Капут 六四事

    21. August 2014 um 7:02 Uhr

Benutzer-Avatar
Sweeney

Zusammen mit den anderen Vorschlägen könnten Sie dies nützlich finden.

http://www.eelis.net/geordi/

Das ist von http://codepad.org/about, codepad.orgist die About-Seite.

  • Vielen Dank. Beim Googeln bin ich tatsächlich über die gleiche Seite in einem früheren Stackoverflow-Beitrag gestolpert: stackoverflow.com/questions/818402/… Ich würde es gerne abreißen, aber es scheint nicht, dass Codepad Open Source ist. Ich beabsichtige daher, einen ähnlichen Ansatz zu verfolgen. Systrace/ptrace Supervisor + Chroot Jail + . Auch ein großes Dankeschön an alle anderen für Vorschläge, wirklich sehr hilfreich. Eine weitere interessante Lektüre: crypto.stanford.edu/cs155/lectures/06-sandboxing.ppt

    – ogie

    19. Juni 2009 um 22:44 Uhr

  • @oggy Aber geordi IST Open Source — eelis.net/geordi/#download , github.com/Eelis/geordi , github.com/Eelis/geordi/blob/master/LICENSE : “Alle an der Erstellung des Inhalts dieses Pakets beteiligten Autoren haben zugestimmt, ihre jeweiligen Beiträge gemeinfrei freizugeben.”

    – imz – Ivan Zakharyaschev

    17. April 2013 um 1:32 Uhr

Die wenigen Details, die Sie angeben, implizieren, dass Sie die administrative Kontrolle über den Server selbst haben, daher geht mein Vorschlag von dieser Annahme aus.

Ich würde dies als Batch-System angehen. Der Webserver akzeptiert ein Hochladen der Quelldatei, ein Prozess fragt das Übermittlungsverzeichnis ab, verarbeitet die Datei und übermittelt dann das Ergebnis an ein anderes Verzeichnis, das die Webanwendung abfragt, bis sie das Ergebnis findet und anzeigt.

Der lustige Teil ist, wie man die Ausführung sicher handhabt.

Mein bevorzugtes Betriebssystem ist FreeBSD, also würde ich ein vorkonfiguriertes Jail einrichten (nicht zu verwechseln mit einem Vanilla-Chroot-Jail), das die Ausgabe kompilieren, ausführen und speichern würde. Starten Sie dann für jede Übermittlung der Quelldatei eine ursprüngliche Kopie des Gefängnisses für jede Ausführung mit einer Kopie der Quelldatei darin.

Vorausgesetzt, dass /dev des Gefängnisses auf fast nichts reduziert wird, Systemressourcenlimits sicher eingestellt sind und der Datenverkehr nicht aus dem Gefängnis geleitet werden kann (gebunden an eine nicht routbare Adresse oder einfach durch eine Firewall geschützt), würde ich persönlich damit zufrieden sein ein Server unter meiner Obhut.

Da Sie Linux verwenden, würde ich User Mode Linux oder Linux-VServer untersuchen, die im Konzept FreeBSD-Gefängnissen sehr ähnlich sind (ich habe sie selbst nie benutzt, aber darüber gelesen). Es sind mehrere andere solcher Systeme aufgeführt hier.

Diese Methode ist viel sicherer als ein Vanilla-Chroot-Gefängnis und viel leichter als die Verwendung einer vollständigen Virtualisierung wie qemu/kvm oder VMware.

Ich bin kein Programmierer, also weiß ich nicht, welche Art von AJAX-y-Ding Sie verwenden könnten, um die Ergebnisse abzufragen, aber ich bin sicher, es könnte getan werden. Als Administrator fände ich das ein lustiges Projekt, an dem man teilnehmen kann. Viel Spaß. 🙂

  • Die Gefahr für Jails oder VServer besteht darin, dass ein Kernel-Bug (wie die Spleiß-Schwachstelle vor einiger Zeit) den Host immer noch angreifbar macht. Ebenso hatten alle Virtualisierungsmethoden (einschließlich UML) jailbreakende Sicherheitslücken …

    – vergänglich

    19. Juni 2009 um 22:35 Uhr

  • Sehr richtig. Exploits sind jedoch ein unvermeidlicher Teil des Spiels. Software kann immer (irgendwann) kaputt gehen. Dieses ganze Konzept (das Ausführen von nicht vertrauenswürdigem Code auf dem eigenen Server zuzulassen) ist nichts für schwache Nerven. Das OP erklärte, dass er “überhaupt nicht” als Antwort akzeptieren würde, also skizzierte ich eine von mehreren Optionen.

    – Geoff Fritz

    19. Juni 2009 um 23:58 Uhr

Benutzer-Avatar
Rmeador

Ich würde sagen, das ist auf vielen Ebenen extrem gefährlich. Sie öffnen sich im Wesentlichen für jeden Exploit, der auf Ihrem System gefunden werden kann (während Sie normalerweise auf diejenigen beschränkt sind, die Benutzer aus der Ferne ausnutzen können). Ich würde sagen, tu es nicht, wenn du es vermeiden kannst.

Wenn Sie dies tun möchten, möchten Sie möglicherweise eine Art virtuelle Maschine verwenden, um den Code des Benutzers auszuführen. Verwenden Sie so etwas wie KVM Es ist möglich, mehrere virtuelle Maschinen mit demselben Basis-Image einzurichten (Sie können sogar einen Snapshot in einem bereits gestarteten Zustand speichern, obwohl ich nicht sicher bin, wie er mit dem Klonen umgehen wird). Sie können dann die VMs bei Bedarf erstellen, den Code des Benutzers ausführen, die Ergebnisse zurückgeben und dann die VM beenden. Wenn Sie die VMs voneinander und vom Netzwerk isoliert halten, können die Benutzer jedes Chaos anrichten, das sie wollen, und es wird Ihrem physischen Server nicht schaden. Die einzige Gefahr, der Sie sich unter diesen Bedingungen aussetzen, wäre eine Art Exploit, der es ihnen ermöglicht, aus der VM zu entkommen … diese sind äußerst selten und werden seltener, wenn sich die Hardwarevirtualisierung verbessert.

Obwohl es sich noch in der Entwicklung befindet und noch nicht als sicher gilt, können Sie sich die Technologie dahinter ansehen Google Native-Client. Es wurde entwickelt, um die Ausführung von nicht vertrauenswürdigem nativem Code in einem Webbrowser zu ermöglichen, könnte aber wahrscheinlich für die Verwendung auf einem Webserver angepasst werden. Sie können so etwas zusätzlich zu anderen Techniken wie einer virtuellen Maschine für zusätzliche Sicherheit verwenden.

An Fedora 11dort ist der SELinux-Sandbox was genau das zu tun scheint, was Sie wollen (außer vielleicht das Spawnen neuer Prozesse einzuschränken; der verlinkte Blog-Beitrag erwähnt das nicht).

Natürlich besteht immer das Risiko von Kernel-Bugs; selbst bei SELinux sind Teile des Kernels weiterhin allen Prozessen ausgesetzt.

Benutzer-Avatar
Zifre

Sehen diese Seite zu den Sandboxing-Methoden von Google Chrome für Linux. Wie Sie sehen können, gibt es viele Methoden, aber keine davon eignet sich hervorragend für eine verteilbare Anwendung wie Chrome, da einige Distributionen sie möglicherweise nicht enthalten. Dies ist jedoch kein wirkliches Problem für eine Webanwendung, da Sie steuern können, was auf Ihrem Server installiert wird.

Persönlich ist mein Favorit Sekundenkompweil es eine hat sehr geringer Overhead im Vergleich zu anderen Tools wie ptrace (Adressräume einschalten jeder syscall!) oder KVM (große speicherhungrige virtuelle Maschine) und ist im Vergleich zu Tools wie SELinux unglaublich einfach (und daher wahrscheinlicher sicher).

Benutzer-Avatar
Aghoree

ich vermute libsandbox erfüllt deinen Zweck. Seine Kernbibliothek ist für C/C++ geschrieben, hat aber auch einen Wrapper für Python-Programme. Es bietet Optionen zum Anpassen, welche Systemaufrufe zulässig sind, wie viel Speicher verwendet werden kann, wie lange das Gastprogramm ausgeführt werden kann usw. Es wird bereits in einigen Online-Juroren verwendet, z HOJ.

1051630cookie-checkSandboxing unter Linux

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy