All,
我正在设计一个基于云的服务,该服务将提供执行客户提交的一些“插件”代码的选项。为了使这项工作正常进行,插件不能威胁系统完整性或有能力访问其他客户端的数据,这一点至关重要。
理想情况下,我希望客户端能够提交一个简单的 jar 文件(包含符合某些预定义接口的类),然后该文件将在沙箱中运行。
应允许客户端代码:
- 在单个线程上占用尽可能多的 CPU 时间
- 使用标准 java 类(例如 java.lang.Math、java.util.Random 等)执行任何计算
- 调用 jar 中捆绑的任何库(但必须受到相同的限制)
但我特别需要禁止以下行为:
- 产生新线程(以便可以公平地管理服务器资源!)
- 对文件系统/IO/网络的任何访问
- 对本机代码的任何访问
- 除了传递给客户端代码/由客户端代码创建的数据之外,对 JVM 中数据的任何访问
- 对 .jar 沙箱中的类以外的类的反射的任何访问
- 任何调用沙箱外部对象(标准 Java 库除外)方法的能力
是否可以通过自定义 ClassLoader / SecurityManager 设置来实现此目的?或者我需要开始寻找更复杂的解决方案(例如启动多个 JVM?)
在java中管理资源和限制资源是不可能的。您可以防止恶意代码访问系统资源(磁盘/网络等)或 JVM 本身,但是:
...
产生新线程(以便可以公平地管理服务器资源!)
- 如果我想恶意,我将在终结器线程中执行所有代码并阻止虚拟机。同样做
protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}}
再见新线程。
- 吃掉所有的记忆,吃掉所有的直接记忆等等。
- 访问我自己的 jar 中的 zip 文件,并期望它们被移走,因此 JVM 崩溃(由于 zlib 中的错误)
如果有人故意想要拒绝资源,那么试图抓住黑客就不是一项可行的任务。您需要知道要搜索什么,并在运行时动态检查/增强类以禁止该行为。
任何调用沙箱外部对象(标准 Java 库除外)方法的能力
什么是标准库?您是否知道他们是否/何时必须以特权方法执行某些代码?
每个客户 - 独立的虚拟机,具有完整的限制、进程关联性/优先级、包括最大内存/堆栈等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)