我是不是需要担心仅完全信任的 .EXE 中的链接需求?

Posted

技术标签:

【中文标题】我是不是需要担心仅完全信任的 .EXE 中的链接需求?【英文标题】:Do I need to worry about link-demands in a full-trust only .EXE?我是否需要担心仅完全信任的 .EXE 中的链接需求? 【发布时间】:2010-11-03 20:03:30 【问题描述】:

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

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

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

所以:

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

或者我应该关闭那个 CA 警告然后继续吗?我确实喜欢在禁用它们之前正确理解它们......

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢你 - 我需要多想一下才能理解它,但如果这样可以让你提供更多有用的信息,我们将使用 .NET 2.0。 我已经编辑了我之前的回复以提供推荐的 .NET 2.0 方法。【参考方案2】:

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

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

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

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

【讨论】:

所以我想答案是肯定的,如果你想强制执行的话。但在公司内部环境中可能不值得付出努力。 谢谢你 - 我的(错误?)理解是,如果你添加 APTC,那么你需要强命名才能使其生效,但不想允许部分信任不需要强命名。

以上是关于我是不是需要担心仅完全信任的 .EXE 中的链接需求?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动化测试中等信任代码

部署完全信任的wpf浏览器应用程序(XBAP)

.htaccess 重定向仅在浏览器警告后执行

如何从网页 (asp.net) 启动 EXE

CA 颁发的仅信任特定证书 - Android

Keycloak - 如何允许在没有注册的情况下链接帐户