2012-11-12 54 views
9

我正在編寫一個生成子進程的程序。出於安全原因,我想限制這些進程可以做的事情。我知道程序之外的安全措施,例如chrootulimit,但我想要做的不僅僅是這些。我想限制子進程完成的系統調用(例如防止調用open(),fork()等)。有沒有辦法做到這一點?最理想的情況是阻塞的系統調用應該返回一個錯誤,但如果這是不可能的,那麼殺死該進程也是很好的。防止進程執行某些系統調用

我想這可以做wuth ptrace()但從手冊頁我真的不明白如何使用它的目的。

+3

您可能想SELinux http://en.wikipedia.org/wiki/Security-Enhanced_Linux我不是100%確定,但它應該有一個可編程的API。 –

+4

['prctl(PR_SET_SECCOMP,...)'](http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html)可能是你想要的。儘可能接近「不允許系統調用」。 – Damon

+1

'prctl(PR_SET_SECCOMP,...)'的問題是它也會阻塞'exec()'調用,所以它對我來說是不可用的。 – petersohn

回答

5

如果你想要這樣做ptrace的方式,你有一些選擇(有些非常簡單)。首先,我建議你按照教程explained here。有了它,您可以瞭解如何知道系統調用被調用的情況,以及基本的ptrace知識(不用擔心,這是一個非常簡短的教程)。我所知道的選項有以下幾種:

  • 最簡單的就是殺死孩子,那就是this exact code here
  • 其次,你可以讓孩子失敗,只需通過PTRACE_SETREGS更改寄存器,在其中輸入錯誤的值,並且還可以更改系統調用的返回值(如果需要,也可以使用PTRACE_SETREGS)。
  • 最後你可以跳過系統調用。但爲此,您應該知道系統調用呼叫後的地址,然後將該指令寄存器指向該地址並將其設置(再次使用PTRACE_SETREGS)。
+2

請注意,有一些[big警告](http://stackoverflow.com/a/4421762/134633)使用ptrace進行沙盒。 – caf

6

這聽起來像是SECCOMP_FILTER,在內核版本3.5中添加,就是你所追求的。 libseccomp library爲此功能提供了一個易於使用的API。

順便說一下,chroot()setrlimit()都是可以在程序中調用的系統調用 - 除了seccomp過濾之外,您可能還想使用其中的一個或兩個。

+0

聽起來不錯,但我使用2.6.32內核。 – petersohn