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


Методы APTCA должны вызывать только методы APTCA

Обновлен: Ноябрь 2007

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

Категория

Microsoft.Security

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

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

Причина

Метод в сборке с атрибутом System.Security.AllowPartiallyTrustedCallersAttribute вызывает метод в сборке, не имеющий этого атрибута.

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

По умолчанию открытые или защищенные методы в сборках со строгими именами неявно защищены при помощи Требования связывания для полного доверия; только полностью доверенные вызывающие стороны могут получать доступ к сборке со строгим именем. Сборки со строгим именем, помеченные атрибутом AllowPartiallyTrustedCallersAttribute (APTCA), не имеют такой защиты. Атрибут отключает запрос ссылки, в результате чего сборка становится доступна для вызова без полного доверия, например ее может вызвать выполняющийся код из интрасети или Интернета.

При наличии атрибута APTCA в полностью доверенной сборке создается уязвимость безопасности, которую можно использовать в злонамеренных целях, если доверенная сборка выполняет код в другой сборке, в которой запрещены вызовы с частичным доверием. Если методы M1 и M2 соответствуют следующим условиям, то злоумышленники могут использовать метод M1, чтобы обойти запрос полностью доверенной ссылки, при помощи которого защищен метод M2.

  • M1 — открытый метод, объявленный в сборке с полным доверием с атрибутом APTCA.

  • M1 вызывает метод M2 вне сборки M1.

  • Сборка M2 не имеет атрибута APTCA и, следовательно, не должна выполняться взвывающими объектами (или от их имени) с частичным доверием.

Вызывающий объект с частичным доверием X может вызвать метод M1, что приведет к вызову методом M1 метода M2. Метод M2 не имеет атрибута APTCA, поэтому его непосредственный вызывающий объект (M1) должен соответствовать требованию ссылки с полным доверием; M1 имеет полное доверие и проходит эту проверку. Возникает риск безопасности, поскольку X не участвует в выполнении требования ссылки, защищающего M2 от недоверенных вызывающих объектов. Поэтому методы с атрибутом APTCA не должны вызывать методы, не имеющие этого атрибута.

Предотвращение нарушений

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

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

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

Пример

В следующем примере для демонстрации уязвимости, обнаруженной этим правилом, используются две сборки и тестовое приложение. Первая сборка не имеет атрибута APTCA и должна быть недоступна для вызывающих объектов с частичным доверием (M2 в описании выше).

using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;

// This code is compiled into a strong-named
// assembly that requires full trust and does 
// not allow partially trusted callers. 

namespace AptcaTestLibrary
{
   public class ClassRequiringFullTrust
   {
      public static void DoWork()
      {
        Console.WriteLine("ClassRequiringFullTrust.DoWork was called.");
      }
   }
}

Вторая сборка является полностью доверенной и допускает вызывающие объекты с частичным доверием (M1 в описании выше).

using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;

// This assembly executes with full trust and 
// allows partially trusted callers. 

[assembly:AllowPartiallyTrustedCallers]  

namespace AptcaTestLibrary
{
   public class AccessAClassRequiringFullTrust
   {
      public static void Access()
      {    
         // This security check fails if the caller 
         // does not have full trust. 
         NamedPermissionSet pset= new NamedPermissionSet("FullTrust");

         // This try-catch block shows the caller's permissions.
         // Correct code would either not catch the exception,
         // or would rethrow it.
         try 
         {
            pset.Demand();
         }
         catch (SecurityException e)
         {
            Console.WriteLine("Demand for full trust:{0}", e.Message);
         }
         // Call the type that requires full trust.
         // Violates rule AptcaMethodsShouldOnlyCallAptcaMethods.
         ClassRequiringFullTrust.DoWork();
     }
   }
}

Тестовое приложение (X в описании выше) обладает частичным доверием.

using System;
using AptcaTestLibrary;

// If this test is run from the local computer, it gets full trust by default.
// Remove full trust.
[assembly:System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse, Name="FullTrust")]

namespace TestSecLibrary
{
   class TestApctaMethodRule
   {
      public static void Main()
      {
          // Indirectly calls DoWork in the full-trust class.
          ClassRequiringFullTrust a = new ClassRequiringFullTrust();
          a.Access();
      }
   }
}

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

Demand for full trust:Request failed.
ClassRequiringFullTrust.DoWork was called.

Связанные правила

APTCA-типы должны расширять только базовые APTCA-типы

См. также

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

Сборки .NET Framework, отмеченные атрибутом AllowPartiallyTrustedCallersAttribute

Использование библиотек из не вполне надежного кода

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

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

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

Доступ к данным