【缺陷周话】第5期 :越界访问

栏目: C++ · 发布时间: 5年前

内容简介:代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。360代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。

【缺陷周话】第5期 :越界访问

代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。

360代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和 工具 使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。

1 、越界访问

越界访问简单的说就是预先申请了一块内存,但在使用这块内存的时候超出了申请的范围从而引发越界。例如当程序访问一个数组中的元素时,如果索引值超出数组的长度,就会访问数组之外的内存。C/C++ 没有对数组做边界检查,不检查下标是否越界可以提升程序运行的效率,但同时也把检查是否越界的任务交给了开发人员,因此开发人员在编写程序时,需要额外注意避免越界访问。

2、 越界访问的危害

越界访问是 C/C++ 语言中常见的缺陷,它并不一定会造成编译错误,导致的后果也不确定。当出现越界时,由于无法得知被访问空间存储的内容,所以会产生不确定的行为,可能是程序崩溃、运算结果非预期,也有可能没有影响。2018年1月至9月,CVE中越界访问 9个相关漏洞中,有8个来自于开源项目 FFmpeg,部分漏洞信息如下:

CVE-2018-1999015 FFmpeg commit 5aba5b89d0b1d73164d3b81764828bb8b20ff32a 之前版本中的 ASF_F 格式分离器存在数组越界读取漏洞,导致栈内存读取。
CVE-2018-1999014 FFmpeg commit bab0716c7f4793ec42e05a5aa7e80d82a0dd4e75 之前版本中的 MXF 格式分离器存在数组越界访问漏洞。攻击者可利用该漏洞造成拒绝服务。
CVE-2018-1999010 FFmpeg commit cced03dd667a5df6df8fd40d8de0bff477ee02e8 之前版本中的 mms 协议存在多个数组越界访问漏洞。攻击者可利用该漏洞造成拒绝服务。

3、示例代码

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

3.1缺陷代码

【缺陷周话】第5期 :越界访问

上述示例代码在第48行对 data 的长度进行了判断,但只判断了长度是否为负数,并没有对上限进行限制(边界检查不完整),当 data 的值大于 9 时,在第50行处 buffer[data] 的数组下标越界。

使用360代码卫士对上述示例代码进行检测,可以检出“越界访问”缺陷,显示等级为高。如图1所示:

【缺陷周话】第5期 :越界访问

图1 越界访问检测示例

3.2 修复代码

【缺陷周话】第5期 :越界访问

在上述修复代码中,在第48行中对 data 的边界进行了完整的检查,因此避免传入第50行  buffer[data] 时越界。

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

【缺陷周话】第5期 :越界访问

图2:修复后检测结果

4、如何避免越界访问

要避免越界访问,需要注意以下几点:

(1)进行有效的边界检查,确保操作在合法的范围之内。尤其当使用外部输入数据作为数据源进行内存相关操作时,应格外注意进行边界检查,污染数据是造成越界访问的重要原因之一。

(2)显式的指定数组边界,不仅可以使程序的可读性提高,同时,大多数的编译器在数组长度小于初始化值列表的长度时会给出警告,这些警告信息可以帮助开发人员尽早发现越界问题。

(3)在使用循环遍历数组元素时,注意防范 off-by-one(一个字节越界)的错误。


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

查看所有标签

猜你喜欢:

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

Domain-Driven Design Distilled

Domain-Driven Design Distilled

Vaughn Vernon / Addison-Wesley Professional / 2016-6-2 / USD 36.99

Domain-Driven Design (DDD) software modeling delivers powerful results in practice, not just in theory, which is why developers worldwide are rapidly moving to adopt it. Now, for the first time, there......一起来看看 《Domain-Driven Design Distilled》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换