【问题标题】:How does one run Java 8's nashorn under a SecurityManager如何在 SecurityManager 下运行 Java 8 的 nashorn
【发布时间】:2014-06-14 22:00:51
【问题描述】:

我正在寻找沙盒 Java 8 的 Nashorn javascript 引擎。我已经发现了 --no-java 标志,这很有帮助,但我还发现以下链接说需要“在启用 SecurityManager 的情况下运行”:http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-September/002010.html

我还没有找到说明如何使用 Nashorn 完成此操作的文档,那么应该如何安全地完成此操作?

【问题讨论】:

标签: security sandbox java-8 nashorn


【解决方案1】:

java 命令不同,似乎无法通过在jjs 命令行上设置java.security.manager 属性来启用安全管理器。 (这可能是一个错误。)但是,您可以从 JavaScript 调用 Java API 来启用安全管理器。在 Java 中,这是

System.setSecurityManager(new SecurityManager());

在 JavaScript/Nashorn 中几乎是一样的,只是你提供了完全限定的类名:

java.lang.System.setSecurityManager(new java.lang.SecurityManager())

(或者,您可以导入名称。)您可以将此行放入您的应用程序脚本中,也可以将其放入您在应用程序脚本之前放置在jjs 命令行上的脚本中。

例子:

$ cat userhome.js
print(java.lang.System.getProperty("user.home"))
$ jjs userhome.js
/Users/xyzzy
$ cat secmgr.js
java.lang.System.setSecurityManager(new java.lang.SecurityManager())
$ jjs secmgr.js userhome.js
Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.home" "read")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
    [...snip...]

在命令行上设置策略文件确实有效:

$ cat all.policy
grant {
    permission java.security.AllPermission;
};
$ jjs -Djava.security.policy=all.policy secmgr.js userhome.js
/Users/xyzzy

或者您可以在启用安全管理器之前添加等效的 setProperty 调用:

$ cat secmgr.js
java.lang.System.setProperty('java.security.policy', 'all.policy')
java.lang.System.setSecurityManager(new java.lang.SecurityManager())

【讨论】:

  • 可以在jjs命令行中开启安全管理器 "jjs -J-Djava.security.manager -J-Djava.security.policy=all.policy" ,另外调试日志也可以也可以启用,“jjs -J-Djava.security.manager -J-Djava.security.policy=all.policy -J-Djava.security.debug=access,failure,policy”
【解决方案2】:

可以在启用安全管理器的情况下使用jjs 执行脚本。

jjs -J-Djava.security.manager myscript.js

jjs -J-Djava.security.manager

用于交互模式。请注意,如果您只使用 -Djava.security.manager,则该选项将由 jjs 工具处理。要将选项传递给 VM,您必须使用 -J 前缀。除了启动器工具“java”之外的任何其他 JDK bin 工具都是如此。

【讨论】:

    【解决方案3】:

    我知道您可能不再需要它了,但是对于那些来这里寻找一种在沙盒中运行 nashorn 的简单方法的人:如果您只是想防止脚本使用反射,请设置一个 ClassFilter。通过这种方式,您可以只允许使用一些可用的类……或者根本不使用。

    NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
    ScriptEngine scriptEngine = factory.getScriptEngine(
        new String[] { "--no-java" }, //a quick way to disable direct access to java API
        null, //a ClassLoader, let's just ignore it
        new ClassFilter() { //this one simply forbids use of any java classes, including reflection
            @Override
            public boolean exposeToScripts(String string) {
                return false;
            }
        }
    );
    

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 2018-11-30
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2013-05-31
      • 2018-09-19
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多