7

我目前正在为我的学士论文开发一个非常模块化和基于插件的框架。主要思想是,在我的应用程序结构中有一个名为的文件夹,您可以在其中放入符合特殊接口plugins的已编译插件(例如-files) 。然后应用程序使用用户选择的插件执行任务。因此,如果我想在 PDF 文件中执行一次任务,我会选择 ,在 Word 文档中执行一次,我会选择到工作。.dllIPluginPdfPluginDocPlugin

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

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

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

4

3 回答 3

8

我正在研究 .NET3.5

在这种情况下,我会将您的插件隔离在单独的AppDomain中运行,使用代码访问安全性并限制 App Domain 的权限集。这会“沙箱”您的插件程序集。

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

这不适合胆小的人。AppDomain 使用起来可能很棘手,并且需要序列化、对象生命周期策略等。您可以使用MAF,因为它消除了很多管道。

于 2012-07-06T14:08:07.133 回答
0

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

一种应用是提高智能手机的安全性,您可以在其中检查下载的应用程序中的 IL 代码,了解对 GPS 模块、相机、麦克风等的访问方法。然后,安全应用程序可以修补这些访问方法并询问用户是否真的应该允许应用程序启用麦克风。

使用 .NET,您可以使用像 Mono.Cecil 这样的 IL 阅读器来检查 IL 代码中的有害签名。但是总有办法解决这个问题,因为您仍然可以动态生成代码或简单地将代码存储为资源并在运行时从资源中加载它。对于概念证明,这种方法很容易做到。

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

于 2012-07-06T14:11:36.880 回答
-2

你不能。

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

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

于 2012-07-06T14:13:31.817 回答