【问题标题】:Plugin system security in .NET Framework 4.x (without CAS).NET Framework 4.x 中的插件系统安全性(无 CAS)
【发布时间】:2018-09-03 21:19:42
【问题描述】:

我想要实现的是一个具有以下功能的插件系统:

  • 从可能不受我(开发人员)信任但受安装插件的最终用户信任的来源加载外部插件
  • 在特定范围内授予每个插件的权限;例如一个插件可能有权从特定位置读取文件,而其他插件可能被允许连接到特定网站位置
  • 每个插件权限的特殊情况:与另一个对象交互,最有可能作为接口实例提供,而不访问其任何非公共成员(甚至不使用偷偷摸摸的反射技术)
  • 在插件代码造成任何损害之前防止最终用户不同意的操作,例如访问非公共成员或在文件系统上操作

在搜索过程中,我主要发现了涉及代码访问安全性的 SO 解决方案,据我所知,该解决方案在 .NET 4.x 中已经过时。我还在 MSDN 页面上阅读了一些关于新安全模型的内容,看来library code that exposes protected resources 在这里是必要的;但是,我找不到任何显示如何应用此类代码的示例。我的猜测是,这将涉及创建单独的 AppDomain 并可能使用 Principal 权限,但据我所知,这是差不多的。

在旁注中,我还发现只需要强命名程序集的提及,但我不相信这就足够了。如果我没记错的话,强大的命名优势之一是插件开发人员可以通过使用自己的私钥签署程序集哈希来证明自己的身份,而其他人可以使用众所周知且受信任的公钥进行检查。然而,仅此一项似乎太不灵活了,因为它要么要求开发人员亲自决定应该信任谁的代码,要么只信任任何学会签署他们的程序集的人。

如果有一个使用最新安全模型的安全管理代码示例,我将不胜感激。我目前的想法:

  • 用于公开潜在敏感操作(例如 A 和 B)的服务接口
  • 服务的虚拟实现,重点是防止未经授权执行这些操作
  • 来自不同程序集的两个插件,一个具有执行操作 A 的权限,另一个具有操作 B 的权限
  • 一个应用程序,它设置服务、加载带有插件的程序集并尝试为每个插件执行操作,以便阻止未经授权的操作并正确执行授权操作
  • 在应用程序中运行时,两个插件本身都不应该能够访问一般敏感的 API,例如文件 I/O 或网络,但应该可以通过服务来完成
  • 所有这些,同时尽可能密切关注 these recommendations(与 2010 年的 SO 问题中基于 CAS 的解决方案相反)

当然,如果它以更好的方式实现目标,欢迎您提出替代架构。

