Вопрос

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

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

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

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

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

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

Подход к решению этого:

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

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

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

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

  • В-третьих, мы думали о открытии нового Appdomain, делая полностью доверяемую сборку GAC The Appdomains входной точкой входа, и запускайте что-либо внутри этого Appdomain - любая прогулка в стеке никогда больше не может добраться до частично доверенного звонящего - в нашей теории). К сожалению, мы не можем добиться этого ... или вновь созданное Appdomain не удается еще больше требований, даже если они настроятся для работы в разделе «MyComputer» Zones Security Zones доказательств или неограниченной безопасности. Я не могу четко предоставить полный доверие до целого приложения.

  • В-четвертых, используя касполь не вариант. (Из-за соображений развертывания)

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

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

Спасибо заранее

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top