Инструмент для ограничения полномочий .Net-сборок

.NET*
Представляю сообществу простой, но полезный инструмент для управления полномочиями доступа к коду .Net сборок – Managed Sandbox. На утилиту советую обратить внимание НЕ только разработчикам, но и всем кто периодически использует .Net программы из не доверенных источников (с небольшими оговорками, но об этом ниже).



Статья состоит из 2-х частей: (1) немного философии о системе безопасности .Net-платформы, (2) описание утилиты Managed Sandbox и причин, почему нужно было ее создавать.



Часть 1. Немного философии. Почему никто не использует широкие возможности управляемого кода по ограничению прав исполнения для обеспечения безопасности?

Вопрос довольно интересный. Сама идея управляемого кода: пожертвовать скоростью исполнения, скоростью загрузки и памятью ради того, чтобы иметь полный контроль над кодом. Полный контроль подразумевает, что мы точно знаем, что именно сделает код и можем запретить ему определенные действия. Практически данная «управляемость» используется лишь для системных целей: разделение контекстов внутри одного процесса, для управления процессом сборки мусора и пр.

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

Есть несколько причин, почему сложилась подобная ситуация в мире .Net:

1. 90% .Net программ требуют неограниченных полномочий (т.н. FullTrust). Это связано с тем, что большинство программ используют старые неуправляемые компоненты и библиотеки. К примеру, если вы в своем .Net приложении будете использовать WebBrowserControl – вашей сборке потребуются неограниченные полномочия.

2. Т.к. нет удобных инструментов для контроля доступа к коду (чтобы эти инструменты могли использовать простые пользователи) – никто сильно не задумывался о создании сборок, которые умеют работать с ограниченными правами. Кстати, в .Net 2.0 по умолчанию подписанные библиотеки нельзя было вызывать не имея FullTrust (в .Net 4.0 исправили).

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

Часть 2. Зачем нужно создавать утилиту Managed Sandbox, если есть стандартная утилита .Net Configuration от MS, позволяющая ограничивать полномочия кода? В чем разница между программами?

Главная причина – утилита .Net Configuration от MS не очень (точнее очень НЕ) удобна в использовании (про caspol лучше помолчу):

1. Для запуска сборки с ограниченными полномочиями сначала нужно создать новую группу кода, а уж затем определить полномочия для этой группы. После использования программы эти настройки нужно удалить, дабы не засорять конфигурационный файл.
2. .Net Configuration привязывается к версии .Net платформы (для каждой версии платформы нужна своя программа).
3. .Net Configuration позволяет управлять лишь частью полномочий (доступно 19, всего 30). Остальные, видимо, нужно задавать вручную в XML-файле.
4. Ко всему прочему утилита довольно сложна: для ее использования нужно знать основы безопасности .Net. Предназначена она для продвинутых программистов и админов, но никак не для обычных пользователей.

Managed Sandbox намного проще в использовании: нужно лишь выбрать сборку и указать необходимые полномочия исполнения. С этим, пожалуй, сможет справиться любой продвинутый пользователь. Технически для ограничения полномочий используется отдельный домен приложения с соответствующими правами исполнения, конфигурационный файл не изменяется.

Managed Sandbox находится в разработке, многие полномочия пока нет возможности детализировать. Если кто-нибудь захочет принять участие в разработке – милости прошу.

Скачать программу: managedsandbox.codeplex.com/releases/view/51827
Скачать исходный код: managedsandbox.codeplex.com/SourceControl/list/changesets
+9
4 сентября 2010, 20:17
25
dkukushkin 20,4

комментарии (10)

–1
c2hk #
Данная программа слабо учитывает факторы «окружающей среды». Гораздо эффективнее использовать систему прав ОС.
0
dkukushkin #
ОС — это неуправляемый код. Последняя попытка написать ОС с использованием управляемого кода (Singularity), насколько мне известно, успехом не увенчалась.

На уровне современной ОС можно очень грубо, в сравнении с управляемым кодом, управлять правами.

Если мы захотим средствами ОС ограничить доступ ко всем файлам на диске С и D для определенной программы — нам прийдется создавать специальную учетную запись (под которой будем в дальнейшем запускать программу) и явно устанавливать права для этой учетки. Кстати, установка прав для пользователя занимает не мало времени.
+3
raptor #
Singularity это не попытка написания ОС. Это исследовательский проект MS Research что бы понять как бы выглядела ОС сегодня, если бы в ее основу закладывалась не скорость, а безопансность. С этой задачей, я считаю они справились. Отдельные решения этого прокта, возможно войдут в Windows. Но сингулярити никогда не задумывалась как ос для какого-либо реального использования.
0
raptor #
*порезал палец… на некоторые буквы не попадаю :(
–2
c2hk #
Как я понимаю, цель программы — обеспечение безопасности. Ну так давайте её обеспечивать в полной мере, а не костылями. Фактически все интерфейсы для этого есть, (для установки прав на NTFS — «System.Security.AccessControl», для управлением пользователями — «System.DirectoryServices». Идеологически можно было бы совсестить данные виды защит и например встроить в контекстное меню шелла. Продвинутый пользователь и так сможет себе настроить учетку и запустить виртуальные машины для теста, а вот простой обыватель — вряд ли (о выборочном запуске .net-софта для него не может быть и речи).
0
suglosta #
Мне кажется, идеальный вариант такой:
Пользователь устанавливает общией правила (возможно используя рекомендованные шаблоны).
Если программа хочет использовать функции из запрещенных стандартным шаблоном — появляется окно для пользователя с объяснением что именно она хочет и предложением разрешить или запретить.
Только как это реализовать…
+1
c2hk #
Такое возможно только когда есть возможность перехвата (фактически получаем отладчик). В итоге получаем крайне низкую производительность и общую нестабильность.
+1
dkukushkin #
Данный функционал в некоторой степени предоставляют «программы проактивной защиты». К примеру, Comodo Internet Security. Но т.к. код неуправляемый — 100% гарантии что все будет перехвачено нет.
+2
dkukushkin #
Для управляемого кода это сделать можно без проблем. Можно даже доработать сабжевую программу, и запускать все управляемые программы с ее помощью с настройками по умолчанию.

Проблема лишь в том что управляемых программ очень мало.
+1
shai_hulud #
Такое возможно, выдать минимум прав и добавлять по мере необходимости.
Но даже для .NET это будет набор хуков. Хотя с .NET проще, надо ловить деманды, ассерты…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.