Java JVM的沙盒脚本语言?

Java JVM的沙盒脚本语言?,java,scripting,jvm,sandbox,graalvm,Java,Scripting,Jvm,Sandbox,Graalvm,我想让我们的用户能够在服务器端编写一些脚本。(我们的应用程序面向开发者)。我希望他们能够在我们的应用程序中调用一些函数,创建变量,并进行基本的循环和分支。不过,我希望他们的脚本是沙盒式的,这样他们就不会爆发并写入磁盘,或者打开网络连接,或者破坏我们应用程序的内部结构。将其视为SQL存储过程:您可以与服务器交互,但不能与外部世界交互 有没有为JVM预先构建的脚本语言可以做到这一点?我可以写我自己的DSL,但那需要很多工作 几年前,我用Rhino开始了类似的事情,但结果证明我不能正确地对它进行沙箱处

我想让我们的用户能够在服务器端编写一些脚本。(我们的应用程序面向开发者)。我希望他们能够在我们的应用程序中调用一些函数,创建变量,并进行基本的循环和分支。不过,我希望他们的脚本是沙盒式的,这样他们就不会爆发并写入磁盘,或者打开网络连接,或者破坏我们应用程序的内部结构。将其视为SQL存储过程:您可以与服务器交互,但不能与外部世界交互

有没有为JVM预先构建的脚本语言可以做到这一点?我可以写我自己的DSL,但那需要很多工作


几年前,我用Rhino开始了类似的事情,但结果证明我不能正确地对它进行沙箱处理。我很乐意使用GraalJS,但我不知道它是否可以沙盒。有一些关于停止恶意代码()的参考,但看起来JS脚本仍然可以访问主机应用程序中的所有内容。

您可能应该启动外部进程,因为即使运行时沙盒逻辑也可能尝试资源耗尽攻击(内存不足、堆栈溢出、不间断循环等)。一旦做到这一点,您就可以依靠操作系统的安全设施,例如linux上的seccomp和名称空间。

来源:

默认情况下,每个上下文在语言评估语义和资源消耗方面都与所有其他实例隔离。默认情况下,新上下文实例无权访问主机资源,如线程、文件或加载新主机类。要允许访问此类资源,必须授予个人访问权限或将所有访问权限设置为true


简而言之:除非明确允许,否则通过PolyglotAPI嵌入的GraalJS无法访问任何本机资源。

谢谢,这是正确的答案,尽管我的直觉告诉我,可能有很多方法可以克服它。可能仅仅依靠它来避免无意中的用户错误,而不是故意的恶作剧。