我認爲你混淆了兩件事。您的Python程序在libsandbox
正在討論的意義上不是可執行文件。可執行文件是Python解釋器。
因此,您無法使用libsandbox
沙盒化Python腳本。
你可以,但是,沙箱的Python解釋器。您可以使用與其他可執行文件相同的方式來執行此操作。或者:
- 創建Python解釋器的靜態構建(包含您需要編譯的任何C擴展模塊),然後在沙箱中運行它。這並不容易,但它是可行的,並且Python源代碼樹和其他地方的信息可能會有所幫助。
- 使用更寬鬆的沙盒,允許標準解釋器完成所需的任何事情(可能包括動態加載擴展模塊,具體取決於您是否需要),但不能再使用它。
無論哪種方式,你會需要一些反覆試驗來找出你可以和不能禁止什麼,以及如何將Python代碼不同位映射到系統調用,依此類推。並且會有一些你無法阻止腳本執行的事情,因爲不需要Python代碼執行的同一個系統調用對於解釋器本身來說是必需的。
對Java有效的情況也是如此。 JVM是可執行文件,而不是你的程序。而且你真的不能靜態鏈接JVM,所以你只有第二種選擇。
當然,除非您使用gcj
將Java代碼編譯爲本機代碼而不是JVM代碼。在這種情況下,您實際上使用與gcc
和g++
相同的後端,並且您只需使用--static
以確保libgcj
和其他所有內容都獲得靜態鏈接。你可能仍然遇到問題,因爲libgcj
在覆蓋範圍內比libc
做得更多...但是這個概念與C代碼相同。 (JVM本身有自己的訪問模型,你可能可以用類加載器中的反射來構建一些東西,以便在Java API級別上而不是在Linux系統調用API上對沙盒程序進行處理。我不知道這樣的事情已經存在)
每當我試圖編譯程序(我想在沙箱中運行),而「--static」沙箱沒有work.So,再 - 靜止是非常關鍵的,這是超出我的知識。
很可能,您的實際代碼不會打開任何文件,因此您使用的是禁用打開文件的默認沙盒設置。但是,如果你動態地鏈接你的程序,它必須打開.so
文件來鏈接它們 - 這是行不通的,因爲你的沙盒被配置爲禁止它。
如果您靜態鏈接相同的程序,問題就會消失,因爲它不再需要打開任何.so
s來運行。簡而言之,就是沙盒靜態鏈接的關鍵。你甚至在你的問題的評論中解釋了這一點,所以我無法想象你怎麼理解它,除非你甚至不明白你爲什麼要禁止SYS_open
以及這意味着什麼。
(a)對於Java和Python,將沙箱的工作,如果我編譯的w/o 「--static」
是,沙箱會工作得很好。這意味着,如果您使用默認配置,它將禁止您打開文件。這意味着您的Java或Python程序將失敗,因爲VM /解釋器必須打開(以及其他方式)您的程序才能運行它。
即使靜態鏈接解釋器或JVM也無濟於事。你必須得到你的程序的靜態鏈接到可執行文件的實際字節碼。這不是不可能的,但可能遠遠超出了你想要考慮的任何事情。
正確的做法是弄清楚你試圖禁止什麼系統調用,以及爲什麼,並適當配置沙箱。默認配置不適用於您。
(B)有一個由同一個開發商openjudge.net/~liuyu/Project/LibSandbox稱爲pysandbox沙箱
pysandbox
僅僅是一個配置和啓動一個沙盤更簡單的方法。你不要在你的沙盒代碼中使用它。 (有一個不同pysandbox
通過在Python中的沙箱代碼另一家開發商。這可能是對你有用,但它是不一樣的事,作爲一個系統調用沙箱。)
在這一點上,我不確定你甚至不知道你在做什麼。爲什麼你想在第一個地方使用你的代碼?你知道你的代碼需要什麼樣的訪問來完成它需要做的事嗎?如果你知道你想要做什麼,你確定系統級的沙箱是正確的級別來執行它,而不是像RestrictedPython
?不知道你的實際用例,我甚至不能猜測這些問題的答案。但是,如果你沒有立即回答所有問題,你就不會完成任何有用的工作。
作爲一種解釋型語言,Python不會執行任何鏈接,靜態或其他。 – kindall
Java也沒有。所有這些綁定都是在運行時。你能解釋你在做什麼,爲什麼? –
@PeterLawrey:先生,我剛剛編輯了我的問題,以反映--static的重要性。 –