C语言源码二次释放的危害是什么

1、二次释放

二次释放简单理解就是对同一个指针指向的内存释放了两次,针对C语言源代码,对同一个指针进行两次 free() 操作,可能导致二次释放,本文3.1章节的缺陷代码就是对这类情况的描述。在C++语言中,浅拷贝操作不当是导致二次释放常见原因之一。如:调用一次赋值运算符或拷贝构造函数将会导致两个对象的数据成员指向相同的动态内存。此时引用计数机制变得非常重要,当引用计数不当时,一个对象超出作用域时,析构函数将会释放这两个对象共享的内存。另一个对象中对应的数据成员将会指向已经释放的内存地址,而当这个对象也超出作用域时,它的析构函数试图再次释放这块内存,导致二次释放问题。详细请参见CWE ID 415: Double Free。

2、 二次释放的危害

二次释放内存可能导致应用程序崩溃、拒绝服务攻击等问题,是 C/C++ 中常见的漏洞之一。2018年1月至11月,CVE中共有38条漏洞信息与其相关。部分漏洞如下:

CVE 编号 概述
CVE-2018-18751 GNU gettext 0.19.8 版本中的 read-catalog.c 文件的 ‘defaultaddmessage’ 函数存在二次释放漏洞。
CVE-2018-17097 Olli Parviainen SoundTouch 2.0 版本中的 WavFile.cpp 文件的 WavFileBase 类存在安全漏洞,远程攻击者可利用该漏洞造成拒绝服务(二次释放)。
CVE-2018-16425 OpenSC 0.19.0-rc1 之前版本中的 libopensc/pkcs15-sc-hsm.c 文件的 ‘scpkcs15emuschsminit’ 函数存在二次释放漏洞。攻击者可借助特制的智能卡利用该漏洞造成拒绝服务(应用程序崩溃)。
CVE-2018-16402 elfutils 0.173 版本中的 libelf/elf_end.c 文件存在安全问题,远程攻击者可利用该漏洞造成拒绝服务(二次释放和应用程序崩溃)。

3、示例代码

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

3.1缺陷代码

C语言源码二次释放的危害是什么

在上述示例代码中,在第32行使用 malloc() 进行内存分配,并在第36行使用 free() 对分配的内存进行了释放,在第38行 for 循环语句中,又对已经释放的内存 data 进行了一次释放,导致二次释放问题。

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

C语言源码二次释放的危害是什么

图1:二次释放检测示例

3.2 修复代码

C语言源码二次释放的危害是什么

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

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

C语言源码二次释放的危害是什么

图2:修复后检测结果

4 、如何避免二次释放

要避免二次释放,需要注意以下几点:

(1)野指针是导致二次释放和释放后使用的重要原因之一,消除野指针的有效方式是在释放指针之后立即把它设置为 NULL 或者设置为指向另一个合法的对象。

(2)针对 C++ 浅拷贝导致的二次释放问题,始终执行深拷贝是不错的解决方案。

(3)使用源代码静态分析工具,可以自动化的发现程序中可能存在的二次释放问题。

以上就是C语言源码二次释放的危害是什么的全部内容了,更多与C语言源码二次释放的危害是什么相关的内容可以搜索亿速云之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下亿速云!

文章标题:C语言源码二次释放的危害是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/27078

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月19日 下午11:57
下一篇 2022年9月19日 下午11:58

