4

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

因此,我创建了一个 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);
}

以上所有内容都在签名的“Assembly A”中。

签名的程序集 B 包含以下实现程序集 A 的 ICustomPrincipial 的 CustomPrincipial 实现:

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)

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

两个问题:

  • 程序集 A 中的公共 ICustomPermission 接口会导致安全问题吗?

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

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

4

1 回答 1

1

程序集 A 中的公共 ICustomPermission 接口会导致安全问题吗?

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

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

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

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

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

编辑:这更多是评论,但有点长。

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

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

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

于 2012-05-31T21:02:55.423 回答