【发布时间】:2010-10-03 13:01:23
【问题描述】:
Java 有缓冲区溢出吗? 如果是,你能给我一些场景吗?
【问题讨论】:
-
一些库函数(在本机代码中实现)已知存在错误。尤其是在 Java 5 领域,许多 2D、声音或颜色配置文件的漏洞已经为人所知。
标签: java buffer-overflow buffer-overrun
Java 有缓冲区溢出吗? 如果是,你能给我一些场景吗?
【问题讨论】:
标签: java buffer-overflow buffer-overrun
由于 Java 字符串基于 char 数组并且 Java 会自动检查数组边界,因此缓冲区溢出仅在不寻常的情况下才可能发生:
【讨论】:
Java 和 C# 等托管语言不存在这些问题,但实际运行代码的特定虚拟机 (JVM/CLR/etc) 可能。
【讨论】:
出于所有意图和目的,不。
Java 有数组bounds checking,它将检查不能从分配的数组之外的区域访问数据。当尝试访问超出数组大小的区域时,将抛出ArrayOutOfBounds 异常。
如果存在缓冲区溢出,则可能是 Java 虚拟机中的一个错误,据我所知,这不是 Java 语言规范或 Java 虚拟机规范中所写的预期行为。
【讨论】:
是和不是。不,因为它是托管内存模型,因此您不能真正错误地创建自己的缓冲区溢出漏洞。但是,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 文件。
【讨论】:
严格意义上的覆盖堆栈或堆本身的缓冲区溢出将需要:
从某种意义上说,缓冲区溢出是指您的代码使用缓冲区并且您的代码负责正确解析它但可能无法解析。 例如,您可能编写了一个 XML 解析器,并且有人可能会向您提供格式错误(或合法但不常见)的请求,由于您的解析器的设计会使用一些有效负载覆盖先前验证的数据,这会导致您的应用程序表现不佳。
后一种形式不太可能,但编写不佳的 sql 字符串清理函数广泛分布,存在诸如此类的问题,这将是一个诱人的目标。
【讨论】:
Java(和 .Net)虚拟机捕获试图在保留内存之外写入的代码。不能正确处理此问题的应用程序仍会导致安全问题。例如,如果恶意用户可以通过输入无效输入来触发异常,他们就可以进行拒绝服务攻击。
【讨论】:
正如已经指出的那样,Java 作为一种语言,对所有内存访问进行了边界检查,如果这里出现错误,则说明 JVM 有问题,而不是程序有问题。但是,需要注意的是,这与 Java 中的内存泄漏类似;虽然无法粉碎堆栈,但 ArrayOutOfBoundsException 在错误的位置,没有得到正确处理,可能最终还是会搞砸你的系统。
【讨论】:
如果您使用 Java 本机交互 (JNI) 工具调用外部代码,并且外部代码存在可利用的问题,那么您可能会导致 Java 程序中的缓冲区溢出。这是相当少见的,因为大多数应用程序尽可能避免使用 JNI。
【讨论】:
一个方法可能会写入它不打算写入的数组的有效条目,通常是通过整数溢出。
例如,以下内容不足以检查边界:
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC,StringBuffer 曾经有过这样的错误,但你无法用它做任何有趣的事情。
【讨论】:
0 <= off && 0 <= len && off <= buff.length-len 我想。不要引用我的话。它看起来一样,但没有可能的溢出(在原始 off+len 中可能会变为负数,因此明显小于数组长度)。确保没有维护程序员曾经将其“整理”成明显的形式。我发现整数溢出非常令人困惑。不得不考虑一会儿,然后有一种挥之不去的怀疑是我弄错了。但是,当然,应该有另一个审阅者和原始程序员 - 在一起当然不可能出现错误! (不)
JAVA 的主要特性之一是安全性。用解释性语言编写的程序不容易受到缓冲区溢出漏洞的影响,但您总是可以在解释器本身中导致缓冲区溢出。 虽然会很困难。同样,Python 也是一种解释型语言,不会出现缓冲区溢出。
【讨论】: