Java是否有缓冲区溢出? 如果是,你可以给我一些情景吗?
答案 0 :(得分:101)
由于Java Strings基于char数组而Java会自动检查数组边界,因此只有在特殊情况下才能实现缓冲区溢出:
答案 1 :(得分:24)
Java和C#等托管语言没有这些问题,但实际运行代码的特定虚拟机(JVM / CLR /等)可能会出现。
答案 2 :(得分:13)
出于所有意图和目的,没有。
Java有数组bounds checking,它将检查无法从分配的数组之外的区域访问数据。当一个人试图访问超出数组大小的区域时,将抛出ArrayOutOfBounds
异常。
如果存在缓冲区溢出,则可能是来自Java虚拟机中的错误,据我所知,这不是Java语言规范和Java虚拟机规范中编写的预期行为。< / p>
答案 3 :(得分:9)
是和否。不,因为它是一个托管内存模型,你无法真正创建错误的自己打开缓冲区溢出漏洞。但是,JVM和JDK中可能存在缓冲区溢出漏洞。请参阅Secunia咨询:
http://secunia.com/advisories/25295
或者看看以前几个JDK和JRE漏洞的旧建议:
Java运行时环境(JRE)中的整数和缓冲区溢出漏洞“unpack200”JAR解包实用程序可能导致权限升级https://download.oracle.com/sunalerts/1020225.1.html
Java Runtime中的整数和缓冲区溢出漏洞 环境(JRE),包括解压缩小程序和Java Web Start 使用“unpack200”JAR解包实用程序的应用程序可能允许 不受信任的小程序或应用程序以升级权限。例如, 不受信任的applet可以授予自己读写权限 本地文件或执行可访问的本地应用程序 用户运行不受信任的applet。
Sun感谢,“regenrecht”与iDefense合作 谷歌的VCP(http://labs.idefense.com/vcp/)和克里斯埃文斯 提请我们注意这些问题。
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文件。
答案 4 :(得分:9)
严格意义上的覆盖堆栈或堆本身的缓冲区溢出需要:
缓冲区溢出在某种意义上说,你有使用缓冲区的代码,你的代码负责正确解析它,但是不能这样做。 例如,您可能会编写一个XML解析器,有人可能会向您提供格式错误(或合法但不常见)的请求,由于您的解析器的设计会覆盖先前验证的数据,并且某些有效负载会导致您的应用程序表现不佳。
后一种形式的可能性较小,但编写得很糟糕的sql字符串清理函数广泛分布,有这样的问题,这将是一个诱人的目标。
答案 5 :(得分:4)
Java(和.Net)虚拟机捕获尝试在保留内存之外写入的代码。无法正确处理此问题的应用程序仍可能导致安全问题。如果恶意用户可以通过输入无效输入来触发异常,则可以进行拒绝服务攻击,例如。
答案 6 :(得分:3)
正如已经指出的那样,Java作为一种语言,必须检查所有内存访问,如果这里有错误,那么JVM就是错误而不是程序。但是,应该注意的是,这与Java中的内存泄漏类似。虽然不可能粉碎堆栈,但错误位置的ArrayOutOfBoundsException(未正确处理)可能仍然会导致系统崩溃。
答案 7 :(得分:3)
一个方法可能会写入一个它不想要的数组的有效条目,通常是通过整数溢出。
例如,以下内容不足以检查边界:
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC,StringBuffer
曾经有过这样的错误,但是没有任何有趣的东西可以用它做。
答案 8 :(得分:2)
如果您使用Java Native Interace(JNI)工具调用外部代码,并且外部代码存在可利用的问题,则可能会导致Java程序中的缓冲区溢出。这种情况相当罕见,因为大多数应用程序都尽可能避免使用JNI。
答案 9 :(得分:1)
JAVA的一个主要功能是安全性。用解释语言编写的程序不容易出现缓冲区溢出漏洞,但是您总是可以在Interpreter本身中导致缓冲区溢出。 虽然很难。类似地,Python也是一种解释型语言,可以避免缓冲区溢出。