Microsoft Script Control — Блокирует доступ скриптов к системе?

#wpf #vb.net #security

#wpf #vb.net #Безопасность

Вопрос:

Я разрабатываю коммерческую VB.net Приложение WPF, которому требуются созданные пользователем сценарии для управления приложением, которые будут совместно использоваться пользователями. Лучший способ, с которым я сталкивался до сих пор, чтобы выполнить это без написания собственного синтаксического анализатора, — это использовать Microsoft Script Control.

Похоже, что как VBScripts, так и JScripts, выполняемые через этот элемент управления, имеют доступ к wscript и, как следствие, слишком мощные, чтобы делиться ими между программистами и нетехническими пользователями по очевидным причинам безопасности.

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

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

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

РЕДАКТИРОВАТЬ: я основываю свой вывод о том, что элемент управления слишком мощный для этого, на том факте, что следующий код JScript успешно запускает notepad при вызове с использованием .Добавьте код и .Запустите методы элемента управления.

 function test(){
    var shell = new ActiveXObject("WScript.shell");
    shell.run("notepad.exe", 1);
}
  

Спасибо за всю помощь,

Сэм.

Комментарии:

1. re: Похоже, что как VBScripts, так и JScripts, выполняемые через этот элемент управления, имеют доступ к wscript — я не верю, что это правда. Что приводит вас к такому выводу?

2. Ну, я изначально пришел к тому же выводу, что и вы, но когда я создал небольшое тестовое приложение, которое взяло скрипт, который использовал его в качестве строки, загрузил и запустил его, он, похоже, сработал. Хотя я сделал это поздно ночью… Черт, я буду ненавидеть себя, если я ошибся: D Тестирование снова сейчас…

3. Я могу подтвердить, что он слишком мощный в своей текущей форме, см. Редактирование выше.

Ответ №1:

Если вам просто нужно отключить функцию ActiveXObject, которая является точкой входа в систему, вы можете автоматически добавить несколько строк к коду, который вы предоставляете элементу управления скриптом, например, так:

 ActiveXObject = null; // add this silently

function test(){
    var shell = new ActiveXObject("WScript.shell"); // this will now fail
    shell.run("notepad.exe", 1);
}
  

Конечно, если вам все еще нужно предоставить некоторые функции своим пользователям, вам нужно будет предложить какой-то API, использовать функцию AddObject (см. Как использовать метод AddObject элемента управления скриптом), и пользователь будет использовать его следующим образом:

 ActiveXObject = null; // add this silently

function test(){
   // this is a controlled method, because I have added a MyAPI named object
   // using AddObject, and this object has a OpenNotepad method.
   MyAPI.OpenNotepad();
}
  

PS: WScript — это хост для сценариев ActiveX, поэтому он недоступен из элемента управления скриптом.

PS2: Этот взлом работает не на всех языках, лежащих в основе Script Control. Это работает в JavaScript, но не в VBScript, например.

Комментарии:

1. Спасибо, я подумал, что может быть такое решение. Я знаю, как обращаться со всеми вещами AddObject. Но могут ли быть другие способы, которыми пользователь мог бы получить тот же эффект без ActiveXObject? Я просто немного опасаюсь внесения в черный список, а не в белый.

2. Я не думаю, что есть какой-либо другой способ, кроме ограничения пользователя стандартными мерами безопасности Windows (UAC, права и т. Д.). Но ActiveXObject является эффективным черным списком. Без этого вы не сможете причинить большого вреда, поскольку Javascript был разработан в основном для браузеров, поэтому он явно изолирован. И это существует только в реализации Microsoft Javascrit.

3. Хорошо, спасибо, хорошо, если блокировки ActiveXObject достаточно, тогда это кажется хорошим решением и избавило бы меня от необходимости беспокоиться о лицензировании и прочем, используя Jint или что-то в соответствии с предложением Джо Уайта.

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

Ответ №2:

Из вашего вопроса не похоже, что вы уделили какое-либо внимание какому-либо из существующих движков сценариев с открытым исходным кодом. Я бы предположил, что эти библиотеки с открытым исходным кодом могли бы решить вашу проблему с изолированной средой намного проще, чем Microsoft Script Control.

Насколько я понимаю, ваши требования:

  • Должна быть возможность передавать объекты из вашей программы в среду сценариев, чтобы скрипт мог использовать эти объекты для взаимодействия с хост-приложением.
  • Не должно быть разрешено выполнять небезопасные действия, такие как доступ к файлам, запуск приложений, создание COM-объектов и т.д.

Учитывая эти требования, у вас есть довольно много вариантов.

Первое, что приходит на ум, — это Jint, интерпретатор JavaScript с открытым исходным кодом, написанный на .NET, который вы можете встроить в свое приложение. Вы можете передавать объекты .NET в скрипт. По умолчанию скрипт может фактически обращаться к любому классу в .NET Framework, но по умолчанию скрипт изолирован (используя .В СЕТИ встроена защита доступа к коду), поэтому скрипт не может делать ничего небезопасного. (Например, он может использовать такие вещи, как StringBuilder или Regex, но он получит исключение, если попытается использовать FileStream.) Если вы хотите, вы можете отключить .Доступ к СЕТИ полностью, но даже при его включении, песочница по умолчанию, вероятно, будет соответствовать вашим потребностям.

Если по какой-либо причине Jint не соответствует вашим требованиям, некоторые другие программы с открытым исходным кодом JavaScript-for-.NET движки, о которых я могу думать с самого начала, — это Jurassic, IronJS и JavaScript .NET.

Если для вас это важно, Jint, Jurassic и IronJS доступны через NuGet.