Java有缓冲区溢出吗?

Java有缓冲区溢出吗? 如果是,你可以给我的scheme吗?

由于Javastring基于字符数组,Java自动检查数组边界,所以缓冲区溢出只能在不常见的情况下使用:

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

像Java和C#这样的pipe理语言没有这些问题,但是实际运行代码的特定虚拟机(JVM / CLR / etc)可能会有这些问题。

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

Java有数组边界检查哪些将检查数据不能从分配数组以外的区域访问。 当尝试访问超出数组大小的区域时,将引发ArrayOutOfBoundsexception。

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

是和不是。 不,因为它是一个托pipe的内存模型,所以您无法真正地创build自己的缓冲区溢出漏洞。 但是,JVM和JDK中可能存在缓冲区溢出漏洞。 看到这个Secunia咨询:

http://secunia.com/advisories/25295

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

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

缓冲区溢出的意义在于你有使用缓冲区的代码,你的代码负责正确地parsing它,但是却不能这样做。 例如,您可能会编写一个XMLparsing器,并且某人可能会向您提供一个格式错误(或合法但不常见)的请求,由于您的parsing器的devise会覆盖以前validation过的数据,导致您的应用程序行为不良。

后者的forms是不太可能的,但是如此广泛分布的编写得不好的sqlstring清理函数会成为一个诱人的目标。

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

正如已经指出的那样,Java作为一种语言来检查所有的内存访问,如果在这里出现错误,JVM就会出错,而不是程序。 但是,应该注意的是,这是与Java中的内存泄漏类似的论点; 虽然不可能粉碎堆栈,但错误位置的ArrayOutOfBoundsException(处理不当)可能仍然会导致系统崩溃。

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

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

例如,以下是不足以检查范围:

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

IIRC, StringBuffer曾经有一个像这样的错误,但没有什么有趣的事情可以用它做。