检测到基于堆栈的缓冲区溢出

我敢打赌,每个Java开发人员在他们的职业生涯开始时第一次遇到Java代码的本机方法时都会感到惊讶。

我还可以肯定,多年来随着了解JVM如何通过JNI处理对本机实现的调用而使惊奇消失了。

这篇文章是关于本机方法的最新经验。 更详细地讲,使用本机方法如何导致JVM静默崩溃,而日志文件中没有任何合理的跟踪。 为了向您介绍经验,我创建了一个小测试用例。

它由一个简单的Java类组成 ,可计算文件的校验和。 为了实现Awesome Performance(TM),我决定使用本机实现来实现校验和计算部分。 该代码简单明了,因此正在运行。 您只需要克隆存储库并启动它,类似于以下示例:

$ ./gradlew jarWithNatives
$ java -jar build/libs/checksum.jar 123.txt
Exiting native method with checksum: 1804289383
Got checksum from native method: 1804289383

该代码似乎按预期工作。 当您发现自己盯着输出时使用的输入文件名略有不同(更长),就会暴露出不太直接的部分:

$ java -jar build/libs/checksum.jar 123456789012.txt
Exiting native method with checksum: 1804289383
*** stack smashing detected ***: java terminated

因此,本机方法可以很好地完成其执行,但是控件没有返回给Java。 而是,JVM崩溃而没有崩溃日志。 您应该意识到以下事实:我仅在Linux和Mac OS X上测试了示例,并且在Windows上的行为可能有所不同。

根本的问题不是太复杂,并且可能在C代码中立即可见:

char        dst_filename[MAX_FILE_NAME_LENGTH];
// cut for brevity
sprintf(dst_filename, "%s.digested", src_filename);

从上面可以明显看出,缓冲区只能容纳固定数量的字符。 输入较长时,剩余字符将被写到末尾。 实际上,这将导致堆栈崩溃,并为潜在的黑客攻击或使应用程序处于不可预测的状态打开大门。

对于C开发人员,底层的堆栈保护器机制是众所周知的,但是对于Java开发人员,可能需要更多说明。 除了使用更安全的snprintf占用缓冲区长度并且不会超出该长度之外,还可以要求编译器向堆栈中添加堆栈保护器或内存清理。 可用的安全网因编译器而异,甚至在同一编译器的不同版本之间也存在很大差异,但这是一个示例:

gcc -fstack-protector CheckSumCalculator.c -o CheckSumCalculator.so

使用适当的堆栈保护器编译代码后,运行时库或OS的实现在某些情况下可能会检测到这种情况,并终止程序以防止意外行为。

如下面的示例所示,在未进行清理的情况下编译代码时,

gcc -fno-stack-protector CheckSumCalculator.c -o CheckSumCalculator.so

运行此类代码的结果可能变得完全不可预测。 在某些情况下,代码可能看起来不错,但是在某些情况下,您可能会遇到缓冲区溢出。 尽管在此示例中使用snprintf并启用清除功能肯定会有所帮助,但该错误可能比该错误更微妙,并且不会自动捕获。

回到所谓的安全Java世界,这样的缓冲区溢出可能会破坏内部JVM结构,甚至使提供字符串的任何人都可以执行任意代码。 因此,JVM将保护值添加到内存中,如果在本机方法完成后对这些值进行了修改,则立即终止应用程序。 为什么在没有更详细的错误日志的情况下完成堕胎是一个不同的问题,不在本文的讨论范围之内。

我希望这篇文章在面对突然的JVM死亡甚至没有崩溃日志时能为某人节省一整夜的时间。 在所有平台上甚至都没有出现标准错误流中的“ stack smashed”消息,而且可能需要花费大量时间才能确定发生了什么情况,尤其是在运行没有源代码的第三方本机库的情况下。

翻译自: https://www.javacodegeeks.com/2015/09/stack-smashing-detected.html

检测到基于堆栈的缓冲区溢出

