【问题标题】:How to prevent plugins from executing harmful code如何防止插件执行有害代码
【发布时间】:2012-07-06 14:03:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net plugins module


    【解决方案1】:

    我正在开发 .NET3.5

    在这种情况下,我会将您的插件隔离在单独的AppDomain 中运行,使用Code Access Security 并限制应用程序域的权限集。这会“沙盒”您的插件程序集。

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

    这不适合胆小的人。 AppDomain 可能很难使用,并且需要序列化、对象生命周期策略等。您可以使用 MAF,因为它可以省去很多麻烦。

    【讨论】:

    • 是否可以查询插件以获得所需的代码访问安全权限?与 Android 上的意图之类的东西相比? IE。我可能想要一个插件框架,允许我确定插件要求什么权限,这样我就可以在加载插件之前提示用户确认。或者是相反的方式,因为我在我的应用程序中强制执行权限,然后如果插件尝试在允许的权限之外执行某些操作,它就会失败/抛出异常?
    • 不问“如何做”,因为这超出了问题的范围,但很好奇这两种不同的方法中哪一种适合 CAS。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • “一种可行的方法是检查 IL 代码并寻找禁止的方法签名”ick。通过动态调度(例如 DLR、反射等)进行的方法调用呢?
    • 我并不是说我这样做了。我所说的只是研究人员做到了,并获得了相当多的媒体回声(智能手机安全性很酷)。我猜他们不像普通的 Stackoverflow 访问者那样是核心开发人员。也许他们应该在 SO 上询问他们的想法是否是个好主意。
    【解决方案3】:

    你不能。

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

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

    【讨论】:

    • “你不能。”是的你可以。这正是 CAS 的设计初衷。请记住,.NET Framework 是一个虚拟机,因此它可以在运行时强制执行这些规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多