C语言内存分配函数被污染的示例分析

1、被污染内存分配

C 语言的内存分配函数包括 malloc()kmallocsmalloc()xmalloc()realloc()calloc()GlobalAlloc()HeapAlloc()等等,以 malloc()为例, malloc() 函数的原型为:

extern void*malloc (unsignedintnum_bytes);

malloc() 函数分配了 num_bytes 字节的内存,并返回了指向这块内存的指针。当内存分配长度的整数来自于可能被污染的不可信源时,如果没有对外部输入的数据进行有效判断,会导致超大的内存分配。其中可能被污染的不可信源包括:命令行参数、配置文件、网络通讯、数据库、环境变量、注册表值以及其他来自应用程序以外的输入等。

2、 被污染的内存分配的危害

直接将被污染的数据作为内存分配函数长度参数,如传入了一个极大的整数值,程序就会相应的分配一块极大的内存,从而导致系统极大的内存开销,甚至导致拒绝服务攻击。

CVE中也有一些与之相关的漏洞信息,从2018年1月至2019年3月,CVE中就有4条相关漏洞信息。漏洞信息如下:

CVE 概述
CVE-2018-6869 ZZIPlib 0.13.68 版本中的 zzip/zip.c 文件的‘__zzip_parse_root_directory’函数存在安全漏洞。远程攻击者可借助特制的zip文件利用该漏洞造成拒绝服务(不可控的内存分配和崩溃)。
CVE-2018-5783 PoDoFo 0.9.5 版本中的 base/PdfVecObjects.h文件的‘PoDoFo::PdfVecObjects::Reserve’函数存在安全漏洞。远程攻击者可借助特制的pdf文件利用该漏洞造成拒绝服务(不受控的内存分配)。
CVE-2018-5296 PoDoFo 0.9.5 版本中的 base/PdfParser.cpp 文件的‘PdfParser::ReadXRefSubsection’函数存在安全漏洞,该漏洞源于程序没有控制内存的分配。远程攻击者可借助特制的pdf文件利用该漏洞造成拒绝服务。


3、示例代码

