Java 云服务安全管理器“;沙盒“;

Java 云服务安全管理器“;沙盒“;,java,security,architecture,plugins,cloud,Java,Security,Architecture,Plugins,Cloud,全部, 我正在设计一个基于云的服务,它将提供执行客户端提交的一些“插件”代码的选项。为了实现这一点,插件不能威胁系统完整性,也不能访问其他客户端的数据,这一点至关重要 理想情况下,我希望客户端能够提交一个简单的jar文件(包含一个符合预定义接口的类),然后在沙箱中运行 应允许客户端代码: 在单个线程上占用尽可能多的CPU时间 使用标准java类(例如java.lang.Math、java.util.Random等)执行任何计算 调用jar中绑定的任何库(但必须遵守相同的限制) 但我特别需要禁

全部,

我正在设计一个基于云的服务,它将提供执行客户端提交的一些“插件”代码的选项。为了实现这一点,插件不能威胁系统完整性,也不能访问其他客户端的数据,这一点至关重要

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

应允许客户端代码:

  • 在单个线程上占用尽可能多的CPU时间
  • 使用标准java类(例如java.lang.Math、java.util.Random等)执行任何计算
  • 调用jar中绑定的任何库(但必须遵守相同的限制)
但我特别需要禁止以下行为:

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

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

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

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

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

  • 如果我想成为恶意的,我将在终结器线程中执行所有代码,并阻止VM。同样的操作
    protectedvoidfinalize(synchronized(Thread.class){for(;;;)LockSupport.park();}}
    再见新线程
  • 吃掉所有的记忆,吃掉所有的直接记忆等等
  • 在我自己的jar中访问zip文件,并期望它们被移动,因此JVM崩溃(由于zlib中的错误)
如果有人故意拒绝资源,那么试图抓住黑客是不可行的。你需要知道搜索什么,并在运行时动态检查/增强类以禁止这种行为

对沙箱之外的对象(标准Java库除外)调用方法的任何功能

什么是标准库?您知道它们是否/何时必须以特权方法执行某些代码吗



每个客户-独立的虚拟机,有完整的限制,进程关联性/优先级,包括最大内存/堆栈等等。

这几乎就是dalvik的模型。你知道,这是一个很好的问题,我不确定。我会尝试找到它,并在这里抛出另一条评论。顺便说一句,我的意思是你建议的独立虚拟机实例就是dalvik在这种情况下所做的不清楚。