云服务“沙盒”的安全管理器

7

大家好,

我正在设计一个基于云的服务,该服务将提供执行客户端提交的“插件”代码的选项。为了使其正常工作,必须确保插件无法威胁系统完整性或访问其他客户端的数据。

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

客户端代码应该被允许:

  • 在单个线程上使用尽可能多的CPU时间
  • 使用标准java类(例如java.lang.Math、java.util.Random等)执行任何计算
  • 调用在jar中捆绑的任何库(但必须受到相同限制)

但我需要明确禁止以下内容:

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

使用自定义ClassLoader / SecurityManager设置是否能够实现这一点?还是我需要开始寻找更复杂的解决方案(例如启动多个JVM)?

2个回答

4
管理资源和限制资源在Java中是不可能的。您可以防止恶意代码访问系统资源(磁盘/网络等)或JVM本身,但是:
...
产生新线程(以便可以公平地管理服务器资源!)
如果我想要恶意行为,我会将所有代码放在finalizer线程中,并阻止VM。同样做protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}}再见新线程。
吃掉所有内存,吃掉所有直接内存等。
访问我的jar文件中的zip文件,并期望它们被移走,这样JVM就会崩溃(由于zlib中的错误)。
如果有人故意想要拒绝资源,那么试图抓住黑客就根本不可行。您需要知道要搜索什么,并在运行时动态检查/增强类以禁止该行为。
除了标准Java库之外,任何调用超出沙箱范围的对象方法的能力
什么是标准库?您知道它们是否必须在特权方法中执行某些代码。
每个客户-单独的VM w /完全限制,进程亲和/优先级,包括最大内存/堆栈等。

这基本上就是Dalvik模型。 - Chris Thompson
你知道吗,那是一个非常好的问题,我不确定。我会尝试找到它并在这里添加另一个评论。顺便说一下,我指的是如果不清楚的话,Dalvik所做的就是使用单独的VM实例。 - Chris Thompson

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接