检测到基于堆栈的缓冲区溢出_检测到堆栈粉碎相关推荐

  1. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_漏洞公告 | 华硕(ASUS)家庭无线路由器远程代码执行0day...

     漏洞公告:  华硕(ASUS) RT系列是由华硕(ASUS)发布的针对家庭用户的中高端无线路由器,市场占用率比较高. 华硕路由器(ASUS)提供Web服务的组件存在一个设计缺陷:存在缓冲区溢出问题, ...

  2. 有未经处理的异常(在 xx.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出。

    有未经处理的异常(在 xx.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出. 参考文章: (1)有未经处理的异常(在 xx.exe 中): 堆栈 Cookie 检测代码检测到基 ...

  3. 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出

     报错:0x000CC3C9 处有未经处理的异常(在 image_opencv2.exe 中):  堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出. 主要检查代码中有没有对数组的越界操作, ...

  4. 堆栈 cookie 检测代码检测到基于堆栈的缓冲区溢出_WhatsApp缓冲区漏洞曝光 攻击者可通过MP4文件执行远程代码...

    Facebook 刚刚披露了 WhatsApp 缓冲区漏洞的部分细节.在上周的一份安全公告中,其表示 CVE-2019-11931 是由基于堆栈的缓冲区溢出 bug 引发,导致攻击者可向受害者发送精心 ...

  5. Nagios Core/Icinga 基于栈的缓冲区溢出漏洞

    漏洞名称: Nagios Core/Icinga 基于栈的缓冲区溢出漏洞 CNNVD编号: CNNVD-201402-484 发布时间: 2014-03-03 更新时间: 2014-03-03 危害等 ...

  6. java 缓冲区溢出_基于数组越界的缓冲区溢出

    上一篇文章说了函数调用时候的堆栈变化,这里就基于这个内容来验证一下基于数组越界的缓冲区溢出. 在c语言中,数组必须是静态的,也就是在定义的时候必须明确数组的大小,在根本上来说,这个是堆栈提升的原因,只 ...

  7. 堆栈的缓冲区溢出进不了系统_一文理解缓冲区溢出

    1 引言 "缓冲区溢出"对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员,还是完全有必要了解它的整个细节. 计算机程序一般都会使用到一些内存,这 ...

  8. 基于堆栈的缓冲区溢出问题记录

    问题: 在release下,选择椭圆选择工具,绘制选择区域,APP crash,在离开HighLightROICell函数时报错 分析 缓冲区溢出问题本质其实就是复制一个内存区域的内容到另一个内存区域 ...

  9. java 缓冲区溢出_缓冲区溢出详解

    1 缓冲区溢出原理 缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例.缓冲区可以是堆栈(自动变量).堆(动态内存)和静态数据区(全局或静态).在C/C++语言中,通常使用字符数组和mal ...

最新文章

  1. 计算机科学与软件工程-哪个专业最适合您?
  2. 蓝牙 配对 android,Android蓝牙工具类:连接、配对、传输
  3. 销售行业ERP数据统计分析都有哪些维度?
  4. java日期转换_java日期格式转换
  5. Arcgis Android API开发之离线地图
  6. XeThru Sensors SW Module Connector-matlab
  7. Vbs调用MsAgent组件,很有趣
  8. 与大学生谈学习BIM软件开发所需要的准备
  9. excel中如何进行元单位到万元单位的转换
  10. TCP协议——SYN/ACK的使用以及滑动窗口机制
  11. 我要偷偷的学Python,然后惊呆所有人(第十天)
  12. 电子元器件3D模型免费下载资源
  13. 5.5.JMeter中调度器起作用(需要循环次数设置成永远)
  14. 转载:关于动漫与动画
  15. 【英语总结】十二月引领~
  16. 用户体验时代 Mist带来云托管Wi-Fi新思路
  17. 微软在华大力推广云计算 谋求中国市场发展
  18. css 画多边形、不规则边框
  19. 宽带路由器实现ADSL共享上网
  20. python运行不显示结果图示_pycharm运行和调试不显示结果的解决方法

热门文章

  1. CF605E-Intergalaxy Trips【期望dp】
  2. P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】
  3. nssl1195-健美猫【???】
  4. P3368-Frequent values【线段树】
  5. 纪中B组模拟赛总结(2020.2.1)
  6. 「LibreOJ NOIP Round #1」旅游路线
  7. 洛谷P1120小木棒 爆搜+剪枝
  8. 2017西安交大ACM小学期数据结构 [又是树状数组、异或]
  9. Spring Bean 定义继承
  10. Shell入门(六)之算术运算