2009-10-12 119 views
2

場景:運行在像Java或Python這樣的字節碼虛擬機中的程序想要評估(通過編譯運行中的字節碼然後運行)一個函數,該函數的代碼是由外部自動生成或提供的。細粒度沙盒

棘手的問題是函數的代碼是不可信的 - 它可能是由遺傳編程等隨機方法產生的,甚至是由對手提供的。因此需要強制執行它作爲純函數 - 它可以返回一個值,但它可能沒有任何副作用,即它可能不會以任何方式更改程序的任何現有數據。

另一個棘手的問題是該函數可能需要調用某些程序的現有函數;其中一些功能可能有副作用,但只要被嫌疑功能調用,這些功能應該被阻止實際發生持久效果。

此外,優選的是不對可疑功能的編碼風格施加約束,例如,它可以自由地對它自己創建的任何數據結構執行破壞性更新,只需要它的整體效果是純粹的功能。

此外,優選該解決方案具有合理的低開銷,因爲這可能需要進行數十億次;例如,避免爲每個這樣的功能分配一個全新的虛擬機會更好。

這不一定非得在現有的虛擬機如Java或Python中可行;如果有必要圍繞這個用例設計一個虛擬機,那就這樣吧。

這個問題是否有任何已知的解決方案(或非解決方案,即已知不可行的解決方案)?

回答

1

我和其他許多人之前已經爲遺傳編程目的構建了語言。如果構建新的語言是一種選擇,那麼這種解決方案已經存在。由於有自動生成函數的技巧,所以提供函數庫應該是微不足道的。這個系統實際上構成了一個沙盒環境。這些功能的任何副作用將被限制在程序可訪問的空間。

1

我想象沙盒是你唯一的選擇。試圖分析程序並確定它是否安全是一個相當於暫停的問題。 CLR具有內置的安全性,允許這樣的限制,我想Java也有類似的限制。我不認爲Python會。

1

那麼,一般問題似乎是無法解決的:沒有一種終止策略來排序固有狀態計算從可能的無狀態。除非字節碼是特別構造來提供克服這種需要的強類型約束,否則你將會丟失。 Curien已經寫了很多關於什麼樣的事情可以和從黑匣子觀察無法推斷。

但是,如果您願意向您的功能提供商提出更多要求,則問題是請求提供證明代碼(PCC)作爲答案。我猜你知道Necula的工作,他特別關心確保彙編代碼遵守內存使用的限制,比如不篡改超出範圍的狀態;您可能並不知道在相當常見的情況下自動推理證據所做的工作:可能是PCC比您想象的更容易。