本节所用示例参考CWE-789: Uncontrolled Memory Allocation (http://cwe.mitre.org/data/definitions/789.html) 提供的代码示例,并对示例中的 GetUntrustedInt() 函数进行了定义。

3.1缺陷代码

C语言内存分配函数被污染的示例分析

在上述示例代码中,在第9行使用 malloc() 函数进行长度为 totBytes 字节的内存分配,通过跟踪路径可以看出, totBytes 在第6行通过 size*sizeof(char); 计算结果进行赋值,而 size 的值是第7行使用 scanf() 函数获取的用户键盘输入,为被污染的数据源,从而导致内存分配长度 totBytes 被污染,存在“被污染的内存分配”问题。

使用360代码卫士对上述示例代码进行检测,可以检出“被污染的内存分配”缺陷,显示等级为高。如图1所示:

C语言内存分配函数被污染的示例分析

图1:被污染的内存分配的检测示例

3.2 修复代码

C语言内存分配函数被污染的示例分析

在上述修复代码中,虽然 totBytes 的来源为被污染的数据,但在第10行对 totBytes 的长度进行了有效限制,从而避免了被污染的内存分配。

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

C语言内存分配函数被污染的示例分析

图2:修复后检测结果

4、如何避免被污染的内存分配

(1)避免使用被污染的数据直接作为内存分配函数的长度参数,如无法避免,则应对被污染的数据进行有效限制。

(2)使用源代码静态分析工具,可以有效发现这类问题。

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

文章标题:C语言内存分配函数被污染的示例分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/27114

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月20日 上午12:00
下一篇 2022年9月20日 上午12:01

相关推荐

  • python解析之namedtuple函数怎么使用

    源码解释: def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None): “””Returns a new subclass of tuple with named fields. >&g…

    2022年9月1日
    9000
  • windows浩辰cad看图王背景怎么换黑色

    浩辰cad看图王背景换黑色的方法: 1、首先我们打开图纸,点击左上角的“文件”选项。 2、接着在上方栏的帮助中,打开“设置” 3、打开后就可以看到背景颜色了,点击下方的颜色,如图所示。 4、点开后,选中弹出菜单中的“黑色” 5、设置完成后点击下方“确定”保存。 6、保存完成就可以发现我们的背景已经换…

    2022年9月21日
    10300
  • Excel small函数如何使用

    一、函数语法: SMALL(array,k) k 为返回的数据在数组或数据区域里的位置(从小到大)。 array 查找的数据区域。 二、SMALL函数使用实例: 1.数组是A3到A7,从中查找最小数和倒数第二小的数。 2.在C4单元格输人=SMALL(A3:A7,1), 3.回车以后C4单元格取得最…

    2022年9月2日
    10000
  • 项目管理是做什么

    项目管理是做什么?根这里我们将根据官方对项目管理的解释,以及项目经理的4大工作职责进行介绍。 一、项目管理具体是做什么 官方解释,项目管理其实是一个管理学科的分支 ,指在项目活动中运用专门的知识、技能、工具和方法,使项目能够在有限资源限定条件下,实现或超过设定的需求和期望。 比如你准备的一场考试就是…

    2022年3月19日
    11800
  • SQL怎么删除重复数据

    1 SQL去重 SQL中去除完全相同数据可以用distinct关键字,任意字段去重可以用group by,以下面的数据表为例。 2 distinct 存在两条完全相同的纪录,用关键字distinct就可以去掉 根据单个字段去重,能精确去重; 作用在多个字段时,只有当这几个字段的完全相同时,才能去重;…

    2022年9月20日
    67700
  • sqlmap _dns注入配置方法是什么

    网上针对sqlmap进行dns注入的相关文章太少,只是简单介绍了下–dns-domain参数,相关的实战文章要么就写的模糊或者一笔带过,搞的云里雾里(主要是菜,关键还没大佬带)。然后自己参考网上的方法自己重新搞了一遍。 需要准备的东西,sqlmap、windows盲注一个、两个域名、一台…

    2022年9月16日
    7200
  • LDAP NULL bind导致登录绕过漏洞分析和修复方案是什么

    LDAP NULL bind匿名绑定导致登录绕过漏洞分析和修复方案 一、背景 1.1LDAP和认证过程 LDAP轻型目录访问协议是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。有优异的读性能,但写性能差。 LDAP作为开放的Internet标准,支持跨平…

    2022年9月13日
    21200
  • SqlServer怎么创建自动收缩事务日志任务

    1. 进入SSMS 点击展开sqlserver代理,右键点击“作业”,然后选择新建作业。 2. 填写名称 名称可以随便填写,只要能表示这次作业任务就行了。简洁明了,让自己后面能看懂。 所有者选择sa或者windows用户。如果需要远程操作,建议选择sa账户。windows账户只支持本地登陆后操作执行…

    2022年9月13日
    11500
  • App崩溃的6个常见原因是什么

    人们讨厌应用程序崩溃,尤其是是程序减速或卡死几秒钟这样的现象。根据Dimensional Research的一项调查,61%的用户希望程序在4秒内启动,而49%的用户希望在2秒内响应输入。 如果应用发生崩溃,冻结或报错等现象,53%的用户会将APP卸载。 无论您的对象是消费者还是企业,崩溃问题会令他…

    2022年9月2日
    82500
  • Word尾注和交叉引用的区别是什么

    尾注和交叉引用的区别: 答:尾注是给选中的文字添加注释,存在于文章的结尾。 而交叉引用则是把脚注和尾注以及题注全部都交叉在一起使用。 一个是针对标题和结尾,一个仅仅是存在于文章的结尾。 尾注和交叉引用更多介绍: 1、尾注是可以放在文章页面的最下面的,可以对一些元素加以说明。 2、还可以将引用文章的出…

    2022年8月31日
    20600
联系我们
站长微信
站长微信
分享本页
返回顶部