概述
由于Javastring基于字符数组,Java自动检查数组边界,所以缓冲区溢出只能在不常见的情况下使用:
如果你通过JNI调用本地代码
在JVM本身(通常用C ++编写)
解释器或JIT编译器无法正常工作(Java字节码强制执行边界检查)
像Java和C#这样的pipe理语言没有这些问题,但是实际运行代码的特定虚拟机(JVM / CLR / etc)可能会有这些问题。
对于所有的意图和目的,没有。
Java有数组边界检查哪些将检查数据不能从分配数组以外的区域访问。 当尝试访问超出数组大小的区域时,将引发ArrayOutOfBoundsexception。
如果存在缓冲区溢出,则可能是Java虚拟机中的一个错误,而且,据我所知,这不是用Java语言规范编写的预期行为,也不是Java虚拟机规范。
是和不是。 不,因为它是一个托pipe的内存模型,所以您无法真正地创build自己的缓冲区溢出漏洞。 但是,JVM和JDK中可能存在缓冲区溢出漏洞。 看到这个Secunia咨询:
严格意义上的覆盖堆栈或堆本身的缓冲区溢出需要:
框架中的一个错误(这些错误在过去已经存在,很可能再次出现)
使用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曾经有一个像这样的错误,但没有什么有趣的事情可以用它做。
最后
以上就是玩命大门为你收集整理的java存在溢出攻击吗_Java有缓冲区溢出吗?的全部内容,希望文章能够帮你解决java存在溢出攻击吗_Java有缓冲区溢出吗?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复