2012-11-12 3 views
9

Ich schreibe ein Programm, das untergeordnete Prozesse hervorbringt. Aus Sicherheitsgründen möchte ich beschränken, was diese Prozesse tun können. Ich kenne Sicherheitsmaßnahmen von außerhalb des Programms wie chroot oder ulimit, aber ich möchte etwas mehr als das tun. Ich möchte die Systemaufrufe begrenzen, die vom Kindprozess erledigt werden (zum Beispiel verhindern, Anrufe an open(), fork() und solche Dinge). Gibt es eine Möglichkeit, das zu tun? Im Optimalfall sollten die blockierten Systemaufrufe mit einem Fehler zurückkommen, aber wenn das nicht möglich ist, dann ist es auch gut, den Prozess zu beenden.Verhindern, dass Prozesse bestimmte Systemaufrufe ausführen

Ich denke, es kann mit ptrace() getan werden, aber von der man-Seite verstehe ich nicht wirklich, wie man es für diesen Zweck verwendet.

+3

Sie wahrscheinlich wollen SELinux http://en.wikipedia.org/wiki/Security-Enhanced_Linux Ich bin nicht 100% sicher, aber es sollte eine programmierbare API haben. –

+4

['prctl (PR_SET_SECCOMP, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html) kann sein, was Sie wollen. Das ist so nah wie möglich, um "syscalls" nicht zu erlauben. – Damon

+1

Das Problem mit 'prctl (PR_SET_SECCOMP, ...)' ist, dass es auch den 'exec()' Aufruf blockiert, so dass es für mich unbrauchbar ist. – petersohn

Antwort

5

Wenn Sie es die ptrace Weise tun möchten, haben Sie einige Optionen (und einige sind wirklich einfach). Zunächst empfehle ich Ihnen, das Tutorial explained here zu folgen. Mit ihm können Sie lernen, wie Systemaufrufe aufgerufen werden, und auch das grundlegende Wissen ptrace (keine Sorge, es ist ein sehr kurzes Tutorial). Die Optionen (die ich kenne) Sie haben, sind die folgenden:

  • Die einfachste, das Kind zu töten wäre, das heißt this exact code here.
  • Zweitens können Sie das Kind zum Scheitern bringen, indem Sie einfach die Register mit PTRACE_SETREGS ändern, falsche Werte eingeben und den Rückgabewert des Systemaufrufs ändern, wenn Sie möchten (wiederum mit PTRACE_SETREGS).
  • Schließlich könnten Sie den Systemaufruf überspringen. Aber dafür sollten Sie die Adresse nach dem Systemaufruf kennen, das dortige Intruction-Register dorthin setzen und einstellen (wieder mit PTRACE_SETREGS).
+2

Beachten Sie, dass es einige [große Vorbehalte] (http://stackoverflow.com/a/4421762/134633) gibt, die ptrace für das Sandboxing verwenden. – caf

6

Es klingt wie SECCOMP_FILTER, in Kernel-Version 3.5 hinzugefügt, ist was Sie suchen. Die libseccomp library bietet eine einfach zu bedienende API für diese Funktionalität.

Übrigens sind das chroot() und setrlimit() beide Systemaufrufe, die in Ihrem Programm aufgerufen werden können - Sie möchten wahrscheinlich eines oder beide zusätzlich zum seccomp-Filter verwenden.

+0

Klingt gut, aber ich benutze 2.6.32 Kernel. – petersohn