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

Внимание:

Более новые версии .Net и .Net ядра удалили и/или изменили "Безопасность доступа к коду" (CAS), поскольку этот вопрос задавали.

Оригинальный вопрос:

Я изучаю 70-536.NET Framework - Экзамен по разработке приложений, поскольку я программировал. сеть в течение многих лет, это не должно быть сложно!

Однако мне нужно узнать о "безопасности доступа к коду" (CAS), поскольку мне никогда не приходилось его использовать или настраивать, мне было интересно, нашел ли кто-нибудь еще для нее реальное использование?

Просьба привести примеры того, когда вы использовали CAS, и это было частью решения, а не проблемы.

(До сих пор все остальное имело какое-то отношение к задаче, которую я должен был делать в годы программирования .NET)


Связанные вопросы:


Результаты пока.

  • CAS полезен, когда вы принимаете сторонний код. Например. веб-хостинговая компания может использовать ее, чтобы остановить код клиента Asp.net, нанося ущерб серверам. (Office также использует его, когда .NET используется в качестве замены для VBA)

  • Единственный подробный пример его использования за пределами приложения Microsoft:

    Недавний проект, который я сделал, имел что-то аналогично: разрешить пользователю загружать библиотеки и проверить его на производительность ( "кто делает лучший алгоритм" ). Излишне говорить, что нам был необходим CAS есть.

  • CAS, по-видимому, полезно получить сертификацию JITDC, то есть, как это делает министерство обороны США, однако я не знаю, имела ли CAS какую-либо реальную ценность, или если это была просто галочка.

(Если вам нужно обойти хост, который использует CAS, и у вас есть права администратора на них, вы можете просто поместить свои сборки в GAC.)

В ожидании, CAS немного сложнее в .net 4.


По крайней мере, похоже, что новые экзамены Microsoft не будут иметь "базовый" экзамен, который включает CAS. Я не знаю, внесут ли они это в новые экзамены Winforms/WPF.

Ответ 1

Я часто сталкиваюсь с безопасностью доступа к коду в "реальном мире", часто, когда я меньше всего этого ожидаю. И каким-то образом SilverLight будет отличным применением в реальном мире, если бы не Silverlight решил не использовать CAS вообще конец.

Поставщики хостинга

В тех местах, где вы видите это в действии, требуется защищенная среда: сам ASP.NET, но хостинг-провайдеры ASP.NET используют модифицированную модель безопасности для предотвращения вторжения в свои драгоценные системы. Я знаю, что Webhost4Life использует это (на нем нет информации об этом, но я работал с ними, он там, действительно). Глядя далее, другие хостинг-провайдеры ASP.NET делают то же самое, но они не очень ясно об этом: поток на godaddy.com не изменить CAS (и нет ясности, что поддерживается, а что нет) или это связанное обсуждение 1 и 1. Некоторые облачные хостинговые сайты (rackspacecloud) приняли это немного дальше и "работали с Microsoft для модифицированного полного уровня доверия", что бы это ни было.

Вкратце: если вы найдете хост ASP.NET, скорее всего, они использовали CAS, чтобы вы не делали то, что вам не нужно делать. Они могут даже использовать его, делая разницу между "базовым" (многие ограничения) хостингом и хостингом "enterprise" (несколько ограничений), который придает CAS другой смысл.

Другие приложения CAS

Так много для нескольких реальных ситуаций, с которыми я столкнулся. Недавний проект, который я сделал, имел нечто похожее: разрешить пользователю загружать библиотеку и тестировать ее на производительность ( "кто делает лучший алгоритм" ). Излишне говорить, что нам очень нужен CAS. Другие примеры или интересные ресурсы:

  • NAR Loader (приложение для кодировки) использует его собственный CAS
  • LR Evaluator (также приложение codeproject) использует CAS
  • ClickOnce (см. ниже) использует CAS
  • Шаблоны проектирования CAS: популярность "предполагает" CAS используется
  • Понимание CAS: еще большая популярность и некоторые комментарии подразумевают приложения
  • Microsoft SharePoint использует CAS полностью, кажется (извините, я не специалист по SP)

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

CAS vs ClickOnce

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

ClickOnce использует CAS, чтобы программа не вызывала системные функции. Поэтому я считаю, что это, возможно, самое известное приложение, которое использует CAS.

Точка: вам нужно понять CAS, чтобы иметь возможность создавать что-то, что может запускаться непосредственно из общего ресурса, или вы игнорируете все это и используете ClickOnce.

Опрос Microsoft по CAS

В 2005 году Microsoft вызвала опрос, чтобы узнать, почему CAS был настолько непопулярным, надеясь улучшить его, чтобы он стал более применимым. К сожалению, я не смог найти результаты опроса, а затем этот пост несколько детализирует, почему CAS недостаточно используется.

CAS в другом мире

Этот пост, однако, указывает на интригующую нишу: CAS применяется к другому миру: Unix/Linux. Они не называют это CAS, вместо этого BitFrost. Как это для реального приложения: Проект "Один ноутбук на ребенка" , который полагается на BitFrost в качестве замены традиционной безопасности Unix модель.

