Предоставить FullTrust в доверенной сборке, вызываемой частичной доверительной сборкой - PullRequest
3 голосов
/ 05 марта 2010

представьте себе следующую среду: XBAP приложение, работающее в режиме частичного доверия (поведение по умолчанию; требовать полного доверия не вариант - но прежде чем вы спросите, , если полное доверие предоставляется XBAPвсе работает как положено ) ссылается на локально установленную сборку, которая находится в GAC.Для этого мы включаем опцию «AllowPartiallyTrustedCallers» для локальной сборки, а также предоставляется полное доверие.(представьте, что это какой-то локальный аналог подключения)

(кстати, мы знаем об аспектах безопасности при использовании атрибута AllowPartiallyTrustedCallers, но это выходит за рамки этого поста, простовсе равно)

Теперь, даже если наша локальная сборка GAC имеет полное доверие (мы можем проверить это, вызвав Assembly.GetExecutingAssembly().IsFullyTrusted в любое время), она не выполнит любые требования(неявный или явный), так как он вызывается вызывающим абонентом с частичным доверием (наш XBAP). (поправьте меня, если я что-то неправильно понимаю) .К счастью, мы можем сделать явные утверждения для получения разрешений внутри нашей локальной сборки GAC, например:

new System.Security.Permissions.FileIOPermission(.....).Assert();

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

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

Подход для решения этой проблемы:

  • То, о чем мы подумали в первую очередь, - это установление набора разрешений (PermissionSet) практически для любого разрешения перед работой с внешней библиотекой.Это почти работает, но похоже, что в какой-то момент все же возникает исключение безопасности - либо из-за того, что внешняя библиотека может запустить больше потоков, которые по какой-то причине перестали работать, либо из-за ее доступа к сборке входа - на самом деле мы не знаем1036 *

  • Во-вторых, мы попробовали следующий атрибут

[System.Security.Permissions.PermissionSet( System.Security.Permissions.SecurityAction.Assert, Name = "FullTrust")]

, он тоже не работал.

  • В-третьих, мы подумали об открытии нового AppDomain, превращении полностью доверенной сборки GAC в точку входа AppDomains и выполнении чего-либо внутри этого домена приложений - любой обход стека никогда не сможет достичь частично доверенного вызывающего - в нашемтеория).К сожалению, мы не можем этого достичь ... Или вновь созданный AppDomain не удовлетворяет даже более высоким требованиям, даже если он настроен для работы в зонах безопасности "MyComputer". Доказательства или неограниченная SecurityPermission.Я не могу явно предоставить полное доверие всему домену приложения.

  • В-четвертых, использование caspol не вариант.(из-за причин развертывания)

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

Чтобы получить это вточка: Как полностью доверенная сборка может установить полное полное доверие к вызываемым сборкам, останавливая все обходы стека для достижения частично доверенного вызывающего абонента?

большое спасибо Заранее

1 Ответ

3 голосов
/ 05 марта 2010

Глядя на документацию Microsoft в отношении разрешения Частично доверенных вызывающих абонентов для сборок с полным доверием Я не верю, что это будет возможно сделать.

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

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

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

...