2008-10-03 35 views
13

我想能夠運行不可信的ruby代碼。我希望能夠將變量傳遞給它可能使用的不可信代碼。我也想讓代碼將結果返回給我。這裏是一個概念性的例子,我在想什麼如何在安全沙箱內運行不受信任的Ruby代碼?

input = "sweet" 
output = nil 
Thread.start { 
    $SAFE = 4 
    #... untrusted code goes here, it uses the input variable(s) 
    #to calculate some result that it places in the output variable 
} 
#parse the output variable as a string. 

只是爲了澄清,我基本上使用不受信任的代碼作爲函數。我想 提供它的一些輸入,然後讓它寫入輸出。這就是我真正想要的,我不在乎它是如何完成的,我只是希望能夠使用不可信的Ruby代碼作爲一種功能。該解決方案不必看起來像我上面寫的代碼,我只是用它來說明我想要的。

現在,我可以認爲目前的3種方法可以做到這一點:

  1. 使用$ SAFE級別的結構之上。
  2. whytheluckystiff有一個紅寶石沙盒插件
  3. 我可以在自己的虛擬機上運行每個功能,使用某種類型的os虛擬化軟件,如vmware或Xen等。

我想知道是否有人有任何建議運行不可信的Ruby代碼的功能方式?你會推薦什麼樣的選擇?你會怎麼做呢?謝謝。

回答

12

$ SAFE是不夠的;你至少需要達到Why's freaky sandbox的水平。但是,我不知道沙箱代碼是否被主動維護,或者他/他們是否曾經解決過諸如無限循環等漏洞。

不安全通常意味着敵對。如果你可以從敵對的環境中放鬆一下,比如說'天真',並且根據你的應用的需求,你可能會放棄在Ruby中使用沙盒。這不是語言設計中的一流場景。

儘管如此,你可能不需要去分離的機器級別。在單獨產生的過程中使用沙箱,我感覺非常安全,您的應用程序可以作爲流程管理器來阻止任何設置掛起/熄滅的任務。現在,這比您上面的簡單模塊多幾個數量級的工作。

但請記住並不斷重複,「外管局不能對付敵意」。

+3

有沒有人有任何解釋$ SAFE有問題的參考? – sheldonh 2011-12-19 15:28:52

3

我強烈建議只使用JRuby。

JVM從一開始就內置了一個非常強大的安全模型,而JRuby從中掏腰包。您可以限制對文件的訪問,限制代碼的加載等等。它比好於本地Ruby impls中存在的任何東西,並且有許多站點在JRuby上運行沙箱,用戶可訪問的站點就是爲了這個目的。

+0

+1,但爲了記錄,JRuby目前沒有完全實現`$ SAFE`,是嗎? – 2012-03-20 21:57:41

3

$SAFE不能保護您免受惡意黑客可以做的一切事情。

沿着這條道路走下去了(參見Ruby: creating a sandboxed eval?),我遵循了評論者的忠告,並嵌入了一個特定於應用程序的解釋器,它完全控制了可以做什麼和不可以做什麼(請參閱Ruby: looking for ruby-embeddable interpreter or scripting language)。

它竟然是用粘貼非常容易(像不到一個小時從網上下載的寶石定製解釋器) - 見https://github.com/jcoglan/stickup

1

我創建了一個名爲「信任的沙箱」寶石運行Ruby代碼在一個完全控制的Docker容器內。您可以禁用網絡,設置磁盤配額,限制執行時間,與其他正在運行的容器平衡CPU,設置內存限制等。開銷相當低。

你可以閱讀更多關於它在這裏: https://github.com/vaharoni/trusted-sandbox

讓我知道你在想什麼!

相關問題