SecurityManager用于云服务“沙箱”

所有,

我正在设计基于云的服务,该服务将提供执行客户提交的一些“插件”代码的选项。 为了完成这项工作,插件不能威胁系统完整性或具有访问其他客户端数据的能力。

理想情况下,我希望客户端可以提交一个简单的jar文件(包含符合某些预定义接口的类),然后在沙箱中运行。

应允许客户端代码:

  • 在单个线程上占用所需的CPU时间
  • 使用标准java类(例如java.lang.Math,java.util.Random等)执行任何计算
  • 调用jar中捆绑的任何库(但必须遵守相同的限制)

但我特别需要禁止以下内容:

  • 产生新线程(以便可以公平地管理服务器资源!)
  • 对文件系统/ IO /网络的任何访问权限
  • 对本机代码的任何访问
  • 除了传递给客户端代码/由客户端代码创建的数据之外,对JVM中的数据的任何访问权限
  • 对除.jar沙箱中的类以外的类的reflection的任何访问权限
  • 除了标准Java库之外,还能够在沙箱外部的对象上调用方法

是否可以使用自定义ClassLoader / SecurityManager设置来实现此目的? 或者我是否需要开始寻找更复杂的解决方案(例如启动多个JVM?)

在java中无法管理资源和限制资源。 您可以阻止恶意代码访问系统资源(磁盘/网络等)或JVM本身,但:…

产生新线程(以便可以公平地管理服务器资源!)

  • 如果我想要恶意,我将在终结器线程中执行所有代码并阻止VM。 同样做protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}}再见新线程。
  • 吃所有的记忆,吃所有的直接记忆等。
  • 在我自己的jar中访问zip文件,并期望它们被移走,因此JVM崩溃(由于zlib中的bug)

如果一个人故意想要拒绝资源,那么试图抓住黑客就不是一个可行的任务。 您需要知道要搜索的内容并在运行时动态检查/增强类以禁止该行为。

除了标准Java库之外,还能够在沙箱外部的对象上调用方法

什么是标准库? 你知道他们是否/何时必须在特权方法中执行某些代码。


每个客户 – 具有完全限制的单独VM,进程关联性/优先级,包括最大内存/堆栈等。

我认为你想要实现的一切都可以通过自定义的SecurityManager来完成。 实际上它非常简单,你只需要创建一个扩展SecurityManager的类,实现两个checkPermission(..)方法,并在第一次迭代中为所有进入的东西抛出一个SecurityException (并记录你刚拒绝的内容)。 然后你允许特定的操作,直到你发现自己可以创建有用的插件并让你的客户玩它。 他们抱怨。 然后你必须判断是否允许他们做他们要求的任何事情,或者你是否想遵守你的规则。 这里困难的部分开始……