Update:раздел о CAS в Unix/Linux в качестве BitFrost и раздел об опросе.
Обновление: добавлен раздел CAS vs ClickOnce
Обновление: добавлен список ресурсов с использованием CAS (и извинения за все эти обновления в строке!)

Ответ 2

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

В практическом использовании это в основном бессмысленно. Я думаю, что это слишком сложно, слишком мало поддерживается доступными инструментами для разработчиков, и большинство пользователей все равно не заботятся.

Конечно, есть исключения (правительства и клиенты, которые действительно знают .net/CAS), и я хотел бы сказать, что CAS абсолютно полезен и необходим, но реальность говорит на понятном языке.

Ответ 3

Примечание для читателя: см. два комментария ниже; это звучит так, будто я случайно раздувал определение CAS (неправильно), включая RBS. Я оставлю ответ здесь для справки, но обратите внимание на различие.


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

Полезной частью CAS RBS является основное разрешение, которое используется; конечно, ваш пользовательский интерфейс должен проверять доступ к функциям, но вы можете поместить (в свою логику с низким уровнем):

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }

Это будет соблюдено даже в полном доверии; вы можете определить своего собственного принципала (привязанного к пользователю), выполнив IPrincipal (посмотрите IsInRole()). И поскольку принципы поддерживаются в большинстве сред (winforms, webforms, mvc, wcf и т.д.), Это может сделать очень гибкий способ двойной проверки безопасности на бизнес-уровне без необходимости ссылаться на конкретную модель безопасности. Обратите внимание, что вышеуказанная проверка будет работать в любой среде.

Вы также можете использовать это, чтобы управлять своим пользовательским интерфейсом. У меня была почта Usenet, которая включала/отключила элементы управления winforms на основе принципала (используя свойства среды выполнения, чтобы указать роль для элемента управления, немного похожее на ToolTip и т.д.) - я не могу найти его в минуту, хотя (edit: возможно, этот).

Ответ 4

То, что нужно знать о безопасности доступа к коду, заключается в том, что он очень мало используется разработчику приложения, не понимая, как он используется, и на каком уровне разрешения для API вы можете звонить. Единственным исключением из этого, что я действительно нашел полезным, является CAS под названием PrincipalPermission, он в основном не позволяет выполнять определенный код, если правильная роль не определена для текущего Принципала. См. Это сообщение на нем:

http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/

Разработчики, которым действительно нужно обратить внимание на CAS и как они должны быть реализованы в их приложении, являются разработчиками инфраструктуры и кода. Поскольку существует определенный уровень доверия, который требуется требовать, чтобы приложение работало, особенно при работе с неуправляемыми ресурсами, такими как файлы, сетевые потоки, последовательные порты и т.д. Или, если вы создаете код для этого неуправляемого ресурса, например, сервером или любым видом низкоуровневого доступа к вашим сборкам, вы захотите создать некоторую защиту доступа к коду вокруг него, чтобы людям не разрешалось выполнять что-то, что им было категорически запрещено.

Это не помогает, что Microsoft на самом деле не выполнила большую работу, объясняя, как CAS следует использовать в ежедневном приложении. Так что это действительно причина отсутствия использования. Однако CAS является одной из многих причин того, что .NET является таким безопасным языком и страдает от гораздо меньшего количества проблем, чем его конкуренты.

Ответ 5

Я был инициатором разработки проекта, чтобы получить сертификацию JITC (Министерство обороны США) для решения на основе .NET и Настройки CAS тщательно анализировались во время сертификационных испытаний.

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

Если вы планируете получать сертификаты безопасности, CAS определенно может быть важным.

Ответ 6

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

Ошибка CAS Tamper-Proofing: последствия для лицензирования программного обеспечения

...

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

...

Ответ 7

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

Однако для кэширующего кода может потребоваться доступ к некоторым чувствительным классам или методам в сборке доступа к данным, к которым не должны иметь доступ потребители общего пакета. Поэтому эти классы и методы доступа к данным не могут быть public. Защищенные методы в сборке доступа к данным с подклассами в кэширующей сборке могут обойти некоторые случаи, но часто это приводит к злоупотреблению наследованием. Возможно, было бы более элегантно оставить их public с помощью LinkDemands, размещенных на вызывающих абонентах, для пользовательского разрешения (например, DataPackagePermisson), которое администраторы предоставили бы только кеширующей сборке.

Ответ 8

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

  • Мы собрали все наши сборки, используя сильное имя.
  • Мы создали cas-policy для всех сборок с нашим сильным именем и разрешили код, подписанный с нашим сильным именем, для запуска из локальной сети и локально размещенного кода.
  • Ассембли, загруженные из локальной сети, нуждающиеся в локальном доступе к файлам (компонент для записи данных), необходимые для получения атрибута link-demand для всех открытых классов.

С момента обновления .NET3.5 наши проблемы больше не существовали, поскольку код в локальной сети теперь обрабатывается как локальный код.