【问题讨论】:

  • CAS 本身并未被弃用,但不鼓励将其用作受信任代码(您的应用程序)和不受信任(插件)之间的安全边界。据我了解,这是因为 MS 不想进一步开发它,也不会修复任何允许绕过它的漏洞。如果您要在您链接的文章的“保护资源访问”部分中执行未知代码,他们列出了您可以使用的“替代措施”。 CAS 在这方面没有“替代”(作为提到的安全边界)。
  • 插件是否需要用 C# 编写(或者说插件有任何语言限制)?
  • 一般来说,我假设与主应用程序的 .NET 版本兼容的 .NET 程序集将作为插件得到支持(无论是用 C# 还是 VB 或其他 .NET 编译语言编写)。我没有直接支持其他库的计划;如果有人想插入一个,他们需要为它创建一个基于 .NET 的接口。
  • 虽然它不能解决您问题的核心,但我认为 OIDC 混合流可能值得研究,作为一种对哪些插件可以访问哪些 API 进行细粒度控制的方法。您可以将范围应用于 API 表面的相关部分,并根据插件的访问级别将声明分配给插件。无论您最终使用哪种强签名或类似的基础设施,都可以提供身份验证的基础,而声明和范围则处理插件被允许执行的具体操作。
  • 我想一些额外的解决方案不会受到伤害。最好能解释一下为什么提议的使用 CAS 的解决方案提供了比直接生成 AppDomain 并设置其权限更好的沙盒。

标签: c# .net security plugins permissions


【解决方案1】:

你的问题在多个层面上都很难。

我见过的最接近的事情是一个长期被遗忘的 Microsoft 项目,名为 Terrarium,您可以在其中使用 .net 语言编写一个生物,构建它,然后提交包含您的生物的程序集,以便在一个 terrarium 服务器上运行是用 .NET 1.0 编写的。对于 MS 开发人员来说,创建一个任何用户都可以运行代码但又安全又好玩的环境是一个挑战。他们创建了一个工具来禁止在装配中使用某些类型。它被称为AsmCheck

我过去曾尝试使用应用程序域来实现相同的目标,但没有取得多大成功。

时不时地,我仍然在思考完成此类任务的最佳方法是什么。有可能,Android 和 iOS 都是这样工作的,但这需要我尽可能地编写整个 OS 或框架。

我计划创建一个 AppDomain 并将我的插件加载器加载到此域。 Loader 然后加载插件程序集以及它通过劫持程序集加载器尝试加载的所有程序集。加载程序集时,它使用 AsmCheck.vNext 来检查它是否做了一些可疑的事情。对于它加载的每个程序集,它使用 IoC 容器(如 this)来限制对框架的访问。

我通过插件注册表检查强名称或检查代码签名证书来验证程序集。

在您看到 Confuser 或其继任者 ConfuserEx 之前,一切似乎都很好。它通过将方法转换为自初始化静态委托来创建代理类型来访问方法,这些委托不是按名称而是按引用 id 引用方法。现在,我怎么可能分析和/或限制对此的访问。

或者您可以完全阻止 System.IO 命名空间并为您提供自己的 IO 库,但是如何限制一个使用 PInvoke 并调用 GetProcAddress 以便它可以访问 ReadFile、WriteFile 等...

要处理的案件太多了,这只是冰山一角。如果你绝对必须限制插件来做一些事情,你必须编写自己的框架或提供像 lua 这样的脚本语言。

您可以尝试应用容器化。每个插件都加载在一个特殊的容器中,并与您的应用程序对话以执行需要权限的任务。除此之外,在容器中运行的代码认为容器就是整台计算机。

有一天我希望看到有人以一种简单有效的方式解决这个问题。

PS:我的答案不是答案。这是一个答案,因为它不适合评论。

【讨论】:

  • 我认为@edokan 是正确的,因为使用“容器 VM”机制是当今最好的方法。您可以开发一个运行包含插件的 Docker 映像的系统,并拥有一个 API 层来执行您的主应用程序和 Docker 容器化插件之间的通信。当然,这是一项艰巨的任务,但在当今时代,可以使用工具来实现它。
  • 是的,当我被推向“容器 VM”的方向时,我搜索了一下,Docker 被非常突出地提到了。我担心的一件事是,如果安装了适当的 .NET 框架版本,应用程序是否会立即在 Windows 7+ 上运行。似乎 Docker 不包含在 Windows 7 中,尽管也许有办法以某种方式将它与应用程序一起发布......?
【解决方案2】:

您可以强制插件在单独的进程中运行并仅使用 RPC 与您的应用程序交互。 这样,除了您通过 API 提供的内容之外,他们将无法访问任何内容。

Android 操作系统会做同样的事情来公开 Applications Look IBinder 的功能。

【讨论】:

  • 感谢您的回答,我可能会在空闲时间研究一下。根据我所见,RPC 似乎适用于客户端-服务器应用程序,我假设 Application+API 将是“服务器”层,而 Proxy+Plugin 将是“客户端”之一,对吧?那么有几个问题:1)如何在逻辑单一应用程序的上下文中设置 RPC 连接? 2)我能否确保应用程序以同步方式引用插件代码(即从应用程序调用插件并且插件执行其逻辑是不间断的)? 3) 这种 RPC 调用的开销是多少?
  • @Alice 1) 和 3) 您可以在单独的进程中运行每个插件,并使用共享内存在进程之间进行通信,速度非常快。在 Windows 操作系统中,您可以使用命名管道,或者您可以像这个人一样编写自己的自定义管道,并且有相同的要求youtube.com/watch?v=mLX1sYVf-Xg 2)我不完全理解这个问题,你在说什么样的中断?你能提供更多细节吗
  • 谢谢你的视频,我去看看。至于 2),事后看来,我想我的意思是代码立即运行而不是不间断运行。例如,如果我调用本地非异步方法 DoSomething(),它的执行将立即开始。另一方面,如果我在某个服务器(WCF、HTTP,我不知道)上调用 DoSomething() 方法,它会在处理请求并传递结果之前对请求进行排队。所以,我想知道由生成多个进程的主应用程序执行的 RPC 是否会像本地方法一样“立即”行动,或者像服务器方法一样以“排队”的方式行动。
  • @Alice 这取决于你对 RPC 传输层的实现,HTTP 这样做是因为它默认就是这样设计的。如果你使用管道(进程之间通过共享内存进行通信),你可以设计为立即或异步运行方法。
  • 好的,非常感谢。还有一个问题:如何防止插件进程执行自己的敏感操作?我会为它生成一个限制性 AppDomain,还是...?
猜你喜欢
  • 1970-01-01
  • 2019-12-17
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多