• Code Access Security (CAS)


    微软防止不信任的代码进行一定权限的行为的解决方案。
    CAS根据代码来自哪里,不同等级地信任代码。

    流程:
    当CLR加载一个assembly,
    首先获得这个assembly的evidence(与assembly相关的信息,例如URL,发布者,所在文件夹等),
    来判断assembly所属的code group(包含权限集,由机器管理员决定)
    当代码要求一定权限(比如写文件)时,
    进行code access demand,
    CLR检查赋予call stack中每个方法的权限。

    基本介绍完毕。现在来说case。
    遇到的问题是和strongnameidentitypermission相关。
    为了保护程序集代码只被可信的调用方调用,有一个途径是通过强名称标识来做。但在.net framework 1.1和2.0中该机制的原理不同了。
    在 .NET Framework 1.0 和 1.1 版中,即使调用程序集受到完全信任,对标识权限的要求也仍然有效。即,即使调用程序集已获得完全信任,如果该程序集不满足要求的条件,对标识权限的请求也将失败。在 .NET Framework 2.0 版中,如果调用程序集已获得完全信任,则对标识权限的要求将无效。这样做可确保所有权限的一致性,避免了标识权限的处理特殊化现象。
    换句话说,在1.1中,是以assembly的安全设置为最大,在2.0中,是以调用的代码的安全设置为最大。

    这样就带来一个问题:2.0后,如果在本地(默认完全信任)调用危险的程序集,程序集照样能以完全的权限运行,没有起到限制的作用。难道strongnameidentitypermission就此失效了么?

    .Net 2.0中CAS是针对代码执行的信任进行限制而非针对调用者身份进行限制。
    CAS中代码包含了evidence,这代表了该代码的来源。

    .NET在运行时对evidence进行计算,因为直到assembly执行前.NET都不会对assembly的来源进行分析。
    因此如果对某个assembly的调用,就需要限制调用assembly的代码的权限。
    (参考资料:http://www.code-magazine.com/Article.aspx?quickid=0405031

    如果要对执行信任等级进行调整,可以使用.Net framework 2.0 configuation(控制面板-〉管理工具)(如果使用的是Windows Server 2008,虽然其默认自带.net framework 2.0,但没有configuration界面,因此需要在微软官方网站下载并安装.Net framework 2.0 SDK)。

    我的测试步骤如下:
    1. 新建一个class library project,编译为assembly
    2. 新建一个console application(C#),调用上述assembly中的方法,调用成功。
    3. 打开.Net framework 2.0 configuation,将Enterprise,Machine和User的权限都更改为Nothing(没有任何Permission),再次运行console application,程序运行出错。这表明对调用代码的权限进行了限制。

    在测试时可以使用沙箱来进行测试。具体可参考:
    "How to: Run Partially Trusted Code in a Sandbox"
    <http://msdn.microsoft.com/en-us/library/bb763046.aspx>

    另外提醒一下,.NET 3.5 SP1有一个新的特性,local intranet机器的权限默认更改为“Full Trust"。

    总结一下,即如果调用者已经获得了某machine上Full Trust的信任等级,那么无法对调用者是否能调用assembly进行限制。因此如果要使该调用者不能调用assembly,需要使用.Net framework 2.0 configuation对调用者使用的调用代码进行限制。

    (PS. 也可以尝试一下勾选delay signing(延迟为程序集签名),或许该选项能满足需求)

    参考资料:
    Find Out What's New with Code Access Security in the .NET Framework 2.0
    http://msdn.microsoft.com/zh-cn/magazine/cc163700(en-us).aspx

    如何测试托管代码安全
    http://space.itpub.net/100788/viewspace-170199
    (Some tips on testing managed code Security
    http://blogs.msdn.com/eugene_bobukh/archive/2004/03/10/87649.aspx

    代码组
    http://whx.tzgt.gov.cn/newOperate/html/1/12/124/10316.html

  • 相关阅读:
    模块总结
    安装python包时出现VC++ 错误的解决方案
    Android之drawable state各个属性详解
    【Android 复习】:第01期:引导界面(一)ViewPager介绍和使用详解
    Android 应用页面延缓载入
    Android系统手机端抓包方法
    【Android 复习】:Android之ViewFlipper(二)
    【Android 复习】:Android之ViewFlipper(一)
    【Android 复习】:Android五种布局的使用方法
    【Android 复习】:从Activity中返回数据
  • 原文地址:https://www.cnblogs.com/galaxyyao/p/1400421.html
Copyright © 2020-2023  润新知