CA2122: не используйте косвенное представление методов с запросами компоновки
TypeName |
DoNotIndirectlyExposeMethodsWithLinkDemands |
CheckId |
CA2122 |
Категория |
Microsoft.Security |
Критическое изменение |
Не критическое |
Причина
Открытый или защищенный член имеет Требования связывания и вызывается членом, который не выполняет каких-либо проверок безопасности.
Описание правила
Запрос компоновки проверяет разрешения только непосредственно вызывающего метода.Если член X не предъявляет требований к безопасности своих вызывающих методов и вызывает код, защищенный запросом компоновки, вызывающий метод без необходимого разрешения может использовать X для доступа к защищенному члену.
Устранение нарушений
Добавьте безопасный Данные и модели в .NET Framework или запрос компоновки к члену, так чтобы он более не предоставлял небезопасный доступ к члену, защищенному запросом компоновки.
Отключение предупреждений
Чтобы отключить предупреждения из этого правила без последствий, необходимо удостовериться, чтобы код не предоставлял доступ к операциям или ресурсам, которые можно использовать небезопасным образом.
Пример
В следующих примерах показана библиотека, нарушающая правило, а также приложение, демонстрирующее слабость библиотеки.Пример библиотеки содержит два метода, которые вместе нарушают правило.Метод EnvironmentSetting защищен запросом компоновки для предоставления сборкам неограниченного доступа ко всем переменным среды.Метод DomainInformation не предъявляет требований к безопасности своих вызывающих методов, так как он вызывает EnvironmentSetting.
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
public class DoNotIndirectlyExposeMethodsWithLinkDemands
{
// Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
public static string DomainInformation()
{
return EnvironmentSetting("USERDNSDOMAIN");
}
// Library method with link demand.
// This method holds its immediate callers responsible for securing the information.
// Because a caller must have unrestricted permission, the method asserts read permission
// in case some caller in the stack does not have this permission.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public static string EnvironmentSetting(string environmentVariable)
{
EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
envPermission.Assert();
return Environment.GetEnvironmentVariable(environmentVariable);
}
}
}
Следующее приложение вызывает незащищенный член библиотеки.
using System;
using SecurityRulesLibrary;
using System.Security;
using System.Security.Permissions;
// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
class TestUnsecured
{
[STAThread]
static void Main(string[] args)
{
string value = null;
try
{
value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
}
catch (SecurityException e)
{
Console.WriteLine(
"Call to unsecured member was stopped by code access security! {0}",
e.Message);
throw;
}
if (value != null)
{
Console.WriteLine("Value from unsecured member: {0}", value);
}
}
}
}
В результате выполнения примера получается следующий результат: