2011-03-01 59 views
7

我正忙着構建在線C#解釋器,有點像Codepad。現在有明顯的安全問題:在線c#解釋器安全問題

  • 無限循環
  • System.Diagnostics.Process.Start
  • 差不多整個System.IO命名空間

我的C#的知識是不完全無關緊要,但我確信有很多知道更多的東西,加上我沒有想到的東西。你會注意什麼?

一些精度,我打算在使用Mono的小型Linux VPS上運行這個精度。

+0

我知道這個問題的性質可能不是很StackExchange十歲上下,所以我想我會接受最完整的答案。 – 2011-03-01 23:32:38

+0

它是否與Java具有基本相同的安全機制? – 2011-03-01 23:50:33

+0

你完成了你的翻譯? – Shimmy 2011-12-22 10:58:17

回答

4

使用Mono的Compiler as service功能。它可以編譯爲兼容Silverlight的DLL(客戶端配置文件),並且has been已經可以,您可以checkout。這應該解決您對IO的一些擔憂。

+0

+1:這聽起來像是要走的路,因爲微軟已經完成了在DLL本身內定義安全風險的工作。之後,您只需關注誤用問題(例如,使用您的服務進行DOS攻擊的用戶)。 – StriplingWarrior 2011-03-01 23:56:54

+0

這不需要客戶端安裝Silverlight嗎? – DotnetDude 2011-03-02 15:42:26

+0

@DotNetDude:在Runcs示例中,silvelight是必需的 - 但如果您在服務器上運行Mono.CSharp DLL,則它只是需要安裝.NET的服務器。 (客戶端配置文件只需要.NET,而不是silverlight)。 – 2011-03-03 08:35:32

1

由於你可以從GetType()去Assembly幾乎任何你想要的東西,所以想到了思考。

+1

IMO,反射正是你想要避免的,因爲它允許你執行(可能)任意代碼,而不是你想爲了安全目的而強制執行的受限子集。 – 2011-03-01 23:52:29

1

其實用戶代碼可以做任何事情。這將是很難處理的特殊情況。在我看來,最好的辦法是:

a)create sandbox appdomain只有執行權限。這確保了許多事情,如無法混淆文件系統或調用本地庫。

b)創建新的流程並在其中啓動您的appdomain。

然後監控內存和CPU消耗的過程。如果出現任何問題 - 殺死它。請注意,這是您可以殺死的進程,而不是appdomain。使用appdomain你可以嘗試卸載它,但是如果惡意代碼在finally子句中運行,那麼它將無法工作。

還有一些(知我)問題與此:

  • 小心你把用戶編譯的程序集。實際上,即使是權限最小的appdomain用戶代碼也能夠加載處於同一目錄中的程序集並執行它們。
  • 我提到你應該監視進程嚴密。在無限循環中產生線程的代碼(在finally子句中運行),其中每個線程執行相同的操作都會非常快地捕獲內存(在我的觀察中)。如果攻擊者決定用這樣的代碼進行攻擊 - 誰知道會發生什麼:)也許一種利用這種方式的方法是以低優先級啓動用戶進程,以便監督線程有機會在加載的系統中進行適當的監視。

無論如何總有一種風險。我當時也在想這個想法,下面是當前結果:rundotnet

1

查看此鏈接,您將能夠了解在線C#解釋器的一些內容,嘗試一些內容並閱讀輸出異常以瞭解如何他們做到了。

http://rextester.com/NWDF62346