【缺陷周话】第3期 :内存泄漏

栏目: 软件资讯 · 发布时间: 6年前

内容简介:内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。或者说,由于软件无法有效跟踪和释放分配的内存,从而导致性能下降。详细请参见内存泄漏是 C/C++ 程序中常见的漏洞类型,会因为减少可用内存的数量而降低计算机的性能,甚至导致全部或部分设备停止正常工作或者应用程序崩溃。2018年1月至9月,CVE 中共有63条漏洞信息与其相关。部分漏洞如下:本章节中使用示

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。或者说,由于软件无法有效跟踪和释放分配的内存,从而导致性能下降。详细请参见 CWE ID 401: Improper Release of Memory Before Removing Last Reference (‘Memory Leak’)

2、内存泄漏的危害

内存泄漏是 C/C++ 程序中常见的漏洞类型,会因为减少可用内存的数量而降低计算机的性能,甚至导致全部或部分设备停止正常工作或者应用程序崩溃。2018年1月至9月,CVE 中共有63条漏洞信息与其相关。部分漏洞如下:

CVE-2018-17234 HDF HDF5 1.10.3 版本 H5Ocache.c 中的 H5O__chunk_deserialize() 函数存在内存泄漏,导致允许攻击发起拒绝服务攻击。
CVE-2018-16807 Bro是一个开源的网络分析和安全监控的框架。 Bro 2.5.5及之前版本中的 Kerberos protocol 解析器的 scripts/base/protocols/krb/main.bro 文件存在内存泄漏。攻击者可利用该漏洞造成拒绝服务。
CVE-2018-16750 ImageMagick 是美国 ImageMagick Studio 公司的一套开源的图象处理软件。该软件可读取、转换、写入多种格式的图片。 ImageMagick 7.0.7-29 版本及之前版本中的 coders/meta.c 文件的 formatIPTCfromBuffer() 函数存在内存泄漏。
CVE-2018-16641 ImageMagick 7.0.8-6 版本中的 coders/tiff.c 文件的 TIFFWritePhotoshopLayers() 函数存在内存泄漏漏洞。攻击者可利用该漏洞造成拒绝服务。

3、示例代码

本章节中使用示例代码来源于 Samate Juliet Test Suite for C/C++ v1.3 ( https://samate.nist.gov/SARD/testsuite.php) ,源文件名:CWE401_Memory_Leak__int64_t_malloc_01.c。

3.1缺陷代码

【缺陷周话】第3期 :内存泄漏

上述示例代码在第29行使用malloc()函数进行内存分配,并在第30行对分配是否成功进行了判断。但在第36行函数结束时,并没有对分配的内存data进行有效合理释放,产生内存泄漏。

使用360代码卫士对上述示例代码进行检测,可以检出“内存泄漏”缺陷,显示等级为中。如图1所示:

【缺陷周话】第3期 :内存泄漏

图1 内存泄漏检测示例

3.2 修复代码

【缺陷周话】第3期 :内存泄漏

在上述修复代码中,在第29行使用 malloc()函数进行内存分配,在第36行函数结束前对申请的内存使用free()函数进行释放,从而避免了内存泄漏的发生。

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

【缺陷周话】第3期 :内存泄漏

图2:修复后检测结果

4、开源代码检测计划某项目内存泄漏示例

开源代码检测计划是一项免费的公益计划。通过使用360代码卫士对开源项目进行源代码检测和审计,找到源代码中存在的安全缺陷,使得开源项目的安全性得到提高。

以下是开源项目检测计划中检测出的一个“内存泄漏”示例,如图3所示。

【缺陷周话】第3期 :内存泄漏

图3 开源项目检出“内存泄漏”

4.1 缺陷代码

在缺陷代码中,内存在第445行通过new进行申请,但是在第448行函数返回时,没有进行释放,从而导致内存泄漏。

4.2 修复代码

针对该内存泄漏问题的提出,开发人员在近期对相关代码进行了修复。在448行使用delete 对内存进行释放,从而避免了内存泄漏。

【缺陷周话】第3期 :内存泄漏

5、 如何避免内存泄漏

【缺陷周话】第3期 :内存泄漏

要避免内存泄漏,需要注意以下几点:

(1)在允许的情况下,尽量避免手动管理内存,如在 C++ 开发中,使用智能指针可以减少内存泄漏的发生。

(2)在代码编写过程中养成良好的编程习惯,保证malloc/new 和 free/delete匹配使用。

(3)在同一个模块、同一个抽象层中分配内存和释放内存。

(4)使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的内存泄漏问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ASP.NET网页制作教程

ASP.NET网页制作教程

王国荣 / 华中科技 / 2002-1 / 78.00元

《ASP.NET网页制作教程:从基本语法学起(附光盘)》分为:基础篇、对象应用篇、案例研究篇。奠定ASP网页制作的基础,使用Server控件制作互动网页,使用ADO.NET访问数据库;计费网费、会员管理、访客计数器Server版、访客留言板、新闻讨论群组、电子贺卡、E-mail自动传送、FIP文件上传、在线投票、在线问卷调查、在线购物、在线考试、广告回旋板、聊天室。一起来看看 《ASP.NET网页制作教程》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具