代码之家  ›  专栏  ›  技术社区  ›  ecleel

Java有缓冲区溢出吗?

  •  105
  • ecleel  · 技术社区  · 17 年前

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

    10 回复  |  直到 17 年前
        1
  •  114
  •   Michael Borgwardt    15 年前

    由于Java字符串基于char数组,Java会自动检查数组边界,因此缓冲区溢出只可能在异常情况下发生:

    1. 如果您通过JNI调用本机代码
    2. JVM本身(通常用C++编写)
    3. 解释器或JIT编译器无法正常工作(Java字节码强制进行边界检查)
        2
  •  28
  •   Brian Rasmussen    17 年前

    Java和C#等托管语言没有这些问题,但实际运行代码的特定虚拟机(JVM/CLR/等)可能会出现这些问题。

        3
  •  13
  •   coobird    17 年前

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

    Java有数组 bounds checking 其将检查数据不能从所分配阵列之外的区域访问。当试图访问超出数组大小的区域时 ArrayOutOfBounds 将引发异常。

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

        4
  •  10
  •   Richard Chambers    7 年前

    是和否。不,因为它是一个托管内存模型,所以你不能真正创建错误的缓冲区溢出漏洞。但是,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解包实用程序的应用程序可能允许 不受信任的小程序或应用程序升级权限。例如, 不受信任的小程序可能会授予自己读写权限 本地文件或执行可访问的本地应用程序 运行不受信任的applet的用户。

      孙感谢“摄政王”与iDefense合作 VCP( http://labs.idefense.com/vcp/ )谷歌的克里斯·埃文斯 提请我们注意这些问题。

    • 在Sun Java开发工具包(JDK)和Java运行时环境(JRE)中发现了多个漏洞。 https://security.gentoo.org/glsa/200705-23

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

        5
  •  9
  •   ShuggyCoUk    17 年前

    从严格意义上讲,覆盖堆栈或堆本身的缓冲区溢出需要以下两种情况之一:

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

    缓冲区溢出是指您的代码使用缓冲区,您的代码负责正确解析它,但可能会失败。 例如,您可能会编写一个XML解析器,有人可能会向您提供一个格式错误的(或合法但不常见的)请求,由于解析器的设计,该请求会用一些有效负载覆盖之前验证的数据,从而导致您的应用程序行为不佳。

    后一种形式不太可能,但一个编写糟糕的sql字符串清理函数(广泛分布,存在这样的问题)将是一个诱人的目标。

        6
  •  4
  •   Mendelt    17 年前

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

        7
  •  3
  •   falstro    17 年前

    正如已经指出的那样,Java作为一种语言,对所有内存访问进行了边界检查,如果这里有错误,则是JVM而不是程序出了问题。然而,应该注意的是,这与Java中的内存泄漏有相似之处;虽然不可能破坏堆栈,但错误位置的ArrayOutOfBoundsException如果处理不当,最终仍可能会破坏系统。

        8
  •  3
  •   Tim Howland    17 年前

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

        9
  •  3
  •   Tom Hawtin - tackline    17 年前

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

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

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

    IIRC, StringBuffer 曾经有过这样的bug,但你对此无能为力。

        10
  •  1
  •   Alex Kulinkovich    8 年前

    JAVA的一个关键特性是安全性。用解释型语言编写的程序不易受到缓冲区溢出漏洞的攻击,但您总是可以在解释器本身中导致缓冲区溢出。 尽管这将是困难的。同样,Python也是一种解释型语言,不会发生缓冲区溢出。