2010-12-10 3 views
9

Ich erwäge mehrere Optionen für das Sandboxing eines Linux-Prozesses. Die Verwendung von clone() mit CLONE_NEWNET (usw.) ist eine der Optionen. CLONE_NEWNET stellt sicher, dass der Sandkastenprozess keine echten Netzwerkverbindungen herstellen oder akzeptieren kann. Aber ich möchte Sockets vollständig für diesen Prozess deaktivieren, sogar an einen beliebigen Port auf 0.0.0.0 und binden an einen Unix-Doman-Socket (auch anonym). Ich möchte dies tun, um zu verhindern, dass der Prozess zu viele Kernel-Ressourcen verwendet, indem er an Tausende von Ports bindet. Wie mache ich das?Wie kann die Socket-Erstellung für einen Linux-Prozess für Sandboxing deaktiviert werden?

Im Allgemeinen bin ich an vielen Sandboxing-Ansätzen interessiert (dh solche, die vom Linux-Kernel bereitgestellt werden und denen von ptrace() erzwungen), aber in dieser Frage interessiert mich nur der Socket-Erstellungsaspekt der Sandboxing-Ansätze (so Wenn Sie einen Sandbox-Ansatz vorschlagen, erklären Sie bitte auch, wie man die Socket-Erstellung verhindert. Ich bin nicht an Ansätzen interessiert, die ein Kernel-Patching benötigen oder ein Kernel-Modul laden, das nicht Teil des Standard-Binary-Kernel-Pakets von Ubuntu ist oder was jeden Prozess auf dem System beeinflussen würde.

+2

ähnlicher Qs auf Sandbox/jailing Prozesse in Linux oder Unix: * http://unix.stackexchange.com/q/6433/4319 * http://stackoverflow.com/q/3859710/94687 * http://stackoverflow.com/q/4249063/94687 * http://stackoverflow.com/q/1019707/94687 –

Antwort

8

ptrace scheint die naheliegendste Werkzeug zu sein, aber davon abgesehen, dass ...

util-linux [-ng] hat einen Befehl unshare, die die clone/unshare Schnittstellen des Kernels verwendet. Wenn Sie den neuen Prozess über (oder clone(CLONE_NEWNET)) ausführen, befinden sich alle Netzwerk-Sockets, die er erstellt, in einem anderen Namespace. Das Problem der Kernel-Ressource wird dadurch nicht gelöst, aber der Prozess wird in eine Sandbox umgewandelt.

Der Linux-Kernel unterstützt auch seccomp, ein Modus mit prctl(PR_SET_SECCOMP, 1) eingegeben, die den Prozess verhindert (gut, Faden, wirklich) vom Aufruf keine syscalls außer read, write, exit und sigreturn. Es ist eine ziemlich effektive Sandbox, aber schwierig mit unmodifiziertem Code zu verwenden.

Sie können eine SELinux-Domäne definieren, die socket/bind/etc nicht zulässt. ruft auf und führt einen dynamischen Übergang in diesen Typ aus. Dies erfordert (offensichtlich) ein System mit einer aktiv durchsetzenden SELinux-Richtlinie. (Möglicherweise ähnliche Dinge sind möglich mit AppArmor und Tomoyo, aber ich bin nicht sehr vertraut mit einem von ihnen.)

+1

Vielen Dank für das Erstellen einer so umfassenden Liste. Ich habe deine Antwort akzeptiert. Ich habe AppArmor ausprobiert und kann bestätigen, dass dies die Socket-Erstellung verhindern kann. Ich habe bereits 'CLONE_NEWNET' in der Frage erwähnt (und warum es keine Lösung ist). seccomp ist keine gute Antwort auf meine Frage, weil es mehr einschränkt (z. B. fork()) als das, was ich möchte. – pts

4

Werfen Sie einen Blick auf systrace - nicht auf Sockets beschränkt, aber eine generische Syscall Policy Generator/Enforcer. Quote:

GNU/Linux-Port ist fertig und Kernel-Patch wird aktiv von Marius Eriksen gepflegt. Kann ohne Kernel-Änderungen mit dem Ptrace-Backend ausgeführt werden.

Disclamer - Ich habe es nie unter Linux versucht.

+1

Vielen Dank für die Erwähnung von Systrace. Ich habe es mir unter Linux i386 angeschaut und es sieht in Sachen Features leistungsfähig aus: Es kann die Socket-Erstellung verhindern und vieles mehr. Ich hatte ungefähr fünf kleine Probleme, es zu kompilieren, aber sobald das getan war, schien es Sandboxing für einfache Programme zu funktionieren, aber ich konnte GCC, das GNU als (1) mit systrace aufruft, nicht sandboxieren: Systrace blieb unbestimmt in einem wait4-Systemaufruf hängen. Außerdem wird es seit 2 Jahren nicht gepflegt. Also habe ich es aufgegeben. da ein früherer wait4 bugreport unbeantwortet war: http://forum.soft32.com/linux/strace-wait4-pending-SIGALRM-ftopict484715.html – pts

+0

FYI Ich habe deine Antwort gewählt, aber seit systrace ist nicht stabil für mich Ich kann diese Antwort nicht akzeptieren. – pts

2

Probieren Sie seccomp aus (siehe die prctl man-Seite), es kann Ihren Prozess darauf beschränken, nur auf die Sockets zuzugreifen, die zum Zeitpunkt des Aufrufs von prctl geöffnet waren.

+1

Ich kenne seccomp, aber das ist keine gute Antwort auf meine Frage, weil es mehr einschränkt (z. B. fork()) als was ich will. – pts

+1

Punkte: Ich stimme zu. Tangential, deshalb sollte Seccomp2 in Mainline Linux akzeptiert worden sein, anstatt überhöhnt zu werden. –

+0

Woher kommt diese seccomp2? Link zum Mailinglistenarchiv mit dem Beitrag? – user562374

2

Sie könnten mit „sydbox“ Sandbox oder „pinktrace“ Bibliothek interessieren:

+1

Danke für die Erwähnung dieser beiden. Ich habe sie früh verworfen, weil sie schrecklich unterdokumentiert sind. Vielleicht werden sie sich in Zukunft verbessern. – pts

+1

Ich hatte am Anfang dasselbe Gefühl. Zum Glück habe ich mich dafür entschieden, Quellen zu lesen und auf Mailinglisten zu posten. Ich habe festgestellt, dass dieses Projekt interessant aussieht und schließlich ist es nicht so klein, dass es sich beim Betteln anfühlt und bietet viele Möglichkeiten zum komfortablen "Filtern" von Systemanrufen - auf flexible Weise! :) –

+2

In meiner Workload (läuft g ++) war die sydbox 50% langsamer als Linux im User-Modus, also bleibe ich jetzt im User-Mode Linux, weil ich damit nicht nur Sandboxing, sondern auch die Bruttomemory-Nutzung limitieren kann. – pts

2

Wenn Ihr Hauptziel darin besteht, die Anzahl der Sockets zu begrenzen, die von einem gutartigen Prozess P für gutartige Eingänge geöffnet werden, dann wird setrlimit(RLIMIT_NOFILE, ...) ungefähr das tun, was Sie wollen.Wenn P als bösartig und nicht als gutartig angesehen wird oder wenn Sie eine starke Gewissheit darüber suchen, wie P sich angesichts potentiell bösartiger Eingaben verhalten wird, dann haben Sie wahrscheinlich kein Glück: dh bei Am besten, mit den heute verfügbaren Tools können Sie einen Hindernislauf für Angreifer schaffen.

(aber sagte, dass, wenn ein Hindernis-Parcours für Sie arbeitet, dann könnten Sie ein paar mehr gute Ideen erhalten, indem um hier bei sandboxing.org Stossen oder indem Sie Ihre Fragen an den freundlich Leute auf [email protected] senden.)

Verwandte Themen