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

7
我目前正在为我的学士论文开发一个非常模块化和基于插件的框架。主要思想是,在应用程序结构中有一个名为 "plugins" 的文件夹,您可以将符合特定接口 "IPlugin" 的编译插件(例如 ".dll" 文件)放入其中。然后应用程序使用用户选择的插件执行任务。因此,如果我想在 PDF 文件中执行一次任务,我会选择 "PdfPlugin",而在 Word 文档中执行一次任务,则会选择 "DocPlugin"。
输出也由接口定义,因此每个插件返回相同的数据结构。只是每个库的实际工作有所不同。
现在,由于应用程序仅调用接口中定义的方法,例如 "ParseDocument()" 等,如何防止可能由第三方开发的插件执行有害代码呢?
我正在使用 .NET3.5(可能会切换到4,尚未决定)和 C#。
3个回答

8
我正在使用.NET3.5。
在这种情况下,建议将插件隔离到单独的AppDomain中运行,使用Code Access Security并限制应用程序域的权限集。这样可以“沙盒化”您的插件程序集。
例如,您可以取消所有非托管代码权限和文件IO权限,然后您的插件就无法写入文件系统。
这不是一项易于完成的任务。AppDomains可能很棘手,需要序列化、对象生命周期策略等。您可以使用MAF,因为它会减少很多繁琐的工作。

有没有可能查询插件需要哪些代码访问安全权限?与 Android 上的意图之类的东西相比呢?也就是说,我可能需要一个插件框架,允许我确定插件正在请求什么权限,以便在加载插件之前提示用户进行确认。还是说反过来,我在我的应用程序中强制执行权限,然后如果插件尝试执行超出允许权限的操作,则插件会失败/抛出异常? - AaronLS
不要求“如何做”,因为这有点超出了问题的范围,但是想知道这两种不同方法中哪一种适合使用CAS。 - AaronLS

0

我知道在这个领域已经有相当多的研究。一种有效的方法是检查IL代码并查找禁止的方法签名。然后,您可以将它们重定向到一个错误钩子,以停止插件执行进一步的代码。

一个应用场景是增强智能手机的安全性,您可以检查下载应用程序的IL代码,以获取对GPS模块、相机、麦克风等访问方法的访问权限。安全应用程序可以修补这些访问方法,并询问用户是否真的允许该应用程序启用麦克风。

使用.NET,您可以使用类似Mono.Cecil的IL阅读器来检查有害签名的IL代码。但是总会有绕过此类方法的方式,因为您仍然可以动态生成代码或仅将代码存储为资源,并在运行时从资源中加载它。对于概念验证,这种方法非常容易实现。

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


2
一种可行的方法是检查IL代码并查找禁止的方法签名。但是,对于通过动态调度(例如DLR、反射等)进行的方法调用呢? - vcsjones
我并不是在说我做了这件事。我只是说研究人员做了这件事,并且引起了相当大的媒体反响(智能手机安全很酷)。我想他们可能不像 Stackoverflow 的普通访问者那样是硬核开发人员。也许他们应该在 Stackoverflow 上询问他们的想法是否可行。 - Alois Kraus

-2

你不能这样做。

DLL是二进制代码,它以调用程序的特权执行。当调用DLL中的方法时,你无法控制它所做的任何事情。

当你想要限制插件的功能时,你必须将执行移至主程序。一个好的方法是使用脚本语言实现插件,该语言由你的程序解析和执行,而不是使用二进制库。


1
“你不能。”其实是可以的。这正是CAS设计的初衷。请记住,.NET Framework是一个虚拟机,因此它可以在运行时强制执行这些规则。 - vcsjones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接