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

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

内容简介:内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。或者说,由于软件无法有效跟踪和释放分配的内存,从而导致性能下降。详细请参见内存泄漏是 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)使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的内存泄漏问题。


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

查看所有标签

猜你喜欢:

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

Inside Larry's and Sergey's Brain

Inside Larry's and Sergey's Brain

Richard Brandt / Portfolio / 17 Sep 2009 / USD 24.95

You’ve used their products. You’ve heard about their skyrocketing wealth and “don’t be evil” business motto. But how much do you really know about Google’s founders, Larry Page and Sergey Brin? Inside......一起来看看 《Inside Larry's and Sergey's Brain》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具