2

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

是否有任何用于 JVM 的预构建脚本语言可以做到这一点?我可以编写自己的 DSL,但工作量很大。

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

4

2 回答 2

1

来自:https ://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/Context.html

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

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

于 2018-09-26T06:45:55.840 回答
0

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

于 2018-09-25T20:06:21.040 回答