如何防止插件执行有害代码

时间:2012-07-06 14:03:08

标签: c# .net plugins module

我目前正在为我的学士论文研究一个非常模块化和基于插件的框架。主要的想法是,我的应用程序结构中有一个名为plugins的文件夹,您可以在其中放入符合特殊接口.dll的已编译插件(例如IPlugin - 文件)。然后,应用程序使用用户选择的插件执行任务。所以,如果我想在PDF文件中执行一次任务,我会选择PdfPlugin,在word文档中选择一次,我会选择DocPlugin来完成工作。

输出也在接口中定义,因此每个插件都返回相同的数据结构。只是每个库的实际工作都不同。

现在,由于应用程序只调用接口中定义的方法,例如ParseDocument()等等,我如何防止插件(可能由第三方开发)执行有害代码?

我正在研究.NET3.5(可能会切换到4,尚未决定)和C#。

3 个答案:

答案 0 :(得分:8)

  

我正在研究.NET3.5

在这种情况下,我会将您的插件隔离在单独的AppDomain中运行,使用Code Access Security并限制App Domain的权限集。这个“沙箱”你的插件组件。

例如,您可以删除所有非托管代码权限和文件IO权限,然后您的插件永远无法写入文件系统。

这不适合胆小的人。 AppDomains可能很难处理并需要序列化,对象生存期策略等。您可以使用MAF,因为它会占用大量的管道。

答案 1 :(得分:0)

我知道在这方面做了很多研究。一种工作方法是检查IL代码并查找禁止的方法签名。然后你可以将它们重定向到一个错误钩子,这将阻止插件执行更多的代码。

一个应用是例如提高智能手机的安全性,您可以从下载的应用程序检查IL代码,以获取GPS模块,摄像头,麦克风等的访问方法。安全应用程序可以修补这些访问方法,并询问用户应用程序是否真的应该是允许启用麦克风。

使用.NET,您可以使用像Mono.Cecil这样的IL读取器来检查IL代码是否存在有害签名。但总有办法解决这个问题,因为您仍然可以动态生成代码,或者只是将代码存储为资源,并在资源时以朗姆为单位加载代码。为了概念证明,这种方法很容易实现。

您甚至可以编写FXCop规则并使用它来静态检查禁止方法调用的插件。

答案 2 :(得分:-2)

你做不到。

DLL是二进制代码,使用调用程序的特权执行。当调用DLL中的方法时,您无法控制它的作用。

如果要限制插件可以执行的操作,则必须将执行移至主程序。执行此操作的一种好方法是使用脚本语言实现插件,该脚本语言由程序而不是二进制库解析和执行。