2010-02-14 91 views
15

我是Robocode引擎的開發者。我們想讓Robocode 多語言和斯卡拉似乎是很好的匹配。我們有Scala插件prototype herescala運行時的安全性

問題: 因爲用戶有創意的程序員,他們可能會試圖贏得戰鬥 不同的方式。以及機器人從在線數據庫 下載,任何人都可以上傳一個。所以安全漏洞可能導致安全漏洞進入用戶計算機。用Java編寫的機器人在 受限制的沙箱中運行。幾乎所有東西都被禁止[網絡,圖形用戶界面, 磁盤(有限),線程(有限),類加載器和反射]。 沙盒與瀏覽器小程序類似。我們使用安全管理器,每個機器人定製的ClassLoader ,etc ...

有兩種方法如何承載斯卡拉運行時的Robocode:

1)與機器人一起加載沙箱裏面。對我們來說很安全, 首選解決方案。但是它會損害Scala運行時能力,因爲運行時使用反射。也許在運行時生成類?使用線程做一些內部清理?訪問JVM /內部? (我不想限制語言的能力)

2)使用Scala運行時作爲可信代碼,在框外,安全級別爲 與JDK相同。對(惡意的)機器人的可見性 。 Scala運行時API是否安全?做的方法他們有安全 警衛?有沒有安全模式?在Scala運行時有沒有任何單例, 可能被濫用在機器人之間進行通信?任何可以模擬線程的協調/線程池/消息傳遞? (對於Scala運行時是否有任何安全審計?)

3)之間有些東西,某些類的運行時在進出。機器人/哪些類/包必須可見/哪些只是私有實現? (這似乎是未來的解決方案)

問題: 是否有可能枚舉和分離,必須從其他 值得信賴的運行範圍內運行的部分? 特定的包和類?或更好的主意?

我正在尋找特定的答案,這將導致安全的解決方案。隨機的想法歡迎,但不是獲獎。目前正在進行的討論在scala email group。還沒有具體的答案。

回答

3

我認爲#1是你最好的選擇,即使這是一個移動的目標。正如郵件列表中提到的那樣,結構類型使用反射。我不認爲結構類型在標準庫中很常見,但我認爲任何人都不會追蹤它們的位置。

在幕後還有其他使用反射的功能。例如,在2.8分支中一段時間​​,一些數組功能正在使用反射。我認爲這是基準測試後發生的變化,但總有可能出現一些問題,有人說:「啊哈,我會用反射來解決這個問題。」

斯卡拉標準庫中充滿了單身人士。它們大多數是不可變的,但我知道actors庫中的Scheduler對象可能會被濫用於通信,因爲它本質上是實際調度程序的代理,因此您可以將自己的自定義調度程序插入其中。

此時我不認爲Scala需要使用自定義類加載器,並且它的所有類都是在編譯時生成的,而不是運行時生成的,但是這又可能是一個移動目標。 Scala會生成很多類文件,並且總會談論如何在運行時生成其中的一些文件,而不是在編譯時。因此,簡而言之,我認爲不可能(在努力的合理限制之內)列舉和隔離可以(也應該)可信的Scala碎片。

+0

鏈接到關於反射和數組的線索:http://thread.gmane.org/gmane.comp.lang.scala.internals/2590 – 2010-02-14 23:21:09

+1

這裏有幾個好處。關於移動目標,對,我很樂意鎖定單一版本的scala。關於「啊哈!我會用反思來解決這個問題。」這是犯罪行爲。我不希望看到我的用戶/新手向我們的支持小組抱怨我們沒有擁有的運行時間損壞。我不清楚運行時是否至少將異常包裝/轉換爲某種一致的異常。至少AccessController.doPrivileged()這樣的行動? – 2010-02-15 20:31:23

+1

你必須考慮市場的Scala目標。在Java Web框架和基於JVM的動態語言中,反射幾乎是無處不在的。與運行時字節碼操作相比,它相當小,這也很常見。 另外請記住,反射的使用不一定侷限於運行時或庫本身,而是編譯器只是在正常用戶代碼內發出調用。 我無法在Scala源代碼中找到AccessController的單個實例,所以我不認爲它完全意識到這樣的事情。 – 2010-02-16 03:28:31

0

正如你所提到的其他J *語言實現都可以使用反射,只要反射不是遊戲的一部分,就會禁止所有這些語言。 我想這將是JVM的問題,不能有一種方法來劃分反射API的範圍,這樣你就可以對「沙箱」中可以反映的部分代碼進行排序。

+0

是的,我想你應該和GAE的評論類似。 – 2010-02-25 21:43:17

+0

我以爲我在寫評論,但實際上我沒有權利評論他人發佈的答案。 – itsnotvalid 2010-03-03 17:38:52