JVM 的沙盒脚本语言?

Sandboxed scripting language for the JVM?

我想为我们的用户提供在服务器端编写脚本的能力。 (我们的应用程序是面向开发人员的)。我希望他们能够在我们的应用程序中调用一些函数、创建变量并执行基本的循环和分支。不过,我希望他们的脚本被沙盒化,这样他们就无法突破并写入磁盘或打开网络连接或破坏我们应用程序的内部结构。将它想象成一个 SQL 存储过程:您可以与服务器交互,但不能与外界交互。

是否有任何预构建的 JVM 脚本语言可以执行此操作?我可以编写自己的 DSL,但这需要大量工作。

几年前,我开始使用 Rhino 做类似的事情,但后来发现我无法正确地对其进行沙盒处理。很乐意使用 GraalJS,但我不知道它是否可沙盒化。有一些关于阻止恶意代码的参考(https://www.graalvm.org/docs/graalvm-as-a-platform/embed/#reliable-timeouts-for-malicious-code),但看起来 JS 脚本仍然可以访问主机应用程序中的各种东西。

您可能应该启动一个外部进程,因为即使运行时沙盒逻辑仍然可以尝试资源耗尽攻击(内存不足、堆栈溢出、不间断循环等)。一旦你这样做了,你就可以依赖操作系统的安全设施,例如linux.

上的 seccomp 和命名空间

发件人:https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/Context.html

Each context is by default isolated from all other instances with respect to both language evaluation semantics and resource consumption. By default a new context instance has no access to host resources, like threads, files or loading new host classes. To allow access to such resources either the individual access right must be granted or all access must be set to true.

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