- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
目录
3.1 C和C++开发安全现状
3.2 C和C++常见安全漏洞
3.3 C和C++安全编码规范
1
本章学习目标
1.了解C和C++开发的安全现状;
2.理解C和C++安全漏洞的原理;
3.理解C和C++漏洞的防御方法;
4.掌握C和C++安全编码规范;
2
C和C++开发安全现状
3.1
C和C++开发现状
C和C++拥有很好的内存操作能力,工作效率更高。
C和C++的应用领域非常广泛,包括操作系统、浏览器、嵌入式开发,游戏引擎和各类编辑器。
C和C++语言在2015,2016年TIOBE编程语言排行榜中稳固二三名。
C和C++的安全问题
(1)指针的使用
程序员可通过指针对内存地址进行显示类型转换,访问对象的私有成员,破坏了对象的安全性,出现非法指针解引用、内存泄漏等漏洞。
(2)全局变量不加封装
局部变量的修改可能导致全局空间的变量取值发生变化,从而影响其他函数取值和运行。
(3)调用危险函数
标准 C/C++ 语言库中包含一些存在漏洞的危险函数,开发人员在编写代码时常调用这些危险函数。
C和C++常见安全漏洞
3.2
缓冲区溢出
缓冲区溢出是指程序员向缓冲区读写的数据超出了缓冲区定义的容量,从而覆盖了缓冲区后面的其他内存数据的现象。
攻击者可通过控制用户输入人为覆写栈帧或邻接内存的数据结构,从而执行构造的恶意代码。
典型的缓冲区溢出漏洞有心脏流血漏洞(OpenSSL Heartbleed),攻击者通过构造特殊的数据包使得用户心跳包中无法提供足够多的数据,从而导致memcpy函数把SSLv3记录之后的数据直接输出。
释放后使用
释放后使用(Use After Free-UAF)漏洞是指程序中错误的保留了已释放内存对象的引用,继续访问已释放内存的行为。
攻击流程:
(1)攻击者在内存释放对象A
时大量申请与A同样大小的
对象X,使A释放的内存分配
给X。
(2)在继续使用引用b时,
由于A内存已被X占据,攻击者
可使用引用b执行任意代码。
整型溢出
整数溢出是指由于程序员将数据放入了比它本身小的存储空间中,而出现的溢出现象。
三类整数操作可导致整型溢出漏洞:
(1)无符号整数的下溢和上溢:因无符号整数不能识别负数导致。
(2)符号问题:符号整数之间的比较;有符号整数的运算;无符号整数和有符号整数的对比。
(3)截断问题:在高位数的整数(如32位)复制到低位数的整数(如16位)时发生的溢出现象。
空指针解引用
空指针解引用是指在引用指向空地址单元的指针变量时产生的空指针引用故障。
空指针引用故障可能导致系统崩溃、拒绝服务等诸多不良后果。
典型例子:
deep—rev—state_process()函数在关闭了套接字后仍然允许接受操作,若没有阻止攻击者对己经废弃套接字的操作,可造成空指针引用。
格式化字符串
格式化字符串漏洞是指软件使用了格式化字符串作为参数,且该格式化字符串来自外部输入。
触发格式化字符换漏洞的函数有printf、sprintf、fprintf等print家族函数。
格式化字符串的利用分为两种:
(1)有binary且格式化字符串在栈中:可直接修改函数返回地址,利用%n来写入数据以修改控制流。
(2)有binary且格式化字符串不在栈中:通过构造跳板来实现利用。
内存泄漏
内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,导致程序运行速度减慢甚至系统崩溃等后果。
内存泄漏以产生的方式可以分为四类:
(1)常发性内存泄漏:发生内存泄漏的代码会被多次执行到,每次被执行时都会导致一块内存泄漏。
(2)偶发性内存泄漏:发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。
(3)一次性内存泄漏:发生内存泄漏的代码只会被执行一次,总会有一块且仅有一块内存发生泄漏。
(4)隐式内存泄漏:程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。
二次释放
二次释放(Double Free)是指程序在释放一块内存后没有将指向这块内存的所有指针清零或回收,并在其他地方再次将指向同一块内存单元的指针交给内存分配器去进行释放操作。
二次漏洞的利用:
(1)在释放对象A时申请同样大小的对象B,在对象A被释放后,二次释放对象A,此时实际上释放了B的内存。
(2)在对象A被二次释放时申请同样大小对象X,此时可调用b的方法执行任意代码。
类型混淆
类型混淆漏洞指程序使用一种类型初始化指针、对象等资源,而在随后使用另外一种(并不兼容的)类型对这些资源进行访问。
典型例子:
Word在解析docx文档处理displacedByCustomXML属性时未对customXML对象进行验证,其可传入其他标签对象进行处理,造成类型混淆,导致任意内存写入和远程任意代码执行。
未初始化漏洞
未初始化漏洞是指程序中
原创力文档


文档评论(0)