相关疑难解决方法(0)

寻找沙盒.NET插件的实用方法

我正在寻找一种从.NET应用程序访问插件的简单而安全的方法.虽然我认为这是一个非常普遍的要求,但我很难找到满足我所有需求的东西:

  • 宿主应用程序将在运行时发现并加载其插件程序集
  • 插件将由未知的第三方创建,因此必须对它们进行沙盒处理,以防止它们执行恶意代码
  • 常见的互操作程序集将包含主机及其插件引用的类型
  • 每个插件程序集将包含一个或多个实现公共插件接口的类
  • 初始化插件实例时,主机将以主机接口的形式向其传递对自身的引用
  • 主机将通过其公共接口调用插件,插件也可以同样调用主机
  • 主机和插件将以互操作程序集中定义的类型的形式交换数据(包括泛型类型)

我已经调查了MEF和MAF,但我很难看到如何使它们中的任何一个符合要求.

假设我的理解是正确的,MAF无法支持在其隔离边界上传递泛型类型,这对我的应用程序至关重要.(MAF实现起来也非常复杂,但如果我能解决泛型问题,我会准备好使用它).

MEF几乎是一个完美的解决方案,但似乎无法满足安全性要求,因为它将扩展程序集加载到与主机相同的AppDomain中,因此显然可以防止沙箱化.

我已经看到了这个问题,它讨论了在沙盒模式下运行MEF,但没有描述如何.这篇文章指出"当使用MEF时,你必须信任扩展不运行恶意代码,或通过代码访问安全提供保护",但同样,它没有描述如何.最后,有这篇文章描述了如何防止未知插件被加载,但这不适合我的情况,因为即使是合法的插件也是未知的.

我已经成功地将.NET 4.0安全属性应用于我的程序集,并且MEF正确地尊重它们,但是我没有看到这有助于我锁定恶意代码,因为许多可能是安全威胁的框架方法(例如,方法System.IO.File)标记为SecuritySafeCritical,这意味着它们可以从SecurityTransparent程序集访问.我在这里错过了什么吗?是否有一些额外的步骤我可以告诉MEF它应该为插件程序集提供互联网权限?

最后,我也看了创造我自己的简单的沙盒插件架构,使用单独的AppDomain,描述在这里.但是,据我所知,这种技术只允许我使用后期绑定来调用不受信任的程序集中的类上的静态方法.当我尝试扩展这种方法来创建我的一个插件类的实例时,返回的实例无法转换为公共插件接口,这意味着主机应用程序无法调用它.是否有一些技术可用于跨AppDomain边界获得强类型代理访问?

我为这个问题的长度道歉; 原因是要显示我已经调查过的所有途径,希望有人可以提出新的尝试.

蒂姆,非常感谢你的想法

.net mef sandbox code-access-security maf

59
推荐指数
2
解决办法
6903
查看次数

标签 统计

.net ×1

code-access-security ×1

maf ×1

mef ×1

sandbox ×1