【问题标题】:embedded Nashorn - sandboxing execution嵌入式 Nashorn - 沙盒执行
【发布时间】:2017-07-20 22:23:34
【问题描述】:

我想得到一个关于如何在 Java 应用程序中沙箱执行 Nashorn 的明确答案。

我见过“类似的问题”(我会提到),但最终似乎没有一个答案能解决我的担忧。

让我从定义开始。

假设我们从这个开始:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("map",new HashMap()); 
engine.eval(jsCode); // jsCode can access 'map' only.

我所说的“沙盒”是指确保 JavaScript 不能访问任何 java 对象,除了在范围中添加的对象。

所以下面的评估应该没问题。

engine.eval("map.toString()"); 
engine.eval("map.size()"); 
engine.eval("map.put('name','jeff'); "); 
engine.eval("map.getClass()"); 

但以下评估不会:

engine.eval("var m = new java.util.HashMap();"); // <-- stop accessing Java
engine.eval("map.getClass().forName('java.io.File'); "); // stop. it's trying to be sneaky

最后,我不关心这个:

engine.eval("while(1) {;}"); // this is impossible to detect. Maybe it's possible for this simple case... but sneaky users could make it impossible to detect... anyway this is not what I am asking. I am only concerned on accessing java objects.

所以通过沙盒,我打算阻止 jsCode 访问我未定义的 java 对象。

我看到这可能是一个潜在的解决方案:

jdk.nashorn.api.scripting.NashornScriptEngineFactory factory = new  jdk.nashorn.api.scripting.NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new jdk.nashorn.api.scripting.ClassFilter() {

    public boolean exposeToScripts(String s) {
        return false;
    }

});

但是直接访问以 jdk.* 开头的包是否“安全”?

我看到的另一种方法更神秘:

final ScriptEngine engine = 
   new NashornScriptEngineFactory().getScriptEngine(new String[] { "--no-java" }); 

我在这里看到了一个: Safely re-using sandboxed Nashorn containers

谁能告诉我?

【问题讨论】:

    标签: java nashorn scriptengine


    【解决方案1】:

    如果对您的应用程序有帮助,您可以使用 jdk.nashorn.api.scripting.* API。相同的 javadoc 在这里 -> https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/

    是的,--no-java 是防止脚本代码访问 java 包的选项。

    【讨论】:

    • 但是“--no-java”没有正式记录。当然不在javadoc中。这样做安全吗?
    • @sundararajan 有机会告诉我未来的版本是否会支持“--no-java”,或者它是否只是实验性的
    • 严格来说只有 jjs -help 显示的选项是 jjs 工具和 nashorn 支持的选项。但是,不太可能像那样删除选项。
    • 好的,非常感谢,那我就不用了。感觉好像在 nashorn 中没有正确解决安全问题。
    • 我不同意这种说法。解决了安全问题。如果您使用 SecurityManager 运行,则评估的所有脚本都在“沙箱”中。只有从特定 URL 加载的脚本才能被您的安全策略授予权限。类过滤是另一个主题 - 与安全性无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2014-02-02
    • 2014-10-22
    • 1970-01-01
    • 2014-10-20
    • 2011-01-10
    相关资源
    最近更新 更多