2012-07-06 44 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