实现自定义代码访问安全性的IPermission

时间:2012-05-31 20:25:35

标签: c# .net security code-access-security

我目前正在尝试为我们的项目构建自定义代码访问安全解决方案。

因此我创建了一个CustomPermissionAttribute,应该如下所示使用:

[CustomPermissionAttribute(SecurityAction.Demand, Permission="PermMethodABC")]
public void MethodABC() 
{ 
}

Attribute的CreatePermission()方法创建并返回一个新的CustomPermission实例。

CustomPermission类的Demand方法应根据我在Thread.Current.CurrentPrincipial中的自定义IPrincipial实现来检查安全性:

public sealed class CustomPermission : IPermission
{
    private string _RequiredPermission;
    ...
    public void Demand()
    {
        ICustomPrincipial _pr = Thread.Current.CurrentPrincipial as ICustomPrincipial;
        if (_pr == null) throw...
        if (!_pr.HasPermission(_RequiredPermission)) throw...
    }
}

public interface ICustomPrincipial : IPrincipial
{
    bool HasPermission(string RequiredPermission);
}

以上所有内容均在已签名“大会A”中。

unsigned 程序集B包含以下CustomPrincipial实现,该实现实现了程序集A的ICustomPrincipial:

public sealed class CustomPrincipial : ICustomPrincipial
{
    User _User;
    ...
    public bool HasPermission(string RequiredPermission)
    {
        if (_User has permission defined with "PermMethodABC") ...
        return true/false;
    }
    ...
}

(现在,程序集A必须知道有关用户类型的任何信息。如果我将CustomPrincipial类放入程序集A中,那么所有具有用户资料的程序集也必须进行签名...否则我无法编译程序集A)

在应用程序启动时,将为Thread.Current.CurrentPrincipial分配一个新的CustomPrincipial实例。

两个问题:

  • 可以安装程序集A中公共ICustomPermission接口导致的问题吗?

  • 完全实施所有IPermission会员是否绝对必要?特别是ToXML和FromXML方法......每次在运行时访问MethodABC()时,无论如何都会调用CreatePermission()方法。

修改 广告1:我正在考虑以下情况:“程序集C”包含受CustomPermissionAttribute保护的MethodXY。要访问此受保护的方法,攻击者可以创建一个新的应用程序,对程序集A和A的引用。程序集C可以自己实现程序集A的公共ICustomPrincipial接口( - > HasPermission()一直返回true)。他可以将他的实现实例分配给他自己的Thread.Current.CurrentPrincipial。如果程序集A的Demand()方法检查Thread.Current.CurrentPrincipial,则攻击者可以访问MethodXY。这可能是一种可能的情况..!?

1 个答案:

答案 0 :(得分:1)

  

可以安装程序集A中公共ICustomPermission接口导致的问题吗?

假设您对自己的权限非常谨慎,Thread.Current.CurrentPrincipal对大多数其他程序应该是只读的,从而无法绕过。 (至少从MSDN页面快速浏览一下)

然而,与任何安全问题一样,最好自己测试一下。尝试编写在您的环境中运行的代码,并实现绕过CurrentPrincipal

的方法
  

完全实施所有IPermission会员是否绝对必要?特别是ToXML和FromXML方法......每当我在运行时访问MethodABC()时,无论如何都会调用CreatePermission()方法。

在完整实施的msdn页面上有一个示例,它看起来并不太令人讨厌,并且可以保证您以后因{{{{{{{ 1}}。

但是我还没有通过NotImplementedException进行足够的实验来了解正常操作期间调用的方法。

编辑:这是一个评论,但有点长。

要记住的一个重要事项是,如果一段代码具有修改主体的权限,那么您可以做的太多事情可以阻止它绕过您的任何权限。 IPermission是设置SecurityPermissionFlag.ControlPrincipal要求的权限。我相信除非你使用像Caspol.exe这样的工具,否则任何可执行文件都将在完全信任下运行。

总结一下,默认情况下,.NET框架假定自定义代码完全受信任,除非另有说明。如果您正在调用您不信任的代码,那么有机会确保代码以较低的安全凭据运行,或者如果您有可信任的不信任,那么您可以降低其安全凭据。但是,该计算机的任何管理员都有足够的能力绕过您实施的任何代码访问安全性(正如您对CurrentPrincipal覆盖所评论的那样)。

如果这个解释不够好,请告诉我,我可以添加更多细节。