【问题标题】:Executing Java byte-code in a very restricted part of a running JVM在运行的 JVM 的一个非常受限的部分中执行 Java 字节码
【发布时间】:2012-12-20 18:18:07
【问题描述】:

有没有办法将一些 java 字节码运行到正在运行的 JVM 的一个特别受限的部分?我正在考虑访问非常小的内存(可能只有几十千字节)并且无法访问任何外部世界(除了那个内存)。

我们的目标是在这个安全的环境中执行一些用户提供的字节码,以使主机永远不会崩溃或泄漏来自恶意字节码执行的信息。

【问题讨论】:

    标签: java jvm bytecode


    【解决方案1】:

    您可以在安全沙箱中运行不受信任的字节码,并设置沙箱以防止与外界通信。当您运行不受信任的小程序时,这是浏览器驻留的 JVM 所做的……除了您需要更严格的沙箱限制。 (小程序沙箱不会阻止所有网络连接。)

    参考:How do I create a Java sandbox?

    但是,完全控制恶意代码的作用是不可能的。例如,如果它决定进入一个无限循环或分配一个巨大的数据结构,你的 JVM 的受信任部分没有防弹的方法来阻止它。如果 JVM、类库或沙箱中存在安全漏洞,那么流氓代码就有可能利用它。


    请注意,这些都不涉及将代码限制在 RAM 的特定区域。你不能在 Java 中做到这一点。

    【讨论】:

    • 1- 为避免无限循环,是否可以在单独的线程中运行不受信任的字节码并指定超时以完成其执行? 2-假设我愿意在执行字节码之前对其进行过滤,那么是否有一种防弹方法来避免分配巨大的数据结构?
    • @gsimard - 1) 不......因为如果超时到期,没有防弹方法可以杀死线程。 2)我想不出一种真正可行的方法。可以吗?
    • 1) 我明白了,Thread.stop() 已被弃用。 2) 过滤指令 anewarray、multianewarray、new 和 newarray 怎么样?当然,这意味着在具有预分配“输入/输出”变量等的环境中设置字节码。还是这又是个坏主意?
    • 1) 它已被弃用,因为它不安全,并且流氓代码很有可能利用它来损害 JVM 的其余部分。 2)这只处理流氓直接执行的数组分配。如果您将相同的过滤器应用于标准库代码,则可能会破坏受信任的代码。而且你可以在不使用数组的情况下创建一个巨大的数据结构......
    【解决方案2】:

    您可以使用JavaPathfinder (JPF) 进行此类练习。 JPF 是一个模型检查工具,它获取源代码/字节码并在自己的虚拟机中执行,您可以定义各种属性(无死锁、无限循环等)进行检查。

    JPF 作为独立工具运行,因此很难将其集成到您的应用程序中,但也许您可以从外部调用它,然后只查询结果。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2013-05-18
      相关资源
      最近更新 更多