2010-12-11 36 views
6

我正在查看codepad.org,並且一會兒(1)fork給出以下輸出。如何在沙箱環境中運行程序時禁止系統調用?

不允許的系統調用:SYS_fork

檢查此鏈接以查看詳細信息。 http://codepad.org/rNR9mMVv

谷歌搜索更多,我知道他們也使用套接字禁用系統調用。

不允許的系統調用:SYS_socketcall

誰能告訴我如何可以禁用某些系統在沙盒環境中運行該程序前調用?

+0

我認爲這將是一個內核級別的問題,而不是特定於C++或任何其他本機二進制文件。除非有一個可以在非本地環境中運行代碼的C++解釋器? – JOTN 2010-12-15 23:45:45

回答

1

通過用具有空存根或異常拋出函數而不是實函數的模擬替換運行時庫?

+0

但是不會禁用這些功能的實際功能。例如,如果我替換fork()的運行時時間庫,並且如果我想分叉我的代碼,但禁用其他人提交的代碼中的分叉,此方法仍然可行嗎?如果是,那麼請讓我知道如何..謝謝。 – sp2hari 2010-12-11 11:37:35

+0

我只是假設,我想對於正確的實現,你必須創建一些沙箱環境,所以你會讓你的運行時複製 - 一個是真實的,一個是影子。 – 2010-12-11 16:17:42

+2

不起作用。有些人可以使用內聯彙編來直接訪問系統調用網關。 – Joshua 2010-12-15 23:37:51

1

如果您願意支付性能損失,則可以使用ptrace()。還有另外一種我現在無法找到的方式。

0

系統調用的工作方式是將操作系統注入進程。但是,如果您爲自己喜歡的可執行格式編寫了自定義加載程序,則可以將其與自己的加密鏈接進行鏈接。如果格式允許,您也可以對可執行文件進行二進制更改,以從您提供的單獨動態庫中提取這些函數。

0

我知道這是一個老問題,但我正在研究相同的東西,所以這裏是我的建議 - 使用SELinux。關於SELinux,Gentoo項目有一些nice stuff。看看SELinux Policy Types(4.b),特別針對政策。我不確定codepad.org,但類似的ideone.com使用Gentoo,所以也許SELinux應該是最簡單的方法。