Как пометить сборку .net как безопасную? - PullRequest
18 голосов
/ 10 января 2012

Как пометить сборку как "безопасную"?

В качестве альтернативы, как Visual Studio может сообщить мне, когда что-то в моей сборке не является "безопасным"?


Иногда вы не можете использовать сборку, если она не «безопасна» (например, из SQL Server ).

Я бы хотел, чтобы моя сборка была помечена как безопасная.Если моя сборка не может быть помечена как безопасная, потому что она небезопасна, я хотел бы узнать, как я могу знать, что моя сборка небезопасна.


В Visual Studio есть некоторые концепции, которые, кажется, связаныдля безопасности это может иметь или не иметь никакого отношения к «безопасной» сборке:

  1. Разрешить небезопасный код опция сборки:

    enter image description here

    • Что разрешено, если я отмечаю опцию allow небезопасный код ?
    • Что не разрешено, если я сниму флажок с разрешения Опция небезопасного кода ?
    • Какое отношение, если таковое имеется, к "небезопасному коду" связано с тем, что сборка является "безопасной"?

      (спрашиваю, потому что моя сборкане «разрешает небезопасный код», но разрешает вызовы P / Invoke - что, как я думал, было определением «небезопасно»)

  2. ClsCompliant опция сборки:

    [assembly: CLSCompliant(true)]
    namespace MyApplication
    
    • Какое отношение, если таковое имеется, имеет ли код "совместимость с CLS" к сборке?bly быть "безопасным"?
  3. небезопасный кодовый блок:

    int error;
    unsafe
    {
        error = 0x80004005;
    }    
    

    код внутри блока unsafe "unsafe "

  4. UnsafeNativeMathods

    Microsoft рекомендует создать класс с именем UnsafeNativeMethods, содержащий небезопасный управляемый код:

    [SuppressUnmanagedCodeSecurity]
    internal static class UnsafeNativeMethods
    {
       ...          
    }
    

    Это отличается от SafeNativeMethods:

    [SuppressUnmanagedCodeSecurity]
    internal static class SafeNativeMethods
    {
       ...          
    }
    

    , который содержит безопасные собственные методы, и NativeMethods:

    internal static class SafeNativeMethods
    {
       ...          
    }
    

    , которые содержат собственные методы.

Как пометить сборку как "безопасную"?

Как SQL узнает, что сборка "небезопасна"?

Ответы [ 4 ]

26 голосов
/ 10 января 2012

Как пометить сборку как "безопасную"?

Вы думаете об этом неправильно.

Кто-то, кто, по вашему мнению, возможно, хочет убить вас, протягивает вам бутылку и говорит: «Выпей это». Вы говорите "это безопасно пить?" Парень говорит «прочти бутылку». Ты сделаешь. На нем написано "БЕЗОПАСНО ПИТЬ".

Вы пьете это?

Является ли жидкость безопасной для питья или нет, не имеет никакого отношения к тому, что написано на этикетке бутылки! Вполне возможно положить бензин в бутылку с надписью «БЕЗОПАСНО ПИТЬ».

Вы парень, раздающий бутылку с подозрительной жидкостью серверу SQL , и SQL Server говорит: «Я не доверяю ни одной метке, которую вы собираетесь поставить на эту сборку». Скорее, это сделает сборку «безопасной», ограничив возможности сборки. Он блокирует разрешения для этой вещи, так что любая попытка вашей сборки использовать SQL-сервер приведет к ее завершению через исключение.

Как узнать, что в моей сборке что-то не "безопасно"?

Попробуйте запустить его с низким уровнем доверия. Он рухнул и умер за исключением безопасности? Если ответ «да», то это не безопасно в соответствии с этим уровнем доверия . Различные уровни доверия предоставляют разные уровни разрешений. Код, который вы устанавливаете на своем компьютере, как правило, полностью доверенный, код, который вы запускаете из своей корпоративной сети, менее надежен, код, который вы запускаете из Интернета, вряд ли является доверенным вообще. Код, который вы запускаете на сервере SQL, получает наименьший уровень доверия из всех; он думает, что почти все небезопасно.

Что разрешено, если я отмечаю опцию разрешить небезопасный код?

Затем вы можете написать код, который напрямую манипулирует необработанными указателями в памяти способом по своему выбору. Это требует полного доверия; на вашу сборку должны быть наложены ограничения no , если вы хотите использовать небезопасный код. Небезопасный код может изменить каждый бит памяти пользовательского режима в процессе.

Какое отношение, если таковое имеется, имеет отношение к "совместимому" коду кода с тем, что сборка является "безопасной"?

Ничего, кроме того факта, что CLS-совместимый код не допускает API, которые принимают необработанные типы указателей.