相关推荐

  • MySql如何查出符合条件的最新数据行

    结合示例: 这是一张记录人员来访的记录表。 数据表里的数据准确记录了每个人来访时带的帽子颜色、时间、人员编码(每个人少数)。 数据样例: 需要做到的是 : 拿出符合条件的最新的来访记录。 你会最怎么做? 先实现一点的, 取出 A101 这个人员编码的 最新来访记录 。 首先先展示错误的sql示例: …

    2022年9月16日
    49200
  • thinkpad怎么重装系统

    thinkpad重装系统时需要按“F12”或者“Fn+F12”快捷键;重装系统通常需要设置bios从指定的系统盘启动,ThinkPad笔记本电脑基本上都支持启动热键,也就是说可以通过快捷键选择从U盘或光盘启动。 本教程操作环境:windows10系统、ThinkPad T14电脑。 thinkpad…

    2022年9月8日
    1.6K00
  • word页码怎么设置

    word页码设置教程: 1、打开需要设置的文档。 2、在工具栏中找到插入的功能。 2、插入功能中有页码功能,点击即可。 3、选择页码的出现位置。 4、选择页面的样式。 5、效果如图。 感谢各位的阅读,以上就是“word页码怎么设置”的内容了,经过本文的学习后,相信大家对word页码怎么设置这一问题有…

    2022年9月19日
    35500
  • cocos2d-LUA逆向中如何解密app资源

    还是以大神apk为例,通过前面分析app解密lua脚本,我们能够解密大神apk的lua脚本,现在我们来解密其资源(配置文件和图片等)。我们以比较重要的配置文件为例,未解密之前: 文件头部也有签名值:fuckyou!。看到这,我们首先就想到是不是也是用xxtea加密的,我们用上面的方法,先xxtea解…

    2022年9月21日
    1.2K00
  • html5中使用哪个标签嵌入音频

    在html5中,可以使用audio标签嵌入音频;该标签的作用就是定义声音,比如音乐或者其他声音流,并且该标签仅支持MP3、Wav和Ogg三种声音格式,语法为“<audio src=”音频文件”>”。”。 本教程操作环境:windows10系统、html5版本、De…

    2022年9月15日
    63500
  • php可不可以循环字符串

    php可以循环字符串。在PHP里,字符串可以当作数组来使用,字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号包含对应数字的方式来查找和修改;因此也可以像循环数组那样循环字符串),循环字符串的语法“for($i=0;$i<strlen($str);$i++){//循环体语句}”。…

    2022年9月26日
    58000
  • 电脑蓝屏代码0x00000023如何解决

    解决方法: 方法一: 1、首先可以重启电脑,然后按住键盘的“F8”,不松手直到出现其他界面。 2、如果可以使用鼠标就点击“最后一次正确的配置”回车进入,如果不能的话就使用键盘的方向键。 3、要是使用这种方法也进不去系统,那就可能是磁盘出现了问题,需要修复磁盘。 方法二: 1、再次使用上面的方法进入这…

    2022年9月16日
    60100
  • Linux系统中怎么加密文件

    在Linux系统安装时选择使用EFS 首先将介绍一个非常简单的方法来使用EFS文件系统。以Fedora的安装步骤为例子,选择相关选项进行安装就可以方便地进行使用了。 用户可以在空闲空间新建分区,也可以选择某个分区进行编辑,还可以删除某些分区。在图 1中,需要选中[加密文件系统]选项,并且,根据系统要…

    2022年9月1日
    44500
  • 发现“小火车托马斯”智能玩具APP聊天应用漏洞的示例分析

    漏洞发现背景 ToyTalk是一家由皮克斯前高管创建的人工智能玩具初创公司,它们设计的智能玩具具备视觉跟踪、语音识别和网络扩展功能,能让儿童通过APP与玩具之间进行语音交流和行为反应识别,激发儿童与虚拟人物的谈话能力,更好地实现与玩具之间的互动乐趣。 ToyTalk于2015年7月推出了一款名为“托…

    2022年9月16日
    46100
  • 电脑更新错误0x800f0988如何解决

    解决方法: 方法一: 1、首先点击左下角的开始菜单,然后在其中找到“设置” 2、再点击进入设置中的“更新和安全” 3、然后在左侧边栏中选择“疑难解答” 4、然后在右侧启动并运行中点开“windows更新”,选择“运行疑难解答” 5、最后只要等待系统自动检测问题并解决就可以正常更新了。 方法二: 1、…

    2022年9月16日
    84900
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部