今天JVM中最接近真实(资源受限)隔离的是什么?

时间:2010-10-23 15:07:49

标签: java jvm distributed bytecode

提出以下情况:

  • 您有一个庞大而复杂的系统(分布式,并发,庞大的数据集),它支持许多用户。代码被发送到数据。
  • 您希望允许系统中的移动代码 - 即将在与系统其他部分相同的JVM中运行的不受信任的代码,以利用数据的位置,避免反序列化等。

您可以将代码放在一个有趣的类加载器中,并使用像applet runner那样的自定义安全策略。但仍有问题:

应该保护整个系统免受恶意代码的攻击 - 例如,产生大量线程,吞噬所有cpu,分配太多内存。

千禧年初的想法是JSR-121。隔离是为了带来进程隔离的大部分好处 - 限制cpu使用,线程产生,堆使用:一般资源分配。

鉴于这种努力似乎被Sun放弃了,我们目前最接近的是什么?

到目前为止,我的想法是:

  • 字节码转换代码以插入分配跟踪。 Google似乎做了类似的事情:http://code.google.com/p/java-allocation-instrumenter/。它需要一些工作,因为谷歌(约书亚)布洛赫自己进入一个角落,并使各种东西包装私人......
  • 还禁止调用安全管理器无法访问的内容,例如创建线程。
  • 将(罕见的)中断检查插入到循环和递归函数中,以便监视器线程可以监视(使用ThreadMXBean),如果花费太长时间,则中断有问题的线程。限制重入可能更简单 - 在对用户代码的任何调用中,基本块只能在中止之前输入n次。

有没有更好或现有的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

这是一个复杂的问题。我的第一个想法是创建一个特定于域的语言来完成“移动”用户所需的语言。 DSL无法执行危险操作。

上传不受信任的代码的人是谁?这听起来像一个可疑的想法开始。我们花了很多精力确保人们无法运行不受信任的代码; - )

答案 1 :(得分:1)

问题是隔离进程的唯一真正方法是拥有专用的机器/硬件。你做的任何其他事情都必须妥协。取决于这些妥协是可接受的,取决于是否与该代码共享JVM。

这不是一个问题,你可以通过一个微不足道的方式解决一般情况,因为你想要防止你没有想到的事情(其他人可能会想到的一天)