ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-受限AppDomain中的代码访问安全性异常

2019-10-30 10:05:10  阅读:229  来源: 互联网

标签:code-access-security appdomain c


目标:我需要在权限非常有限的AppDomain中运行一些代码-它完全不能访问任何东西,除非我在其他地方定义了一些辅助方法.

我已经完成的工作:我正在使用所需的基本权限创建一个沙箱AppDomain,并创建一个运行代码的代理对象:

static AppDomain CreateSandbox()
{
    var e = new Evidence();
    e.AddHostEvidence(new Zone(SecurityZone.Internet));

    var ps = SecurityManager.GetStandardSandbox(e);
    var security = new SecurityPermission(SecurityPermissionFlag.Execution);

    ps.AddPermission(security);

    var setup = new AppDomainSetup { 
        ApplicationBase = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 
    };
    return AppDomain.CreateDomain("Sandbox" + DateTime.Now, null, setup, ps);
}

public class Proxy : MarshalByRefObject
{
    public Proxy() { }

    public DoStuff()
    {
       // perform custom operation requiring permission
       HelperAssembly.HelperMethods.Method1();

       // do other stuff with low permission level
       ...
       ...
       ...   
    }
}

我已经将帮助程序方法放在专用的强名称程序集中,并用[SecuritySafeCritical]标记了它们及其容器类:

// HelperAssembly.dll

namespace HelperAssembly
{
    [SecuritySafeCritical]
    public class HelperMethods
    {
        [SecuritySafeCritical]
        public static void Method1()
        {
            new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)
                .Assert();
            try
            {
                // logic requiring unmanaged code
                ...
            }
            finally
            {
                CodeAccessSecurity.RevertAll();
            }

        }
    }
}

然后,我将辅助程序程序集加载到沙箱AppDomain中并运行Proxy.DoStuff(),期望它执行辅助程序方法并顺利进行:

var appDomain = CreateSandbox();

appDomain.Load(typeof(HelperAssembly.HelperMethods).Assembly.FullName);

var proxy = (Proxy)sandbox.CreateInstance(
    typeof(Proxy).Assembly.FullName, 
    typeof(Proxy).FullName).Unwrap();

proxy.DoStuff();

但是,运行代码会在helper方法的Assert()行上导致异常:

Unhandled Exception: System.InvalidOperationException: Cannot perform CAS Asserts in Security Transparent methods

这种行为的原因是什么?如何实现我想要做的事情?据我了解,不受信任的AppDomain中的代码是安全透明的,而帮助程序程序集中的代码对安全性至关重要,这意味着它应该能够使用Assert()请求权限.

我显然错过了一个难题,所以要由对代码访问安全性有更好了解的人来解释问题所在.任何帮助表示赞赏.

解决方法:

您的“受信任”程序集需要具有AllowPartiallyTrustedCallers属性,以便SecuritySafeCritical可以跨程序集边界进行调用.在调用CreateDomain时,还必须将其添加到fullTrustAssemblies中.

标签:code-access-security,appdomain,c
来源: https://codeday.me/bug/20191030/1967138.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有