CS-Script предоставляет "песочницу" из коробки?
Я исследую cs-скрипт, и мне интересно, насколько он безопасен, из коробки. Я знаю, что сценарий загружается и выгружается динамически, но может ли этот сценарий избежать его выполняющейся сборки? то есть может ли он использовать отражение для доступа и создания экземпляров классов из других сборок в том же процессе?
Итак, мой вопрос: поставляется ли cs-script со встроенной системой безопасности по умолчанию или это не беспокоит?
2 ответа
Короче говоря: нет, CS-скрипт не предоставляет никаких функций безопасности из коробки.
Ответили здесь: /questions/38416940/c-load-sandboxed-assembly/38416951#38416951
Непосредственным привлекательным решением является использование.NET Sandbox. Он разработан именно для такого рода сценариев. Стандартная песочница CLR доступна для хост-приложения, выполняющего сценарии с CS-Script. Идея состоит в том, что вы инициализируете CAS перед загрузкой подозрительного скрипта, а остальное входит в обязанности CLR. И если вам нужно настроить права доступа к каталогам / файлам, вы делаете это с помощью инструментов CAS. Таким образом, сценарии являются "транспортировкой" для рутины, предоставляемой вашим пользователем. А CS-Script - это удобный механизм для реализации такого транспорта, но фактические проблемы безопасности решаются с помощью.NET Sendoxing, который имеет полный набор функций, охватывающих практически все возможные сценарии безопасности. В загружаемых CS-сценариях вы можете найти образец Sendboxing (\Samples\Sandboxing), который демонстрирует, как предотвратить сценарий от операций ввода-вывода из файла (например, создать файл).
Пример использования.Net Security Credentials с cs-script доступен по адресу: http://www.csscript.net/Samples.html (sandbox.zip)
Для безопасного выполнения ненадежного cs-скрипта (максимально изолированного) создайте новый AppDomain
с ограничениями безопасности, перед загрузкой скрипта (в новый домен приложения). Затем данные могут быть распределены между первичным доменом и доменом сценария. См. https://msdn.microsoft.com/en-us/library/bb763046%28v=vs.110%29.aspx
Если вы имеете в виду CS-Script в соответствии с http://www.csscript.net/, то да, он может ссылаться и вызывать другие сборки с обычным синтаксисом:
using MyOtherAssembly;
CS-Script использует неявную загрузку, чтобы попытаться определить, какую сборку загрузить, основываясь на пространстве имен в операторе using. Это не гарантированно работает при любых обстоятельствах, в этом случае вам нужно будет использовать явную загрузку, например, вы можете дать CS-Script директиву для явной загрузки требуемой сборки:
//css_ref "..\MyOtherAssembly.dll"
using MyOtherAssembly;
//css_ref - это специальный комментарий, который обрабатывается CS-Script как директива для загрузки сборки, в этом случае ссылка на сборку находится в родительском каталоге скрипта. Это выполняет ту же работу, что и ссылка на сборку в файле проекта для обычной сборки. Вы также можете использовать командную строку CS-Script для явной загрузки сборок.
Я также обнаружил, что вам не нужно использовать неявную или явную загрузку, если указанная сборка уже была загружена в домен приложений до вызова сценария. Я предполагаю, что CS-Script обнаруживает, что пространство имен уже существует в AppDomain, поэтому не беспокоится о неявной загрузке.
Более подробная информация о загрузке сборки приведена здесь: http://www.csscript.net/help/using_.net_assemblies.html.
Edit1: Вы не можете отключить неявную загрузку, но вы можете поместить сценарий в каталог без каких-либо других сборок, что не позволит неявной загрузке найти другие сборки. Сценарий по-прежнему сможет вызывать пространства имен, которые уже загружены. Но это только "безопасность по неизвестности"; Сама природа управляемого кода означает, что определенный человек всегда может получить доступ к вашему коду через рефлексию.