jjzjj

c# - .NET Framework 4.x 中的插件系统安全性(无 CAS)

coder 2024-05-28 原文

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

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

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

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

我将非常感谢使用最新安全模型的安全管理代码的一个很好的例子。我目前的想法:

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

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

最佳答案

您的要求在多个层面上都很难。

我见过的最接近这个的是一个被遗忘已久的 Microsoft 项目,名为 Terrarium ,您可以在其中使用 .net 语言编写生物代码,构建它,然后提交包含您的生物的程序集,以在用 .NET 1.0 编写的玻璃容器服务器上生存。对于 MS 开发人员来说,创建一个任何用户都可以运行代码但安全且玩得开心的环境是一个挑战。他们创建了一个工具来禁止某些类型在汇编中使用。它叫做AsmCheck .

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

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

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

程序集的验证是在我这边完成的,方法是使用我的插件注册表检查强名称,或检查代码签名证书。

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

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

要处理的案例太多了,而这只是冰山一角。如果您绝对必须限制插件执行某些操作,则您必须编写自己的框架或提供像 lua 这样的脚本语言。

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

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

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

关于c# - .NET Framework 4.x 中的插件系统安全性(无 CAS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49479446/

有关c# - .NET Framework 4.x 中的插件系统安全性(无 CAS)的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  7. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

随机推荐