Microsoft脚本控制 - 阻止脚本访问系统?

时间:2011-11-04 17:27:42

标签: wpf vb.net security

我正在开发一个商业VB.net WPF应用程序,它需要用户生成的脚本来控制用户之间共享的应用程序。到目前为止,我在没有编写自己的解析器的情况下完成此任务的最佳方法是使用Microsoft脚本控件。

看起来,通过此控件运行的VBScripts和JScripts都可以访问wscript,因此出于明显的安全原因,它们太强大了,无法在程序员和非技术用户之间共享。

我曾考虑尝试使用某种正则表达式解析来过滤掉危险的脚本,但这看起来风险太大而且容易规避。

那么,是否有某种方法可以使用此控件但阻止其对系统的访问,以便它可以仅用于控制我提供的对象?如果没有,有人可以推荐一种更好的方法吗?

我不特别介意脚本在这个阶段会使用什么语言,尽管有多个选项会很好。

编辑:我的结论是,对于以下JScript代码在使用控件的.AddCode和.Run方法调用时成功启动记事本这一事实,控件功能太强大了。

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

感谢所有帮助,
萨姆。

2 个答案:

答案 0 :(得分:2)

如果您只需要杀死作为系统入口点的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函数(参见How To Use the AddObject Method of the Script Control),用户会像这样:

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 Scripting 主机,因此无法从脚本控件中访问它。

PS2:此hack在每个脚本控件基础语言中都不起作用。它适用于JavaScript,但不适用于VBScript。

答案 1 :(得分:1)

从您的问题来看,您似乎没有考虑任何开源脚本引擎。我建议那些开源库可以比Microsoft脚本控件更容易解决您的沙箱问题。

我理解它的方式,你的要求是:

  • 必须能够将程序中的对象传递到脚本环境,因此脚本可以使用这些对象与主机应用程序进行交互。
  • 绝不允许进行访问文件,启动应用程序,创建COM对象等不安全的事情。

鉴于这些要求,您有很多选择。

首先想到的是Jint,一个用.NET编写的开源JavaScript解释器,可以嵌入到你的应用程序中。您可以将.NET对象传递给脚本。默认情况下,脚本实际上可以访问.NET Framework中的任何类,但是默认情况下脚本是沙箱(使用.NET的内置代码访问安全性),因此脚本无法执行任何操作不安全的。 (例如,它可以使用像StringBuilder或Regex这样的东西,但是如果它试图使用FileStream就会出现异常。)如果需要,可以完全禁用.NET访问,但即使启用它,默认沙箱也会可能适合您的需求。

如果由于某种原因Jint不符合您的要求,我可以想到的其他一些开源JavaScript-for-.NET引擎是Jurassic,{{3} }和IronJS

如果对你很重要,Jint,Jurassic和IronJS都可以通过NuGet获得。