Методы 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
Использование библиотек из не вполне надежного кода