c# - 为自定义代码访问安全实现 IPermission

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

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

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

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

属性的 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”中。

未签名程序集 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)

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

两个问题:

  • 程序集 A 中的公共(public) ICustomPermission 接口(interface)是否会导致安全问题?

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

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

最佳答案

Could saftey problems caused by the public ICustomPermission interface in Assembly A?

假设您小心处理您的权限,Thread.Current.CurrentPrincipal 对大多数其他程序来说应该是只读的,因此绕过它是不可能的。 (至少快速浏览一下 MSDN 页面)

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

Is it absolutely necessary to fully implement all IPermission Members? Especially the ToXML and FromXML Methods... The CreatePermission() Method gets anyway invoked everytime i access MethodABC() at runtime.

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

不过,我还没有对 IPermission 进行足够的试验,无法了解在正常操作期间调用了哪些方法。

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

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

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

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

关于c# - 为自定义代码访问安全实现 IPermission,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840772/

相关文章:

c# - 用于打印条码标签的 Zebra Printer C# 代码

c# - 多行文本框有大量数据,导致应用程序在调整窗口大小时挂起

amazon-web-services - 如何找到 AWS key 对公钥?

java - 将 Java 应用程序绑定(bind)到用户/计算机的安全解决方案

c# - 在绑定(bind)到 ListView 之前修改 ViewModel 的属性

c# - .NET 中自定义事件的设计模式

c# - UWP,在 Windows 之间传递信息

.net - 如何在 .NET 中编写 Exif header 而不重新压缩 JPEG?

.net - 如何根据客户端架构动态加载x86/x64版本的SQLite3.DLL?

iphone - 如何在 iPhone 上存储信用卡信息?