意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

如何实现C++程序释放后使用导致的漏洞分析

来源:恒创科技 编辑:恒创科技编辑部
2024-02-09 16:19:59

如何实现C++程序释放后使用导致的漏洞分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、释放后使用

当动态分配的内存释放时,该内存的内容是不确定的,有可能保持完整并可以被访问,因为什么时候重新分配或回收释放的内存块是内存管理程序决定的,但是,也可能该内存的内容已经被改变,导致意外的程序行为。因此,当内存释放之后,保证不再对它进行写入或读取。

2、 释放后使用的危害

由内存管理不当导致的问题是 C/C++ 程序中常见的漏洞。释放后使用会导致可被利用的潜在风险,包括程序异常终止、任意代码执行和拒绝服务攻击等。2018年1月至11月,CVE 中共有134条漏洞信息与其相关。部分漏洞如下:


如何实现C++程序释放后使用导致的漏洞分析

CVE漏洞概述CVE-2018-1000051 Artifex Mupdf 版本的 fz_keep_key_storable 中存在一个释放后使用漏洞,可导致拒绝服务或代码执行问题。通过诱骗受害者打开一个特殊构造的 PDF 文件,该漏洞即可遭利用。CVE-2018-17474谷歌 Chrome 浏览器70.0.3538.67 之前版本 Blink 引擎的 HTMLImportsController 中存在一个释放后使用漏洞,很有可能导致远程攻击者通过一个特殊构造的 HTML 页面利用堆损坏问题。CVE-2018-15924Adobe Acrobat 和 Reader 2018.011.20063及之前版本、2017.011.30102 及之前版本、2015.006.30452 及之前版本中存在释放后使用漏洞。远程攻击者可利用该漏洞执行任意代码。

3、示例代码

示例源于 Samate Juliet TestSuite for C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE416_Use_After_Free__malloc_free_char_01.c。

3.1缺陷代码

使用360代码卫士对上述示例代码进行检测,可以检出“释放后使用”缺陷,显示等级为高。如图1所示:

图1:释放后使用检测示例

3.2 修复代码

在上述修复代码中,Samate 给出的修复方式为:在第30行使用 malloc()进行内存分配,并在第36行处使用 free() 进行释放,释放后不在对该内存进行其他操作。

使用360代码卫士对修复后的代码进行检测,可以看到已不存在“释放后使用”缺陷。如图2:

图2:修复后检测结果

4 、如何避免释放后使用

要避免释放后使用,需要注意以下几点:

(1) 释放内存时请务必置空指针,虽然这种方法针对多重或复杂数据结构利用的有效性有限,但可以从一定程度上规避一部分问题。

(2) 在循环语句中进行内存分配或释放时,需谨慎确认是否存在问题。

(3) 使用源代码静态分析工具进行自动化的检测,可以有效的发现源代码中的释放后使用问题。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恒创行业资讯频道,感谢您对恒创的支持。

上一篇: 如何用JAVA语言分析双重检查锁定 下一篇: 手机怎么远程登录云服务器?