2013-02-01 150 views
2

我正在嘗試在我的項目中使用libsandbox。我能夠在此沙箱中完美地運行c/C++程序。 爲了運行C/C++程序,首先我必須編譯的代碼爲:靜態和動態鏈接沙盒

g++ -lm --static <filename> 2> err.txt 

然後我需要運行sample sandbox program與上述編譯的代碼。

請注意標誌--static,我上面說是相當--static important.The重要性體現在以下兩個計算器回答Link1Link2

現在,我想用這個沙箱對於Java以及Python。 但我不知道gcc/g ++ - 靜態相當於python和java。

請問以下工作?

javac --static <filename> 2> err.txt 

    python --static <filename> 2>err.txt 

我再說一遍,我很困惑,我不知道在Java或Python相當於--static。

謝謝!

+1

作爲一種解釋型語言,Python不會執行任何鏈接,靜態或其他。 – kindall

+1

Java也沒有。所有這些綁定都是在運行時。你能解釋你在做什麼,爲什麼? –

+0

@PeterLawrey:先生,我剛剛編輯了我的問題,以反映--static的重要性。 –

回答

3

可以用libsandbox對Python解釋器進行沙盒處理。您需要處理一些系統調用,比如加載共享庫和導入默認的python模塊。的pysandbox在Python3解釋工作示例可以在理查德·洛布的CodeRunner項目中找到,

https://github.com/trampgeek/CodeRunner

Java有其自己的安全機制。所以沒必要將Java虛擬機包裝在沙箱中。

免責聲明:我是libsandbox的作者。

+1

@ritesh_nitw:它們是用於將警告轉化爲錯誤並顯示所有錯誤的編譯器標誌。你可以在這裏閱讀http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html – uyetch

+0

@ard:謝謝:) –

+0

嗨,在沙箱中運行python仍然是我的一個問題。運行C/C++很簡單,我只需要編寫'python Sample2.py a.out',其中a.out是可執行文件。 但在python中沒有可執行文件。當我在命令行中鍵入'python Sample2.py python userscript.py'時,沙箱不工作.userscript.py是我想在沙箱中運行的用戶程序。在沙盒中沒有適當的文檔來運行用戶python程序。謝謝! –

-2

對於Java,看起來你唯一的選擇是使用靜態綁定到它的JNI包裝器。可能有這樣一個包裝,但如果你可以寫一個。

+0

靜態綁定_what_?你不鏈接到'libsandbox'。 OP詢問靜態鏈接的原因是因爲當您排除任何動態代碼加載時,您可以使用更簡單,更清潔的沙箱,對於C和C++代碼而言,這意味着您必須靜態鏈接所有庫而不是共享。 – abarnert

+0

@abarnert要使用JNI,您必須提供一個DLL或SO。這可以將其他庫靜態綁定到它。 –

+0

是的,但將其他庫靜態綁定到它會有什麼意義?使用沙盒可執行文件的靜態鏈接的全部原因是你可以將'SYS_open'這樣的東西加入黑名單。但是如果你這樣做,JNI就無法工作(而且JVM本身也不會)。 – abarnert

3

我認爲你混淆了兩件事。您的Python程序在libsandbox正在討論的意義上不是可執行文件。可執行文件是Python解釋器。

因此,您無法使用libsandbox沙盒化Python腳本。

可以,但是,沙箱的Python解釋器。您可以使用與其他可執行文件相同的方式來執行此操作。或者:

  • 創建Python解釋器的靜態構建(包含您需要編譯的任何C擴展模塊),然後在沙箱中運行它。這並不容易,但它是可行的,並且Python源代碼樹和其他地方的信息可能會有所幫助。
  • 使用更寬鬆的沙盒,允許標準解釋器完成所需的任何事情(可能包括動態加載擴展模塊,具體取決於您是否需要),但不能再使用它。

無論哪種方式,你會需要一些反覆試驗來找出你可以和不能禁止什麼,以及如何將Python代碼不同位映射到系統調用,依此類推。並且會有一些你無法阻止腳本執行的事情,因爲不需要Python代碼執行的同一個系統調用對於解釋器本身來說是必需的。

對Java有效的情況也是如此。 JVM是可執行文件,而不是你的程序。而且你真的不能靜態鏈接JVM,所以你只有第二種選擇。

當然,除非您使用gcj將Java代碼編譯爲本機代碼而不是JVM代碼。在這種情況下,您實際上使用與gccg++相同的後端,並且您只需使用--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?不知道你的實際用例,我甚至不能猜測這些問題的答案。但是,如果你沒有立即回答所有問題,你就不會完成任何有用的工作。

+1

在我請求你提供幾條建議之前,讓我說點什麼。 無論何時我試圖編譯程序(我想在沙箱中運行)而沒有「--static」,沙箱都不起作用。因此,再次 - 靜止是非常關鍵的,,這超出了我的理解。 我在腦海中有兩個問題: (a)對於java和python,如果我編譯爲w/o「--static」,沙盒將工作(b)同一個開發人員有一個名爲pysandbox的沙箱http:/ /openjudge.net/~liuyu/Project/LibSandbox。因此,爲了在沙箱中運行python代碼,pysandbox更容易嗎? 謝謝! –

+0

...如果你不明白爲什麼你需要'--static'開頭,也許你應該先弄清楚。 – kindall

+0

@ kindall:是的,我同意。但說實話,我已經提到過,我對靜態的思路並不清楚。我已經發布了兩個鏈接在stackoverflow,我從哪裏學到了它在沙箱中的重要性。 –