0

我试图理解 FxCop CA2122 消息(可能在禁用这些可怜的东西之前),我显然已经超越了我对 .NET CAS 的理解。

该应用程序是一个 .EXE,标有 AllowPartiallyTrustedCallers。我们从代码分析中收到 CA2122 警告,抱怨我们未能将 LinkDemand 从最低级别的调用向上传播到本身具有 LinkDemand 的方法。

显然,我们可以将 LinkDemands 放在调用者身上,然后是调用者的调用者,无限循环。这似乎完全没有目的,因为此代码的每次调用都将始终是完全信任的,因此(AIUI)无论如何总会满足每个链接需求。Eric Lippert 似乎也认为这样做非常危险。

所以:

  • 我缺少什么汇编级属性来说“此代码只能在完全信任的情况下运行”?(我认为 AllowPartiallyTrustedCallers 的缺席暗示了这一点,但可能不适用于 .EXE)

  • 还是我应该关闭那个 CA 警告并继续前进?在禁用它们之前,我确实想正确理解它们...

更新:有人问我我们使用的是哪个框架版本——它是 2.0RTM,而且升级到那个点之后非常困难,因为它是在 XPe 平台上的。

4

2 回答 2

2

您认为程序集只会作为完全受信任的可执行文件运行的基本假设是错误的。没有什么可以阻止可以获取您的程序集的人将其用作恶意软件中的引用库程序集。如果您更改了机器的 CAS 策略以授予对您的程序集的完全信任,而不管它是如何部署的,那么恶意软件可能会使用您的程序集来执行它本来没有足够权限的操作。

这样做的结果是,无论您的预期部署场景如何,您确实应该做一些事情来阻止代表调用代码满足链接需求。鉴于您自己的目标是完全信任的场景,这实际上非常容易。 但是,确切的方法在很大程度上取决于您所针对的 .NET Framework 版本,您能否发布该详细信息?

对于 .NET 2.0,解决该问题的最简单方法是将 SecurityTransparentAttribute 或 SecurityCriticalAttribute 应用于您的程序集。默认情况下,这两个属性都会导致程序集中的代码变得安全透明,这意味着它不能代表其调用者执行诸如满足链接需求之类的事情。如果您的代码的某些部分需要执行安全透明代码所不允许的操作,则应在程序集级别使用 SecurityCriticalAttribute 而不是 SecurityTransparentAttribute,因为这将允许您将类型和/或成员显式提升为安全性-如果他们需要,则至关重要。(有关更多详细信息,请参阅链接。)

于 2010-11-05T13:04:11.450 回答
1

如果我理解正确:http: //msdn.microsoft.com/en-us/library/system.security.allowpartiallytrustedcallersattribute.aspx

链接需求属性告诉 .NET 强制执行该方法的完全信任规则。这也需要一个强名称。虽然您的应用程序树可能处于完全信任的环境中,但没有任何东西强制执行公共/受保护方法和类的规则。

AllowPartiallyTrustedCallers 告诉 .NET 你不在乎是谁调用它。

似乎 .NET 4 中的安全模型发生了变化。

于 2010-11-03T20:40:09.460 回答