Answers:
诸如Java和C#之类的托管语言没有这些问题,但是实际运行代码的特定虚拟机(JVM / CLR / etc)可能会出现这些问题。
出于所有意图和目的,不可以。
Java具有数组边界检查功能,它将检查无法从分配的数组之外的区域访问数据。当尝试访问超出数组大小的区域时,ArrayOutOfBounds
将引发异常。
如果存在缓冲区溢出,则可能是Java虚拟机中的一个错误引起的,据我所知,这不是Java语言规范或Java虚拟机规范中编写的预期行为。
是的,没有。不,因为您不能真正创建错误地使自己面临缓冲区溢出漏洞,因为它是托管内存模型。但是,JVM和JDK中可能存在缓冲区溢出漏洞。请参阅此Secunia咨询:
http://secunia.com/advisories/25295
或者查看有关以前的几个JDK和JRE漏洞的这些旧建议:
Java运行时环境(JRE)中的整数和缓冲区溢出漏洞“ unpack200” JAR Unpacking Utility可能导致特权升级https://download.oracle.com/sunalerts/1020225.1.html
使用“ unpack200” JAR拆包实用程序解压缩小程序和Java Web Start应用程序的Java运行时环境(JRE)中的整数和缓冲区溢出漏洞可能允许不受信任的小程序或应用程序提升特权。例如,不受信任的小程序可能会授予自己读取和写入本地文件或执行运行不受信任的小程序的用户可以访问的本地应用程序的权限。
Sun感谢与iDefense VCP(http://labs.idefense.com/vcp/)和Google的Chris Evans 一起工作的“ regenrecht” 引起了我们的注意。
Sun Java Development Kit(JDK)和Java Runtime Environment(JRE)中已发现多个漏洞。https://security.gentoo.org/glsa/200705-23
富士通安全团队报告了一个未指定的漏洞,涉及“系统类的错误使用”。此外,Google安全团队的Chris Evans报告了整数溢出,导致与JPG或BMP文件一起使用的ICC解析器中的缓冲区溢出,以及在处理某些BMP文件时对/ dev / tty的错误open()调用。
从严格意义上来说,覆盖堆栈或堆本身的缓冲区溢出将需要:
从某种意义上说,您有使用缓冲区的代码,并且您的代码负责正确解析缓冲区,但这样做可能会导致缓冲区溢出。例如,您可能编写了XML解析器,并且有人可以向您提供格式错误(或合法但不常见)的请求,由于解析器的设计,该请求会使用一些有效负载覆盖先前验证的数据,这会导致您的应用程序行为异常。
后一种形式不太可能,但是写得不好的sql字符串清除函数分布广泛,但存在诸如此类的问题是一个吸引人的目标。
方法有可能通常通过整数溢出将其不打算写入的有效条目写入数组。
例如,以下内容不足以检查界限:
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC StringBuffer
曾经有一个类似的错误,但是您无法使用它做任何有趣的事情。
0 <= off && 0 <= len && off <= buff.length-len
我想。不要引用我 看起来一样,但是没有可能的溢出(在原始的off + len中可能为负,因此显然小于数组长度)。确保没有维护程序员曾经将其“整理”成明显的形式。我发现整数溢出非常令人困惑。必须考虑一会儿,然后会有the的怀疑我弄错了。但是,当然,应该有另一位审阅者和原始程序员-当然,没有任何错误可以解决!(不是)
JAVA的主要功能之一是安全性。用解释性语言编写的程序不容易受到缓冲区溢出攻击,但是您总是可以在Interpreter本身中引起缓冲区溢出。虽然会很困难。同样,Python也是一种解释性语言,可以防止缓冲区溢出。