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

本文关键字:IPermission 安全性 访问 自定义 代码 实现 | 更新日期: 2023-09-27 18:35:51

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

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

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

属性的 CreatePermission() 方法创建并返回一个新的自定义权限实例。

类的 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"中。

未签名的程序集 B 包含以下自定义原理实现,该实现实现程序集 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 必须知道有关用户类型的任何信息。如果我将自定义原理类放入程序集 A 中,那么所有带有用户内容的程序集也必须签名......否则我无法编译程序集 A)

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

两个问题:

  • 是否由程序集 A 中的公共 ICustomPermission 接口引起的安全问题?

  • 是否绝对有必要全面执行所有IPermission成员?尤其是ToXML和FromXML方法...每次我在运行时访问 MethodABC() 时,都会调用 CreatePermission() 方法。

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

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

是否由程序集 A 中的公共 ICustomPermission 接口引起的安全问题?

假设您对权限很谨慎,Thread.Current.CurrentPrincipal对大多数其他程序应该是只读的,因此无法绕过。(至少从快速浏览MSDN页面来看)

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

是否绝对有必要全面执行所有IPermission成员?尤其是ToXML和FromXML方法...每次我在运行时访问 MethodABC() 时,都会调用 CreatePermission() 方法。

msdn页面上有一个完整实现的示例,它看起来并不太讨厌,并且可以保证您以后不会因为NotImplementedException而遇到问题。

但是,我还没有对IPermission进行足够的实验,以了解在正常操作期间调用哪些方法。

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

要记住的重要事项之一是,如果一段代码具有修改主体的权限,则无法执行太多操作来阻止它绕过您的任何权限。 SecurityPermissionFlag.ControlPrincipal是设置CurrentPrincipal所需的权限。我相信,除非您使用Caspol之类的工具.exe否则默认情况下,任何可执行文件都将在完全信任下运行。

总而言之,默认情况下,.NET 框架假定自定义代码是完全受信任的,直到另有说明。如果您调用不信任的代码,有一些机制可以确保代码以较低的安全凭据运行,或者如果您有不信任的可执行文件,则可以降低其安全凭据。但是,计算机的任何管理员都有足够的权力绕过您实现的任何代码访问安全性(正如您在IPrincipal覆盖中注释的那样)。

如果这还不够好解释,请告诉我,我可以添加更多详细信息。