C# 防止 AppDomain 程序集的类实例进行文件访问

标签 c# .net security .net-assembly appdomain

我想加载一个程序集,其中包含一个实现接口(interface)的类。 该接口(interface)只有一个方法:“Run()”。

我想在完全受限的 AppDomain 中加载该类,并阻止该实例访问文件或注册表。

这是我的布局:

  • 已签名的主项目 - 加载程序集、创建实例并执行方法 Run()
  • 签名 C# 库 - 仅包含 IProvider 接口(interface)定义
  • 外部 C# 库 - 在 MyProvider 类中实现我的接口(interface)

这是我用来加载外部库、创建实例并执行接口(interface)方法的代码:

        Evidence ev = new Evidence();
        ev.AddHostEvidence(new Zone(SecurityZone.Internet));
        PermissionSet permSet = SecurityManager.GetStandardSandbox(ev);

        StrongName fullTrustAssembly = typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();

        AppDomainSetup adSetup = new AppDomainSetup()
        {
            ApplicationBase = Path.GetFullPath(Environment.CurrentDirectory)
        };

        AppDomain newDomain = AppDomain.CreateDomain("Sandbox", ev, adSetup, permSet, fullTrustAssembly);

        Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes("ExternalLib.dll"));
        var instance = asm.CreateInstance("ExternalLib.MyProvider", true);

        IProvider provider = instance as IProvider;

        //Should not work, because my Assembly is accessing a file/Registry or something else
        string result = provider.Run("Test");

我希望最后一行抛出异常,因为ExternalLib.dll实现了该接口(interface),但正在访问我的文件系统或更改注册表等

关于如何实现这一目标有什么想法吗?

最佳答案

您可以删除permissions来自 PermissionSet,例如:

permSet.RemovePermission(typeof(FileIOPermission));
permSet.RemovePermission(typeof(RegistryPermission));

或者您可以创建一个没有权限的PermissionSet,然后添加您想要的权限,如here所述。 :

PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

关于C# 防止 AppDomain 程序集的类实例进行文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287195/

相关文章:

c# - 为什么我无法使用 HIDSharp 连接到 USB 复合设备?

c# - 为什么 .NET foreach 循环在集合为空时抛出 NullRefException?

jquery - Spring Security 3.1 - 发生 session 超时时自动重定向到登录页面

linux - 如何在嵌入式设备上实现网络服务?

c# - 使用图形 API 添加 MS Teams 网站选项卡错误

递归内部函数的 C# 命名约定?

c# - 表达式树 : iterate through strings and check if they contained in another Expression

C#对象看起来像动态类型

c# - 使用名称单独超链接创建 Gridview

security - 刷新和重新加载缓存侧信道攻击