JVM的沙盒脚本语言吗?

时间:2018-09-25 17:06:58

标签: java scripting jvm sandbox graalvm

我想为我们的用户提供在服务器端编写某些脚本的功能。 (我们的应用程序面向开发人员)。我希望他们能够在我们的应用程序中调用一些函数,创建变量,并执行基本的循环和分支。不过,我希望将它们的脚本放到沙盒中,以便它们不会爆发并写入磁盘或打开网络连接,也不会破坏应用程序的内部。可以将其视为一个SQL存储过程:您可以与服务器交互,但不能与外界交互。

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

几年前,我使用Rhino开始了类似的事情,但事实证明我无法对其进行沙箱处理。使用GraalJS很高兴,但是我不能确定它是否可以沙盒化。有一些关于阻止恶意代码(https://www.graalvm.org/docs/graalvm-as-a-platform/embed/#reliable-timeouts-for-malicious-code)的参考,但是看起来JS脚本仍然可以访问宿主应用程序中的所有内容。

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:0)

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