沙盒 JSR-223

2022-09-04 04:12:07

我正在尝试沙盒 JSR-223。具体来说,我不希望任何脚本有权访问我的任何类。(我听说Rhino可以用ClassShutter做到这一点,但我通常想这样做,即对于JSR-223的所有脚本引擎)。

我首先尝试使用该解决方案,根本没有传递任何权限。它适用于大多数权限,但脚本仍然可以访问我的所有公共类(它似乎忽略了“包访问”权限...?)。AccessController.doPrivileged

我发现了这个。我的问题是:如何在脚本引擎上安装自定义类加载器?(或者如果有必要,如何全局替换 ClassLoader?


答案 1

ScriptEngineManager有一个构造函数,它采用类加载器。类装入器用于装入脚本引擎实现。由于类继承其类装入器,因此脚本引擎及其创建的任何对象也应使用该类装入器。

该类装入器需要否认任何未列入白名单的类的存在。

使用自定义的 SecurityManager 进行补充,以便您可以根据正在使用的类装入器进行访问检查。

编辑:这是我在Java中的沙盒犀牛上找到的一篇文章。其中大部分也应该适用于JSR-223。Sun的实现是Rhino的修改,所以可能会有一些差异。


答案 2

是否可以在单独的 JVM 中运行需要脚本引擎的应用程序部分?您可以使用不同的类路径(和安全管理器)启动脚本引擎 JVM,然后在 2 个 JVM 之间使用某种形式的轻量级消息传递。