java有缓冲区溢出吗?

ne5o7dgx  于 2021-06-30  发布在  Java
关注(0)|答案(10)|浏览(587)

java有缓冲区溢出吗?如果是,你能给我一些情况吗?

ycggw6v2

ycggw6v21#

如果您使用java native interace(jni)工具来调用外部代码,并且外部代码存在可利用的问题,那么您可能会在java程序中导致缓冲区溢出。这是相当罕见的,因为大多数应用程序尽可能避免使用jni。

jdzmm42g

jdzmm42g2#

不管怎样,不。
java有数组边界检查,它将检查不能从分配的数组之外的区域访问数据。当试图访问超出数组大小的区域时 ArrayOutOfBounds 将引发异常。
如果存在缓冲区溢出,则可能是由于java虚拟机中的错误造成的,据我所知,这不是java语言规范或java虚拟机规范中编写的预期行为。

ki0zmccv

ki0zmccv3#

是和否。不,因为它是一个托管内存模型,所以不能真正创建错误的缓冲区溢出漏洞。但是,jvm和jdk中可能存在缓冲区溢出漏洞。请参阅此secunia公告:
http://secunia.com/advisories/25295
或者查看以下关于以前几个jdk和jre漏洞的旧建议:
java runtime environment(jre)“unpack200”jar unpacking实用程序中的整数和缓冲区溢出漏洞可能导致权限升级https://download.oracle.com/sunalerts/1020225.1.html
使用“unpack200”jar unpacking实用程序解包applet和java web start应用程序的java运行时环境(jre)中的整数和缓冲区溢出漏洞可能允许不受信任的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解析器中出现缓冲区溢出,并且在处理某些bmp文件时对/dev/tty的open()调用不正确。

i34xakig

i34xakig4#

java和c等托管语言没有这些问题,但实际运行代码的特定虚拟机(jvm/clr/etc)可能会出现这些问题。

p8ekf7hl

p8ekf7hl5#

java(和.net)虚拟机捕获试图在保留内存之外写入的代码。如果应用程序处理不正确,仍然会导致安全问题。如果恶意用户可以通过输入无效的输入触发异常,他们可以进行拒绝服务攻击。

p5cysglq

p5cysglq6#

由于java字符串基于char数组,java会自动检查数组边界,因此缓冲区溢出只有在不寻常的情况下才可能发生:
如果您通过jni调用本机代码
在jvm本身中(通常用c++编写)
解释器或jit编译器工作不正常(java字节码强制边界检查)

o2rvlv0m

o2rvlv0m7#

java的关键特性之一是安全性。用解释语言编写的程序不容易受到缓冲区溢出攻击,但总是会导致解释器本身出现缓冲区溢出。尽管这会很困难。类似地,python也是一种解释语言,可以防止缓冲区溢出。

r8xiu3jd

r8xiu3jd8#

正如已经指出的,java作为一种语言,对所有的内存访问都进行了边界检查,如果这里有错误,jvm是错误的,而不是程序。但是,需要注意的是,这与java中的内存泄漏类似;虽然不可能破坏堆栈,但是错误位置的BoundsException数组,如果处理不正确,可能仍然会破坏系统。

kxe2p93d

kxe2p93d9#

严格意义上的覆盖堆栈或堆本身的缓冲区溢出需要:
框架中的一个bug(这些bug在过去已经存在,很可能再次出现)
jni的使用(基本上不再使用托管代码)
缓冲区溢出是指您的代码正在使用缓冲区,并且您的代码负责正确解析它,但未能正确解析它是可能的。例如,您可能编写了一个xml解析器,而有人可能会向您提供一个格式错误(或合法但不常见)的请求,由于解析器的设计,该请求会用一些负载覆盖以前验证过的数据,从而导致应用程序表现不好。
后一种形式不太可能出现,但一个广泛分布的编写不好的sql字符串清理函数,如果遇到这样的问题,将是一个诱人的目标。

wnrlj8wa

wnrlj8wa10#

方法有可能写入它不打算写入的数组的有效项,通常是通过整数溢出。
例如,以下内容不足以检查边界:

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

iirc公司, StringBuffer 曾经有一个这样的错误,但没有什么有趣的,你可以做的。

相关问题