Прозрачный для системы безопасности код не может осуществлять подтверждение
Обновлен: Ноябрь 2007
TypeName |
SecurityTransparentCodeShouldNotAssert |
CheckId |
CA2128 |
Категория |
Microsoft.Security |
Критическое изменение |
Критическое |
Причина
Код, помеченный атрибутом SecurityTransparentAttribute, не обладает достаточными разрешениями для утверждения.
Описание правила
В этом правиле выполняется анализ всех методов и типов в сборки, которая либо на 100% прозрачная, либо смешанная (прозрачная и критическая); правило помечает декларативное и императивное использование Assert.
Во время выполнения любые вызовы Assert из прозрачного кода приведут к возникновению SecurityException. Это может произойти и в прозрачных на 100% сборках, и в смешанных сборках (прозрачных и критических), где метод или тип объявляется прозрачным, но включает декларативный или императивный вызов Assert.
В версии 2.0 .NET Framework представлена новая функция, которая называется прозрачность. Отдельные методы, поля, интерфейсы, классы и типы могут быть либо прозрачными, либо критическими.
При повышении привилегий безопасности использование прозрачного кода не допускается. Поэтому все предоставляемые и запрашиваемые разрешения автоматически передаются через код вызывающему объекту или основному домену приложения. Пример передачи включает элементы Assert, LinkDemand, SuppressUnmanagedCode и код unsafe.
Устранение нарушений
Чтобы устранить эту проблему, либо пометьте код, вызывающий Assert, как SecurityCritical, либо удалите Assert.
Отключение предупреждений
Не следует отключать вывод сообщений о нарушении данного правила.
Пример
Код выдаст сбой, если SecurityTestClass является прозрачным при создании методом Assert исключения SecurityException.
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
// SecurityTransparent
void SecurityTransparentMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Один из возможных вариантов — проверить код [SecurityTransparentMethod], и в случае, если [SecurityTransparentMethod] считается безопасным для передачи, пометить [SecurityTransparentMethod] как [SecurityCritical]. Для этого требуется полный, подробный и безошибочный аудит безопасности [SecurityTransparentMethod] и внешних вызовов в [SecurityTransparentMethod] в Assert:
using System;
using System.Security.Permissions;
namespace SecurityTestClassLibrary
{
public class SecurityTestClass
{
[System.Security.SecurityCritical]
void SecurityCriticalMethod()
{
new FileIOPermission(PermissionState.Unrestricted).Assert();
// perform I/O operations under Assert
}
}
}
Второй возможный вариант — удалить Assert из кода и направить все последующие запросы разрешений на ввод-вывод файлов за пределы [SecurityTransparentMethod] вызывающему объекту с проверкой безопасности. В этом случае аудит безопасности не нужен, поскольку запросы разрешений будут переданы вызывающему объекту или домену приложения. Управление запросами разрешений осуществляется посредством политики безопасности, среды размещения и разрешений кода.