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日志管理怎么配置

    MySQL的日志默认保存在数据库文件的存储目录(一般为/usr/local/mysql/data/)。也可以修改配置文件,自定义日志文件的保存位置。 我这里在编译安装时,数据库文件存储目录设置的是/home/mysql。 一、四种日志介绍 1.1 错误日志 错误日志,用来记录当MySQL启动、停止或…

    2022年9月21日
    97500
  • 如何实现APT34泄密武器报告分析

    APT34是一个来自于伊朗的APT组织,自2014年起,持续对中东及亚洲等地区发起APT攻击,涉猎行业主要包含政府、金融、能源、电信等。多年来,攻击武器库不断升级,攻击手法也不断推陈出新,并且攻击行为不会因为被曝光而终止。 APT34组织背景 4月17日,有国外媒体报道,一个名为“Lab Dookh…

    2022年9月8日
    38800
  • MyBatis3源码解析之怎么获取数据源

    jdbc 再贴一个JDBC运行的测试方法,流程为: 加载JDBC驱动; 获取数据库连接; 创建JDBC Statements对象; 设置SQL语句的传入参数; 执行SQL语句并获得查询结果; 对查询结果进行转换处理并将处理结果返回; 释放相关资源(关闭Connection,关闭Statement,关…

    2022年9月19日
    44500
  • windows谷歌浏览器开发者模式如何打开

    谷歌浏览器开发者模式打开方法: 1、点击右上角的图标先。 2、随后选择更多工具中的“开发者工具”。 3、随后即可进入“开发者模式”。 4、点击上方的选项可以设置开发者工具的位置。 关于“windows谷歌浏览器开发者模式如何打开”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“windows…

    2022年9月8日
    2.8K00
  • mysql触发器如何取消

    在mysql中,可以使用DROP TRIGGER语句来取消已经定义的触发器,语法为“DROP TRIGGER 表名.触发器名;”或者“DROP TRIGGER 触发器名; ”,触发器的名称在当前数据库中必须具有少数的名称;“表名”选项若不省略则表示取消与指定表关联的触发器。 本教程操作环境:wind…

    2022年9月20日
    46600
  • 如何进行DLL代理转发与weiquan分析

    DLL劫持 再Windows 7 版本之后,系统采用了KnowDLLs对DLL进行管理,其位于注册表HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs下,在这个下面的DLL文件会被禁止从exe自身所在的目录…

    2022年9月22日
    66400
  • mysql与oracle有没有区别

    mysql与oracle有区别:1、Oracle是一个对象关系数据库管理系统(ORDBMS),而MySQL是一个关系数据库管理系统(RDBMS);2、Oracle是闭源的(收费),MySQL是开源的(免费);3、Oracle是大型数据库,而MySQL是中小型数据库;4、Oracle可设置用户权限、访…

    2022年9月22日
    2.9K00
  • col在html中指的是什么

    col在html中是“列”的意思;col是html中的标签,是“column”的缩写,该标签是给表格中一个或者多个列应用样式,而不需要重复为每个单元格或每一行设置样式,标签规定了元素内部每一列的属性,只能在table或colgroup元素中使用该标签。 本教程操作环境:windows10系统、HTM…

    2022年9月2日
    53000
  • windows ddu卸载显卡驱动使用问题怎么解决

    ddu卸载显卡驱动怎么用: 1、首先,我们运行“Display Driver Uninstaller.exe”程序软件。 2、打开后,在右下角可以修改为“简体中文” 3、接着在右上角可以选择设备种类,“显卡”或者“声卡” 4、在下方选择我们的设备供应商。 5、选择完成后点击下方按钮,可以恢复设备的默…

    2022年9月21日
    77500
  • windows trustedinstaller.exe占用内存如何解决

    名列前茅种解决方法:硬件上解决 在硬件上解决,增加内存条,如2G内存升级到4G或者8G等容量。一般提示内存不足,在非病毒或者木马的情况下说明你的电脑硬件不足,在资金充足的情况下可以新增内存条。 第二种解决方法:等系统更新完成(在空闲时更新) 在不想投入硬件的情况下,我们又想更新完成,怎么办呢?只有等…

    2022年9月2日
    36400
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部