Блог Сергея Байдачного

Мой блог о технологиях

Сборки со строгим именем: повышение уровня безопасности приложения

5 комментариев

Всегда, рассказывая о сборках со строгим именем, я делал основной акцент на механизме развертывания подобных сборок.

Как Вы помните, при работе с неуправляемым кодом, все динамические библиотеки сохранялись в одной директории (System32). При этом не было никакого механизма хранения нескольких версий библиотек. Различить библиотеки можно было только по имени, которое совсем не информативно и не несет информации о версии, культуре и т. д.

С появлением .NET Framework ситуация кардинально поменялась.

С одной стороны, практически все управляемые библиотеки начали размещать в Глобальном кеше сборок (GAC), который представляет собой целый набор вложенных директорий, количество которых зависит от количества развернутых сборок. Так, каждой сборки соответствует своя директория. При этом задача развертывания ложится на вспомогательные утилиты, такие как gacutil.

С одной стороны, чтобы избежать путаницы, характерной для неуправляемых библиотек, сборки начали делить на два типа: сборки со строгим именем и сборки с нестрогим именем. Сборки с нестрогим именем размещаются только в директории самого приложения и не могут использоваться другими продуктами. Сборки со строгим именем могут быть развернуты в GAC и использоваться всеми приложениями системы. Основное различие между двумя типами сборок состоит в том, что для сборок со строгим именем в качестве имени учитывается не только имя файла (.dll), но и ряд других параметров, которые содержатся внутри сборки: версия сборки, культура сборки (языковая принадлежность) и цифровой ключ. Данные параметры позволяют развернуть несколько сборок с одинаковым именем, но с различными версиями или культурой. Таким образом, более старые приложения могут ссылаться на старые версии сборки, а новые – на более новые. Цифровой ключ позволяет полностью исключить тот вариант, когда две компании поставляют сборки с одним именем, версией и культурой.

Чтобы создать сборку со строгим именем, необходимо описать в коде несколько атрибутов Assembly, содержащих версию, культуру и ссылку на файл со сгенерированным ключом. Все это замечательно, но существует два важных правила, которые я забывал (больше не буду), рассказывая о сборках со строгим именем. Ведь, преимущество строгого имени, это не только гибкий механизм развертывания, но и дополнительная безопасность приложения.

Правило 1. Всегда старайтесь создавать сборки со строгим именем.

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

Это очень важный момент, так как многие атаки происходят как раз с помощью подмены одной из библиотек (особенно в веб-приложениях, где можно встретить неправильную конфигурацию прав доступа).

Сам я принимал участие в создании нескольких приложений, где сборки загружались динамически (например, сборка могла содержать новые отчеты, которые автоматически интегрировались в систему). При таком подходе, сборку подменить очень легко.

Правило 2. Ключ эффективен, если он содержится в безопасном месте.

Часто приходится сталкиваться с разработчиками, которые недовольны своим прошлым (текущим) местом работы и затаили обиду на работодателя. Например, работодатель может лишить сотрудника каких-то благ или премии, чтобы сохранить стоимость акций. Насколько сложно такому сотруднику сделать копию файла .snk и отправить его потенциальным взломщикам? Полагаю, что это не проблема вообще. Поэтому, подписывая Ваши сборки, храните ключ в надежном месте, а разработчикам выдайте открытую часть ключа, что позволит им использовать сборки без полной подписи.

Выделить открытую часть ключа можно следующей командой:

Sn.exe –p «ключ.snk» «открытый ключ.snk»

Настроить компьютеры разработчиков для игнорирования подписи можно с помощью команды:

Sn.exe –Vr «имя сборки» «открытый ключ»

Кроме этого нужно прописать атрибут [assembly: AssemblyDelaySign(true)], говорящий об отложенном подписании сборки.

Реклама

Written by Sergiy Baydachnyy

29.01.2010 в 15:08

Опубликовано в .NET Development, Security

Tagged with ,

комментариев 5

Subscribe to comments with RSS.

  1. […] Читать в моем блоге о технологиях Опубліковані Friday, January 29, 2010 3:12 PM від Sergiy Baydachnyy […]

  2. ни о чем, кусок MSDN

    Аноним

    29.01.2010 at 15:53

  3. Согласен что сборки обьязателько нужно подписывать строгим именем. В Code Analysis даже правило такое есть.

    Но есть одно но. Строгое имя со сборки снимается в несколько кликов потенциальным взломщиком, поэтому если для веб приложений это и может дать хоть какую-то большую толику защищенности то для настольных когда сборки устанавливаются на клиентской машине — это не дает повышения его уровня безопаности.

    Да, вызывающая сборка, которая имеет строгое имя, руганется на сборку где оно отсуствие. Но проблема с ней решается также просто как и с предыдущей. Строгое имя удаляется вообще. Думаю и для веб приложения подобный сценарий возможен, так как если уже злоумышленник получил возможность подмемнить одну сборку, то подменить другие не составит труда.

    Regfor

    03.02.2010 at 11:38

  4. Ну тут не все так просто. Если Вы можете заменить все приложение, то и морочится не нужно. Перезаписал своим — и делов:) А для веб — так Вы в GAC вряд ли доберетесь, а вот в bin директорию — есть варианты.

    Sergiy Baydachnyy

    03.02.2010 at 11:57


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: