【问题标题】:Does Java have buffer overflows?Java有缓冲区溢出吗?
【发布时间】:2010-10-03 13:01:23
【问题描述】:

Java 有缓冲区溢出吗? 如果是,你能给我一些场景吗?

【问题讨论】:

  • 一些库函数(在本机代码中实现)已知存在错误。尤其是在 Java 5 领域,许多 2D、声音或颜色配置文件的漏洞已经为人所知。

标签: java buffer-overflow buffer-overrun


【解决方案1】:

由于 Java 字符串基于 char 数组并且 Java 会自动检查数组边界,因此缓冲区溢出仅在不寻常的情况下才可能发生:

  1. 如果通过 JNI 调用本机代码
  2. 在 JVM 本身中(通常用 C++ 编写)
  3. 解释器或 JIT 编译器无法正常工作(Java 字节码强制边界检查)

【讨论】:

    【解决方案2】:

    Java 和 C# 等托管语言不存在这些问题,但实际运行代码的特定虚拟机 (JVM/CLR/etc) 可能。

    【讨论】:

    • C# 在不安全的上下文中可能会出现缓冲区溢出。 Java 作为一种语言完全禁止这样做(您必须通过 JNI 更改语言才能获得不受管理的指针访问)
    • 好点。使用不安全的 C#,您显然不再是一个舒适的管理世界中的沙盒。
    • 是的,即使您没有编写任何不安全的代码或进行任何互操作,您也可以使用可以做到的库。所以这是需要注意的事情。
    【解决方案3】:

    出于所有意图和目的,不。

    Java 有数组bounds checking,它将检查不能从分配的数组之外的区域访问数据。当尝试访问超出数组大小的区域时,将抛出ArrayOutOfBounds 异常。

    如果存在缓冲区溢出,则可能是 Java 虚拟机中的一个错误,据我所知,这不是 Java 语言规范或 Java 虚拟机规范中所写的预期行为。

    【讨论】:

      【解决方案4】:

      是和不是。不,因为它是托管内存模型,因此您不能真正错误地创建自己的缓冲区溢出漏洞。但是,JVM 和 JDK 中可能存在缓冲区溢出漏洞。请参阅此 Secunia 公告:

      http://secunia.com/advisories/25295

      或者查看这些关于以前几个 JDK 和 JRE 漏洞的旧公告:

      • Java 运行时环境 (JRE)“unpack200”JAR 解包实用程序中的整数和缓冲区溢出漏洞可能导致权限升级https://download.oracle.com/sunalerts/1020225.1.html

        Java 运行时中的整数和缓冲区溢出漏洞 具有解包小程序和 Java Web Start 的环境 (JRE) 使用“unpack200”JAR 解包实用程序的应用程序可能允许 不受信任的小程序或应用程序来提升权限。例如, 不受信任的小程序可能会授予自己读写权限 本地文件或执行可访问的本地应用程序 运行不受信任的小程序的用户。

        Sun 表示感谢,“regenrecht”正在与 iDefense 合作 VCP (http://labs.idefense.com/vcp/) 和 Google 的 Chris Evans 提醒我们注意这些问题。

      • 在 Sun Java Development Kit (JDK) 和 Java Runtime Environment (JRE) 中发现了多个漏洞。 https://security.gentoo.org/glsa/200705-23

        涉及“不正确使用系统”的未指明漏洞 课程”由富士通安全团队报告。此外, 来自 Google 安全团队的 Chris Evans 报告了整数溢出 导致与 JPG 或 BMP 一起使用的 ICC 解析器中的缓冲区溢出 文件,以及处理时对 /dev/tty 的错误 open() 调用 某些 BMP 文件。

      【讨论】:

        【解决方案5】:

        严格意义上的覆盖堆栈或堆本身的缓冲区溢出将需要:

        1. 框架中的一个错误(这些错误在过去已经存在,而且很可能会再次出现)
        2. JNI 的使用(本质上不再使用托管代码)

        从某种意义上说,缓冲区溢出是指您的代码使用缓冲区并且您的代码负责正确解析它但可能无法解析。 例如,您可能编写了一个 XML 解析器,并且有人可能会向您提供格式错误(或合法但不常见)的请求,由于您的解析器的设计会使用一些有效负载覆盖先前验证的数据,这会导致您的应用程序表现不佳。

        后一种形式不太可能,但编写不佳的 sql 字符串清理函数广泛分布,存在诸如此类的问题,这将是一个诱人的目标。

        【讨论】:

          【解决方案6】:

          Java(和 .Net)虚拟机捕获试图在保留内存之外写入的代码。不能正确处理此问题的应用程序仍会导致安全问题。例如,如果恶意用户可以通过输入无效输入来触发异常,他们就可以进行拒绝服务攻击。

          【讨论】:

            【解决方案7】:

            正如已经指出的那样,Java 作为一种语言,对所有内存访问进行了边界检查,如果这里出现错误,则说明 JVM 有问题,而不是程序有问题。但是,需要注意的是,这与 Java 中的内存泄漏类似;虽然无法粉碎堆栈,但 ArrayOutOfBoundsException 在错误的位置,没有得到正确处理,可能最终还是会搞砸你的系统。

            【讨论】:

              【解决方案8】:

              如果您使用 Java 本机交互 (JNI) 工具调用外部代码,并且外部代码存在可利用的问题,那么您可能会导致 Java 程序中的缓冲区溢出。这是相当少见的,因为大多数应用程序尽可能避免使用 JNI。

              【讨论】:

                【解决方案9】:

                一个方法可能会写入它不打算写入的数组的有效条目,通常是通过整数溢出。

                例如,以下内容不足以检查边界:

                /* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
                

                IIRC,StringBuffer 曾经有过这样的错误,但你无法用它做任何有趣的事情。

                【讨论】:

                • 什么足以检查界限?
                • @Broam: 0 &lt;= off &amp;&amp; 0 &lt;= len &amp;&amp; off &lt;= buff.length-len 我想。不要引用我的话。它看起来一样,但没有可能的溢出(在原始 off+len 中可能会变为负数,因此明显小于数组长度)。确保没有维护程序员曾经将其“整理”成明显的形式。我发现整数溢出非常令人困惑。不得不考虑一会儿,然后有一种挥之不去的怀疑是我弄错了。但是,当然,应该有另一个审阅者和原始程序员 - 在一起当然不可能出现错误! (不)
                • 我不得不盯着这个,但你是对的。 off + len 可能会溢出并换行...在 C 中。在 Java 中,除非我弄错了——在此之前你会得到一个溢出异常,对吧?
                • 没有。整数运算默默地环绕。 C# 有一个“模式”,在溢出时会抛出异常,但我认为它的使用并不多(如果你想使用它,你可能会考虑做正确的事情)。
                【解决方案10】:

                JAVA 的主要特性之一是安全性。用解释性语言编写的程序不容易受到缓冲区溢出漏洞的影响,但您总是可以在解释器本身中导致缓冲区溢出。 虽然会很困难。同样,Python 也是一种解释型语言,不会出现缓冲区溢出。

                【讨论】:

                  猜你喜欢
                  • 2015-12-16
                  • 1970-01-01
                  • 2010-11-11
                  • 1970-01-01
                  • 2013-08-31
                  • 2013-02-17
                  • 1970-01-01
                  • 2013-11-06
                  • 2013-04-11
                  相关资源
                  最近更新 更多