Поделиться через


CA2122: не используйте косвенное представление методов с запросами компоновки

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Категория

Microsoft.Security

Критическое изменение

Не критическое

Причина

Открытый или защищенный член имеет Требования связывания и вызывается членом, который не выполняет каких-либо проверок безопасности.

Описание правила

Запрос компоновки проверяет разрешения только непосредственно вызывающего метода. Если член X не предъявляет требований к безопасности своих вызывающих методов и вызывает код, защищенный запросом компоновки, вызывающий метод без необходимого разрешения может использовать X для доступа к защищенному члену.

Устранение нарушений

Добавьте безопасный Доступ к данным и их моделирование или запрос компоновки к члену, так чтобы он более не предоставлял небезопасный доступ к члену, защищенному запросом компоновки.

Отключение предупреждений

Чтобы отключить предупреждения из этого правила без последствий, необходимо удостовериться, чтобы код не предоставлял доступ к операциям или ресурсам, которые можно использовать небезопасным образом.

Пример

В следующих примерах показана библиотека, нарушающая правило, а также приложение, демонстрирующее слабость библиотеки. Пример библиотеки содержит два метода, которые вместе нарушают правило. Метод 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);
         }
      }
   }
}

После выполнения примера получается следующий результат.

  

См. также

Основные понятия

Правила написания безопасного кода

Требования связывания

Другие ресурсы

Доступ к данным и их моделирование