我正在編寫一個生成子進程的程序。出於安全原因,我想限制這些進程可以做的事情。我知道程序之外的安全措施,例如chroot
或ulimit
,但我想要做的不僅僅是這些。我想限制子進程完成的系統調用(例如防止調用open()
,fork()
等)。有沒有辦法做到這一點?最理想的情況是阻塞的系統調用應該返回一個錯誤,但如果這是不可能的,那麼殺死該進程也是很好的。防止進程執行某些系統調用
我想這可以做wuth ptrace()
但從手冊頁我真的不明白如何使用它的目的。
我正在編寫一個生成子進程的程序。出於安全原因,我想限制這些進程可以做的事情。我知道程序之外的安全措施,例如chroot
或ulimit
,但我想要做的不僅僅是這些。我想限制子進程完成的系統調用(例如防止調用open()
,fork()
等)。有沒有辦法做到這一點?最理想的情況是阻塞的系統調用應該返回一個錯誤,但如果這是不可能的,那麼殺死該進程也是很好的。防止進程執行某些系統調用
我想這可以做wuth ptrace()
但從手冊頁我真的不明白如何使用它的目的。
如果你想要這樣做ptrace
的方式,你有一些選擇(有些非常簡單)。首先,我建議你按照教程explained here。有了它,您可以瞭解如何知道系統調用被調用的情況,以及基本的ptrace
知識(不用擔心,這是一個非常簡短的教程)。我所知道的選項有以下幾種:
PTRACE_SETREGS
更改寄存器,在其中輸入錯誤的值,並且還可以更改系統調用的返回值(如果需要,也可以使用PTRACE_SETREGS
)。PTRACE_SETREGS
)。請注意,有一些[big警告](http://stackoverflow.com/a/4421762/134633)使用ptrace進行沙盒。 – caf
這聽起來像是SECCOMP_FILTER,在內核版本3.5中添加,就是你所追求的。 libseccomp
library爲此功能提供了一個易於使用的API。
順便說一下,chroot()
和setrlimit()
都是可以在程序中調用的系統調用 - 除了seccomp過濾之外,您可能還想使用其中的一個或兩個。
聽起來不錯,但我使用2.6.32內核。 – petersohn
您可能想SELinux http://en.wikipedia.org/wiki/Security-Enhanced_Linux我不是100%確定,但它應該有一個可編程的API。 –
['prctl(PR_SET_SECCOMP,...)'](http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html)可能是你想要的。儘可能接近「不允許系統調用」。 – Damon
'prctl(PR_SET_SECCOMP,...)'的問題是它也會阻塞'exec()'調用,所以它對我來說是不可用的。 – petersohn