Безопасность доступа к коду (CAS) в платформе Microsoft .NET - это решение Microsoft для предотвращения выполнения привилегированных действий ненадежным кодом. Когда среда CLR загружает сборку, она получает свидетельство сборки и использует его для определения группы кода , к которой принадлежит сборка. Группа кода содержит набор разрешений (одно или несколько разрешений ). Код, выполняющий привилегированное действие, будет выполнять запрос доступа к коду, что заставит CLR пройти вверх по стеку вызовов и проверить набор разрешений, предоставленных сборке каждого метода.в стеке вызовов. Группы кода и наборы разрешений определяются администратором машины, который определяет политику безопасности .
Свидетельство
Доказательством может быть любая информация, связанная со сборкой. По умолчанию для защиты доступа к коду .NET используются следующие свидетельства:
- Каталог приложения: каталог, в котором находится сборка.
- Издатель: цифровая подпись издателя сборки (требуется, чтобы сборка была подписана через Authenticode ).
- URL : полный URL-адрес, с которого была запущена сборка.
- Сайт: имя хоста URL / удаленного домена / VPN.
- Зона: зона безопасности, в которой находится сборка.
- Хеш : криптографический хэш сборки, который определяет конкретную версию.
- Строгое имя: комбинация имени сборки, версии и открытого ключа ключа подписи, используемого для подписи сборки. Ключ подписи - это не сертификат X.509 , а настраиваемая пара ключей, созданная инструментом строгого именования SN.EXE или Visual Studio .
Разработчик может использовать настраиваемое свидетельство (так называемое свидетельство сборки), но для этого требуется написать сборку безопасности, а в версии 1.1 [ требуется пояснение ] .NET это средство не работает.
Свидетельства, основанные на хэше сборки, легко получить в коде. Например, в C # свидетельство может быть получено с помощью следующего предложения кода:
это . GetType (). Сборка . Свидетельство
Политика
Политика - это набор выражений, которые используют свидетельства для определения членства в группе кода. Группа кода предоставляет набор разрешений для сборок в этой группе. В .NET есть четыре политики:
- Предприятие: политика для семейства машин, которые являются частью установки Active Directory .
- Машина: политика для текущей машины.
- Пользователь: политика для вошедшего в систему пользователя.
- AppDomain: политика для домена исполняемого приложения.
Первые три политики хранятся в файлах XML и управляются с помощью .NET Configuration Tool 1.1 (mscorcfg.msc). Окончательная политика администрируется с помощью кода для текущего домена приложения.
Безопасность доступа кода будет представлять свидетельство сборки для каждой политики, а затем будет принимать пересечение (то есть разрешения, общие для всех сгенерированных наборов разрешений) в качестве разрешений, предоставленных сборке.
По умолчанию политики Enterprise, User и AppDomain предоставляют полное доверие (то есть они позволяют всем сборкам иметь все разрешения), а политика Machine является более строгой. Поскольку пересечение занято, это означает, что окончательный набор разрешений определяется политикой компьютера.
Обратите внимание, что система политик была удалена в .NET Framework 4.0. [1]
Кодовая группа
Группы кода связывают часть свидетельства с именованным набором разрешений. Администратор использует .NET Configuration Tool, чтобы указать конкретный тип свидетельства (например, сайт) и конкретное значение для этого свидетельства (например, www.mysite.com), а затем определяет набор разрешений, который будет использоваться группой кода. предоставляется.
Требования
Код, выполняющий какое-либо привилегированное действие, потребует одного или нескольких разрешений. Требование заставляет CLR обходить стек вызовов, и для каждого метода среда CLR гарантирует, что требуемые разрешения находятся в предоставленных разрешениях сборки метода. Если разрешение не предоставлено, возникает исключение безопасности . Это не позволяет загруженному коду выполнять привилегированные действия. Например, если сборка загружается с ненадежного сайта, сборка не будет иметь никаких разрешений ввода-вывода файла, и поэтому, если эта сборка попытается получить доступ к файлу, вызовет исключение, предотвращающее вызов.