【问题标题】:Could performing a .NET "security check" lead to security errors?执行 .NET “安全检查”会导致安全错误吗?
【发布时间】:2012-01-08 01:01:54
【问题描述】:

我有一段代码:

public void MyMethod()
{
   DirectoryEntry de; 
   ...
   de.AuthenticationType = AuthenticationTypes.Secure;
   ...
}

那个FxCop chokes on:

CA2122:不要间接暴露具有链接需求的方法

解决方案MyMethod() 调用具有 LinkDemand 的 DirectoryEntry.AuthenticationType.set(AuthenticationTypes)
通过进行此调用,DirectoryEntry.AuthenticationType.set(AuthenticationTypes) 间接暴露给用户代码。

信息:不要用不执行安全检查的方法包装受 LinkDemand 保护的方法。 LinkDemand 检查直接调用者的权限,而不是检查调用堆栈中所有调用者的权限。在这种情况下,将检查包装方法的权限。如果包装方法本身不检查调用者的权限 在调用堆栈的较高位置,恶意代码可能能够执行包装函数,即使它没有执行此操作的权限。”

我完全赞成添加 something, somewhere 来“修复”这个问题。但如果它会导致当前为客户工作的代码自发为客户工作,则无法添加。

注意:我不知道要添加什么,或者在哪里(FxCop 不包含该信息),我不知道如果它是死胡同,不想深入研究代码安全的秘密世界。

如果我向MyMethod 添加“安全检查*”,当前有效的代码是否有可能停止工作?


假设如果有人没有权限,现在编写的代码将不会工作。换句话说:

directoryEntry.AuthenticationType = AuthenticationTypes.Secure

如果某人没有正确的“权限”,将会已经失败。在调用堆栈的更高位置添加“安全检查”不会改变这一事实 - 只会更快地触发失败。在这种情况下,添加安全检查就可以了。

另一方面,如果:

public void MyMethod() {...}

MyMethod();

目前有效,但是

[SecurityCheck(...)]
public void MyMethod() {...}

AD.MyMethod()

开始失败,然后我不能真正添加​​它。

尤其是在每个人都使用的库代码中。


我无法自己测试的原因是没有人知道如何复制出现问题的情况。

就像大多数人通过尝试connect to AD with a username and password and read a property 来检查活动目录的凭据一样。即使用户名/密码正确,您也可能被允许读取属性。我敢打赌,除了我自己之外,没有人知道配置 ActiveDirectory 来复制该失败案例。

就我而言,我认为没有人知道如何配置东西以使代码安全性失败。

【问题讨论】:

  • 如果在完全信任模式下运行,这些东西都是无用的。您需要较低信任模式来触发安全检查(以及随后的故障)。
  • 据我了解,这个概念是可能正在进行用户模拟。当“执行”用户可能不是“当前用户”时,使用服务帐户或在应用程序池帐户下运行的东西都是常见的。因此,如果您的代码通过这样的块,那么可以肯定的是,添加 FxCop 所描述的安全检查可能会破坏早期的代码。这也意味着您永远不能假设某人已经有权做某事,因为在堆栈的不同级别,他们可能是不同的人!
  • @DevinB 严格来说,由于 Link Demand 发生在 JITed 代码并且 JITed 代码被缓存时,应用程序的一个用户(我) 运行它。如果其他人登录我的机器,并使用相同的缓存 jitted 代码,则检查不正确。这是我无法控制的链接需求
  • @Ian,这就是为什么它是一个评论,因为我实际上没有任何有用的东西要说:(。抱歉。根据我刚刚阅读的文档,除非你的整个堆栈都是安全的并且众所周知是安全的,您不应该使用任何具有“链接需求”的东西,这就是 FxCop 抱怨的原因。

标签: .net code-security


【解决方案1】:

我假设现在编写的代码如果有人 没有权限

LinkDemand 不是这样,它只要求直接调用者拥有目标权限。这就是 FxCop 警告您潜在问题的原因:恶意调用者可能会使用您的方法间接调用 DirectoryEntry 方法,尽管它本身没有足够的 CAS 权限。

解决此问题的最佳方法取决于几件事,包括您使用的 .NET Framework 版本。对于早期的 .NET 版本,将 LinkDemand 或对不受限制的 DirectoryServicesPermission 的完整需求添加到您的方法中。如果 FxCop 很高兴,那么您就已经解决了这个特殊问题。但是,某些调用者可能无法再调用您的方法。如果这是一个问题,您需要评估您对 DirectoryEntry 的使用,并确定它是否可能被恶意调用者滥用,然后再取消保护。

对于更新的 .NET 版本,事情变得更加复杂。如果您需要这方面的帮助,请说明您所针对的 .NET 版本以及您是否认为有必要支持部分受信任的调用方。

【讨论】:

  • .NET 框架 2.0-4.0。我不知道是否有必要支持受信任的呼叫者,因为我不知道呼叫者何时可能被部分信任。如果我是标准用户,从网络位置运行可执行文件,我假设我仍然完全受信任 - 因为我就是我。我想更简单的说法是:没有人会选择不被完全信任——只要没有人遇到过他们没有故意的错误由于 .NET 以某种方式决定“调用者信任”而产生的经验。
  • 代码访问安全性 (CAS) 评估代码的权限,而不是用户的权限。直接从网络位置运行可执行文件时,默认情况下,在 .NET 3.5 SP1 之前代码不会完全受信任。但是,如果客户机的 CAS 策略已更改以增加从 Intranet 运行的代码的 CAS 权限,则它可能是完全信任的。听起来您实际上确实希望所有消费应用程序都以完全信任的方式运行。但是,这通常是 IT 决定,而不是开发人员决定,因此您可能应该在做出最终决定之前咨询他们。
  • 如果我的应用程序无法运行,我将不得不告诉 IT 他们必须在企业中的每台计算机上进行哪些更改才能使其正常运行。或者我可以更改我的应用程序以不导致安全错误。
猜你喜欢
  • 2014-11-10
  • 2012-12-29
  • 2013-08-22
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多