2012-07-06 40 views
7

我目前正在爲我的學士論文開發一個非常模塊化和基於插件的框架。主要思想是,在我的應用程序結構中有一個名爲plugins的文件夾,您可以在其中插入符合特殊界面IPlugin的編譯插件(例如.dll -files)。應用程序然後使用用戶選擇的插件執行任務。所以,如果我想在PDF文件中執行一次任務,我會選擇PdfPlugin,並且一旦在一個word文檔中,我會選擇DocPlugin來完成這項工作。如何防止插件執行有害代碼

輸出也在接口中定義,因此每個插件都返回相同的數據結構。每個圖書館的實際工作都不相同。

現在,由於應用程序只是調用界面中定義的方法,例如ParseDocument()等等,我該如何防止插件(可能由第三方開發)執行有害代碼?

我正在研究.NET3.5(也許會切換到4,尚未決定)和C#。

回答

8

我在.NET3.5

工作在這種情況下,我將分離你的插件在單獨AppDomain運行,使用Code Access Security和限制權限集的應用程序域的。這個「沙箱」你的插件程序集。

例如,您可以取走所有非託管代碼權限和文件IO權限,然後您的插件永遠無法寫入文件系統。

這不適合心靈的隱隱。 AppDomain可能會很棘手,需要序列化,對象生存期策略等。您可以使用MAF,因爲它會帶走很多管道。

+0

是否可以查詢一個插件,以獲取它想要的代碼訪問安全性權限?與Android上的意圖相比?即我可能需要一個插件框架,它允許我確定插件要求的權限,所以我可以在加載插件之前提示用戶進行確認。或者反過來,我在我的應用程序中強制執行權限,然後如果插件嘗試在允許的權限之外執行某些操作,則該插件只會失敗/拋出異常? – AaronLS 2013-05-02 18:29:24

+0

不要求「如何」,因爲這是超出問題範圍的,但是很好奇這兩種不同方法中的哪一種適用於CAS。 – AaronLS 2013-05-02 18:32:30

0

我知道這方面的研究很多。一種工作方法是檢查IL代碼並查找禁止的方法簽名。然後你可以將它們重定向到一個錯誤鉤子,這將停止插件vom執行進一步的代碼。

一個應用是例如增加了智能手機的安全性,您可以從下載的應用程序中檢查IL代碼,以訪問GPS模塊,相機,麥克風......。安全應用程序可以修補這些訪問方法並詢問用戶應用程序是否應該真正允許啓用麥克風。

使用.NET,您可以使用像Mono.Cecil這樣的IL閱讀器來檢查IL代碼是否有害簽名。但是總會有解決方法,因爲您仍然可以動態生成代碼或將代碼存儲爲資源並在資源的rumtime中加載它。對於概念證明來說,這種方法很容易實現。

你甚至可以編寫FXCop規則,並使用它來靜態檢查禁止方法調用的插件。

+2

「一種工作方法是檢查IL代碼並查找禁止的方法簽名」ick。怎麼樣通過動態調度進行方法調用,如DLR,反射等? – vcsjones 2012-07-06 14:12:23

+0

我不是說我這樣做過。我所做的只是說研究人員做了這件事,並獲得了一些新聞回聲(智能手機安全性很好)。我想他們並不像平均的Stackoverflow訪問者那樣是核心開發者。也許他們應該問過他們的想法是否是一個好主意。 – 2012-07-06 14:20:37

-2

你不能。

DLL是以調用程序的權限執行的二進制代碼。當調用DLL中的方法時,您無法控制它的功能。

當你想限制插件可以做什麼時,你必須將執行移到你的主程序。做到這一點的一個好方法是使用腳本語言實現插件,該腳本語言由程序解析並執行,而不是二進制庫。

+0

* DLL是二進制代碼* - 不在.Net – DaveShaw 2012-07-06 14:14:09

+1

「你不能。」是的你可以。這正是CAS設計的目的。請記住,.NET Framework是一個虛擬機,所以它可以在運行時強制執行這些規則。 – vcsjones 2012-07-06 14:14:34