我想让我们的用户能够在服务器端编写一些脚本。(我们的应用是面向开发人员的)。我希望他们能够在我们的应用程序中调用一些函数,创建变量,并进行基本的循环和分支。我希望他们的脚本被沙箱,虽然,所以他们不能突破和写到磁盘,或打开网络连接或污垢与我们的应用程序的内部。把它想象成一个SQL存储过程:您可以与服务器交互,但不能与外部世界交互。
是否有任何预先为JVM构建的脚本语言可以做到这一点?我可以写我自己的DSL,但这是很多工作。
几年前,我开始用犀牛做类似的事情,但事实证明,我不能正确地用沙箱把它装好。我很乐意使用GraalJS,但我不知道它是否是可沙箱的。有一些关于停止恶意代码(https://www.graalvm.org/docs/graalvm-as-a-platform/embed/#reliable-timeouts-for-malicious-code)的引用,但是看起来JS脚本仍然可以访问主机应用程序中的各种东西。
发布于 2018-09-26 06:45:55
来自:https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/Context.html
默认情况下,在语言计算语义和资源消耗方面,每个上下文都与所有其他实例隔离。默认情况下,新的上下文实例无法访问主机资源,如线程、文件或加载新的宿主类。为了允许对这些资源的访问,必须授予单独的访问权限,或者必须将所有访问设置为true。
简而言之:通过GraalJS嵌入的PolyglotAPI不能访问任何本机资源,除非显式允许。
发布于 2018-09-25 20:06:21
您可能应该启动外部进程,因为即使是运行时沙箱逻辑也可能尝试资源耗尽攻击(内存不足、堆栈溢出、不间断循环等)。一旦这样做,您就可以依赖操作系统的安全设施,例如linux上的seccomp和名称空间。
https://stackoverflow.com/questions/52503442
复制相似问题