CLS - это подмножество общих языков - набор функций, которые должны присутствовать на всех совместимых языках .NET. Таким образом, вам не нужно спрашивать себя: «Эй, если я напишу этот метод, который принимает int и возвращает строку в C #, могу ли я вызвать его из F #?» Если вы ограничиваете себя в соблюдении правил CLS, вы знаете, что любой язык CLS может использовать вашу библиотеку, и вы можете использовать CLS-совместимые библиотеки независимо от того, на каком языке они были написаны. Это не имеет никакого отношения к безопасности.

Код внутри небезопасного блока «небезопасный»

Код внутри небезопасного блока может произвольно повредить память в течение всего процесса, если он написан неправильно. Мы заставляем вас помечать код как «небезопасный», чтобы вы знали, где сосредоточить свои усилия по проверке кода. В небезопасном блоке вы , а не язык C # несете ответственность за обеспечение безопасности типов и памяти.

Вопрос, который вы не задавали:

Что означает пометить сборку как "безопасную для частично доверенного абонента"?

Это ситуация, когда вы делаете помечаете сборку как "безопасную". Помечая сборку с помощью AllowPartiallyTrustedCallerAttribute (APTCA), вы, автор сборки, утверждаете, что если код в сборке вызывается враждебным кодом с низким уровнем доверия, который пытается атаковать пользователя, то в вашей сборке ничего нет который враждебный код с низким уровнем доверия может использовать против пользователя. Короче говоря, вы говорите: «Даже если пользователь полностью доверяет мне, мой код не является оружием, которое злой код может использовать против пользователя».

Мы изобрели APTCA, потому что когда-то мы с Питером Торром обнаружили, что есть способ для враждебных вызывающих абонентов, у которых было низкое доверие, обмануть код JScript.NET - который по умолчанию был высоким - таким способом что код низкого доверия может заставить код JScript.NET атаковать пользователя от его имени. (Это обычно называется «атаку заманиванием», потому что код с низким уровнем доверия «заманивает» код с высоким уровнем доверия к выполнению за него грязной работы.)

В качестве лишь небольшой части большого усилия, направленного на то, чтобы такого рода ошибки больше не повторялись, команда CLR представила APTCA. Помещая APTCA на сборку, вы говорите своим пользователям, что заявляете, что их доверие к вашей работе не может быть использовано вредоносным сторонним кодом. Не помещайте APTCA в сборку, если (1) вы не намереваетесь , чтобы сборка вызывалась кодом, который, по мнению пользователя, может быть враждебным, и (2) вы фактически провели тщательный анализ безопасности.

К счастью, новая модель безопасности, основанная на прозрачности, в значительной степени устраняет необходимость в APTCA.

Если APTCA не присутствует в сборке, тогда «требование ссылки» обеспечит полное доверие к коду, вызывающему вашу сборку. Обратите внимание, что это потребность в ссылке , а не полная потребность .

12 голосов
/ 10 января 2012
  • При чтении из этого"Safe" для SQL Server представляет собой:

SAFE - это наиболее ограниченный набор разрешений.Код, выполняемый сборкой с разрешениями SAFE, не может получить доступ к внешним системным ресурсам, таким как файлы, сеть, переменные среды или реестр

, поэтому его разрешение на выполнение кода установлено в кодовом домене SQL Server

  • Unsafe флаг VS не имеет ничего общего с безопасностью выполнения кода, но позволяет неуправляемое выполнение кода.Так что это около интеграции неуправляемого кода в базу управляемого кода

  • CLS Compilant, как определено здесь о определении кода сборки, отмеченной этим атрибутом, как код, соответствующий руководству CSL (Common Language Specification).Итак, это о архитектуре компиляции и кода .

Как пометить сборку как "безопасную"?

Itопределяется в первой ссылке в этом ответе и имеет отношение к интеграции с SQL Server.

Как SQL узнает, что сборка «небезопасна»?

С учетом предоставленного описания: «Создает модуль управляемого приложения, который содержит метаданные класса и управляемый код в видеобъект в экземпляре SQL Server ", SQL Server передает metadata, который в некоторых полях предоставляет информацию о том, является ли он" безопасным "или нет.

2 голосов
/ 10 января 2012

SQL в этом случае ищет код, который вы завернули в «небезопасный» блок.Вот MSDN указатель на небезопасное ключевое слово

http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

0 голосов
/ 10 января 2012

Зависит от того, что вы имеете в виду, но если вы импортируете сборку (т.е. .dll), в свойствах этого файла .dll есть опция «разблокировать». Это позволит вам использовать DLL в качестве ссылки.

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