【发布时间】:2012-01-08 01:01:54
【问题描述】:
我有一段代码:
public void MyMethod()
{
DirectoryEntry de;
...
de.AuthenticationType = AuthenticationTypes.Secure;
...
}
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