【问题标题】:Implementing IPermission for custom code access security为自定义代码访问安全性实施 IPermission
【发布时间】:2012-05-31 20:25:34
【问题描述】:

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

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

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

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

CustomPermission 类的 Demand Method 应该针对我在 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。这可能是一种可能的情况..!?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    但是我没有对IPermission 进行足够的试验,无法知道在正常操作期间调用了哪些方法。

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

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

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

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

    【讨论】:

    • 出于安全考虑:我在上面的帖子中提到了一种可能的情况。根据 IPermission:在正常操作期间,只调用 IsSubsetOf() 和 Demand()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2010-11-23
    • 2016-07-14
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多