Security Briefs...小心完全信任的代码

http://tech.ddvip.com   2006年07月20日    社区交流

本文详细介绍Security Briefs...小心完全信任的代码

  结果是所有的需求都成功,即便是先前所示的链接需求(link demand)。第二个例子也示范了另一个非常危险的代码存取许可,即一个称为 ControlPolicy 的 SecurityPermission。任何获取了该许可的代码都可以仅用一行代码来关闭进程的代码存取安全。完全信任代码具备所有许可,包括这一个。

  但是,你也许不想落到这个地步,实际上你也不会如此。只要用需要的公共密钥延迟签署(delay-sign)程序集并关闭此密钥的强名称检查。具体详细参见我在 MSDN 上发表的有关强名称的文章:Security Briefs: Strong Names and Security in the .NET Framework。以我对 CLR 的研究,微软在类似 MSCORLIB.DLL 的核心框架库中使用强名称 LinkDemand,但它决不会阻止我调用其中的私有方法。

  我希望我已经清晰地做了表达:给某人一个程序集,并限制他调用某些方法或存取某些变量是不可能的。 当然,除非你控制了运行你的代码的这台机器,这种情况下,你可以强制他们在部分信任环境下运行。在完全信任环境下,许多安全保证都将消失。

  IStackWalk.Deny 有屏障作用吗?

  很少有人知道通过使用 deny 修饰符可以限制调用堆栈许可:

using System.Security;
using System.Security.Permissions;
class WellMeaningCode {
  public void CallPlugIn(EvilCode plugin) {
    // put a CAS modifier on the stack that denies all file system access
    new FileIOPermission(
      PermissionState.Unrestricted).Deny();
    plugin.DoWork();
    CodeAccessPermission.RevertDeny();
  }
}

  其思路是即便 WellMeaningCode 可能为完全信任,也不能信任插件或某些第三方扩展。所以,在对插件 进行调用前,要临时降低许可。但是,如果安全策略给予插件完全信任的话,方能阻止天真的程序员所创建的可怕插件代码。下面是针对这种情况的实现代码:

作者:红裤子    责编:豆豆技术应用

正在加载评论...