Нужно ли беспокоиться о требованиях к ссылкам только для полного доверия .EXE? - PullRequest
1 голос
/ 03 ноября 2010

Я пытаюсь понять сообщения FxCop CA2122 (вероятно, перед отключением убогих вещей), и я явно перешагнул свое понимание .NET CAS.

Приложение - .EXE, не отмечено с помощью AllowPartiallyTrustedCallers.Мы получаем предупреждения CA2122 от Code Analysis, жалуясь на то, что мы не можем распространять LinkDemands вверх от самого низкого уровня вызовов к методам, которые сами имеют LinkDemands.

Очевидно, что мы можем обойти LinkDemands для вызывающих, а затем для вызывающих абонентовAd-Infinitum.Это кажется совершенно бесполезным, поскольку каждый вызов этого кода всегда будет полным доверием, и, следовательно, (AIUI) каждый запрос ссылки всегда будет выполняться в любом случае.Эрик Липперт, кажется, тоже считает, что это очень опасно.

Итак:

  • Какой атрибут уровня сборки я упускаю, чтобы сказать: «Этот код будет работать тольков полном доверии '?(Я думал, что отсутствие AllowPartiallyTrustedCallers 'подразумевает это, но, возможно, не для .EXEs)

  • Или я должен просто отключить это предупреждение CA и двигаться дальше?Мне нравится понимать их правильно перед тем, как отключить их ...

Обновление: меня спросили, какую версию фреймворка мы используем - это 2.0RTM, и его крайне сложно обновитьмимо этого пункта, потому что это на платформе XPe.

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Ваше базовое предположение о том, что сборка будет выполняться только как полностью доверенный исполняемый файл, неверно.Нет ничего, что могло бы помешать кому-то, кто может заполучить вашу сборку, использовать ее в качестве сборки библиотеки, на которую ссылаются, в части вредоносного ПО.Если вы изменили политику CAS компьютера, чтобы обеспечить полное доверие к вашей сборке независимо от того, как она развернута, то вредоносная программа потенциально сможет использовать вашу сборку для выполнения операций, для которых в противном случае она не имела бы соответствующих разрешений.

Результатом этого является то, что вы действительно должны сделать что-то, чтобы предотвратить удовлетворение требований ссылки от имени вызывающего кода, независимо от предполагаемого сценария развертывания.Учитывая, что вы сами нацелены на сценарий полного доверия, на самом деле это будет довольно легко. Однако точный подход во многом зависит от того, на какую версию .NET Framework вы нацеливаетесь, поэтому не могли бы вы опубликовать эту информацию?

Для .NET 2.0 - самый простой подход к адресациипроблема будет заключаться в применении SecurityTransparentAttribute или SecurityCriticalAttribute к вашей сборке.Оба атрибута приведут к тому, что код в вашей сборке станет прозрачным для безопасности по умолчанию, что означает, что он не может выполнять такие вещи, как удовлетворение требований ссылки от имени своих вызывающих.Если есть части вашего кода, которые должны делать вещи, которые не разрешены для прозрачного для безопасности кода, вы должны использовать SecurityCriticalAttribute вместо SecurityTransparentAttribute на уровне сборки, поскольку это позволит вам явно продвигать типы и / или элементы в security-критичность, если им это нужно.(Более подробно см. http://blogs.msdn.com/b/shawnfa/archive/2005/08/31/when-the-opposite-of-transparent-isn-t-opaque.aspx.)

1 голос
/ 03 ноября 2010

Если я правильно понимаю: http://msdn.microsoft.com/en-us/library/system.security.allowpartiallytrustedcallersattribute.aspx

Атрибуты требования Link указывают .NET на применение правила полного доверия для метода. Это также требует строгого имени. Хотя ваше дерево приложений может находиться в среде полного доверия, ничто не обеспечивает применения правила для открытых и защищенных методов и классов.

AllowPartiallyTrustedCallers сообщает .NET, что вам все равно, кто его вызывает.

Кажется, что модель безопасности изменяется в .NET 4.

...