CA2141: прозрачные методы не должны удовлетворять требования LinkDemand
TypeName |
TransparentMethodsMustNotSatisfyLinkDemands |
CheckId |
CA2141 |
Категория |
Microsoft.Security |
Критическое изменение |
Критическое изменение |
Причина
Прозрачный метод безопасности вызывает метод в сборке, не помеченный атрибутом AllowPartiallyTrustedCallersAttribute (APTCA), или прозрачный метод безопасности удовлетворяет требование SecurityAction().LinkDemand для типа или метода.
Описание правила
Удовлетворение требования LinkDemand является операцией, влияющей на безопасность, которая может привести к непреднамеренному повышению уровня привилегий. Прозрачный для системы безопасности код не должен удовлетворять требованиям LinkDemand, поскольку его не затрагивают те же требования аудита безопасности, как код, критичный в плане безопасности. Прозрачные методы в сборках набора правил безопасности уровня 1 приводят к тому, что все требования LinkDemands, которым они удовлетворяют, преобразуются в полные требования во время выполнения, что может вызвать проблемы с производительностью. В сборках с набором правил безопасности уровня 2 компиляция прозрачных методов в JIT-компиляторе завершится неудачно, если они будут пытаться удовлетворить требование LinkDemand.
В сборках, использующих уровень безопасности 2, попытки прозрачного метода безопасности удовлетворить требование LinkDemand или вызвать метод в сборке, не являющейся сборкой APTCA, вызывают исключение MethodAccessException; в сборках с уровнем безопасности 1 требование LinkDemand становится полным требованием.
Устранение нарушений
Чтобы устранить нарушение данного правила, отметьте метод доступа атрибутом SecurityCriticalAttribute или SecuritySafeCriticalAttribute или удалите LinkDemand из метода доступа.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Пример
В этом примере прозрачный метод пытается вызвать метод, который имеет требование LinkDemand. Это правило срабатывает на этот код.
using System;
using System.Security.Permissions;
namespace TransparencyWarningsDemo
{
public class TransparentMethodSatisfiesLinkDemandsClass
{
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public void LinkDemandMethod() { }
public void TransparentMethod()
{
// CA2141 violation - transparent method calling a method protected with a link demand. Any of the
// following fixes will work here:
// 1. Make TransparentMethod critical
// 2. Make TransparentMethod safe critical
// 3. Remove the LinkDemand from LinkDemandMethod (In this case, that would be recommended anyway
// since it's level 2 -- however you could imagine it in a level 1 assembly)
LinkDemandMethod();
}
}
}