0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于符号执行的测试生成

上海控安 来源:上海控安 作者:上海控安 2023-04-07 11:36 次阅读

作者 | 王祺昌 华东师范大学软件工程学院硕士研究生

苏亭 华东师范大学软件工程学院教授

版块 | 鉴源论坛 · 观模

引言:测试用例自动生成,简称测试生成(Test Generation),是指针对给定的被测对象,例如代码单元、接口、系统等,使用相关算法生成测试用例集合的方法。其本质是测试用例设计自动化,无需开发者手动设计测试用例。测试生成可分为黑盒和白盒,前者在不考虑程序本身的情况下为程序生成测试用例,而后者分析程序的源代码或二进制代码以生成测试用例,基于符号执行的测试生成是一种典型的白盒测试生成方法。

01 什么是符号执行(symbolic execution)

符号执行(symbolic execution)是一种经典的程序分析技术,使用抽象的符号值(symbolic value)而不是精确的具体值(concrete value)作为程序输入,以此将程序变量的值表示为这些输入的符号表达式。在符号执行期间的任何一点,符号执行引擎可以获取到达该点的路径约束,并通过约束求解器(constraint solver)求解约束以得到可以到达该点的具体值。

下面的简单代码片段将给出一个例子,假设ERROR语句对应程序中的一个漏洞,我们使用符号执行判断是否有达到该语句的可能。符号执行会在给定的时间内,生成一组输入来尽可能多的探索所有的执行路径,程序的输入包括两个变量 x 和 y,因此符号执行会将它们都绑定到对应的符号值α和β,最终程序中的每个点都对应一组α和β组成的约束。

pYYBAGQvj8GAN9e_AAAasoWdcZg21.webp

图 1 符号执行代码示例

符号执行结束后生成的计算树如图 2 所示,树中的每个节点代表程序中的一个条件语句,每个边代表一组非条件语句的执行,每条路径代表从程序开始到路径终点的一条执行路径,通过为每条路径求解对应的路径约束,就可以判断该路径是否可行,并为可行路径生成对应的程序输入。

ERROR 语句对应的路径约束为(2*β==α ^ α<=β+10),求解该约束可得到一个可行解(α=4 ^ β=2),则(x =4, y=2)就是到达 ERROR 语句对应的程序输入。

pYYBAGQvj8KAdtrWAAARgPhkrOY49.webp

图 2 程序对应的计算树(computation tree)

02 符号执行的发展

符号执行的思想最早由 James C. King 在 1976 年发表的一篇论文[1]中提出,文中提出的“解析程序的路径后,用符号模拟通过路径并获得输出”的方法如今被称为“经典符号执行”。

虽然符号执行技术最早在 70 年代就被提出,但未受到研究者的广泛关注,直到 21 世纪才重新回到人们的视野中,这主要受两个原因的限制。首先,符号执行在大型现实世界程序中的应用需要求解复杂而庞大的约束,而当时的约束求解器的求解能力限制了符号执行技术推广,在过去十年中,涌现了了许多强大的约束求解器如 Z3 (de Moura and Bjørner, 2008)[2], Yices (Dutertre and de Moura, 2006)[3], STP (Ganesh and Dill, 2007)[4]。其次,老一代计算机的计算能力有限,无法符号地执行大型程序,而今天的计算机比八十年代强大得多,这减少了符号执行应用于大型真实世界程序的障碍。

2006年,Cristian Cadar 设计了一种“先进行符号执行,后根据符号执行结果生成测试用例”的“执行生成测试”技术[5],并随后将其发展为应用在GNU/Linux 内核错误检查中的 KLEE[6]。

2007年,Koushik Sen 提出将符号执行和实际执行结合的混合执行(Concolic Execution)[7]。

2009 年,Vitaly Chipounov 提出“选择性符号执行”,通过选择 “对程序设计者有意义”的执行分支进行符号执行测试来提高对大型程序应用符号执行测试的可行性。

如今符号执行已经被广泛用于测试领域,其中最著名的用途是进行测试生成以提高代码覆盖率并发现程序错误,此外还被用于安全漏洞自动生成、负载测试、故障定位和回归测试等。

03 符号执行进阶

3.1 混合执行(Concolic Execution)

混合执行(Concolic Execution)已成为一种流行的符号执行方法,又称为动态符号执行(Dynamic Symbolic Execution)或动态测试生成(Dynamic Test Generation) [8]。与经典符号执行不同,混合执行使用一个具体值作为输入驱动程序运行,沿途收集路径约束,当程序执行结束后通过对路径约束上的不同分支取反来生成新路径上的约束,交由约束求解器求解得到新的输入,重复上述策略以覆盖更多的路径。

通过这种输入迭代产生变种输入的方法,理论上所有可行的路径都可以被计算并分析。混合执行相较于经典符号执行的优势在于每次执行都是基于具体值的而非模拟符号值的执行,从而显著降低了符号执行的开销,使得符号执行技术有能力处理更大规模的现实世界程序。

3.2 符号反向执行(Symbolic Backward Execution)

符号反向执行(SBE)是符号执行的一种变体[9],它探索从程序中的特定目标点到程序的入口的路径,因此其分析方向和传统的正向符号执行相反。符号反向执行的主要目标是快速寻找可以到达程序中特定目标点(例如 assert 和 throw 语句)的测试用例,这对开发人员在对程序进行调试或回归测试时非常有用。

04 符号执行的限制

符号执行理论上可以对程序可能的执行路径进行详尽的探索,也因此在处理现实世界的程序时遇到了一些挑战:

(1) 路径爆炸

大多数符号执行方法不适用于处理大型程序:随着程序规模的扩大,程序中有意义的路径数量成指数级增长。许多程序中还存在无限循环(infinite-loop)或递归调用,这大大增加了路径条数,提高了符号执行的难度。

(2) 复杂约束

符号执行中的重要部分是对路径约束的求解,但现实中存在一些复杂约束使得约束求解器难以求解(例如非线性算术运算、第三方库函数等),这会显示符号执行系统可以探索的路径数量。

(3) 内存

符号执行引擎难以处理指针、数组等复杂对象,另外,由于符号执行根据内存地址分析变量及其变化,对于有内存地址别名的程序,符号执行引擎将难以区分不同别名,因此执行结果可能有偏差。

05 总结

符号执行作为一个经典的程序分析技术,在 21 世纪受到了研究者的广泛重视,并为软件测试提供了一个在白盒情况下精准和详尽地测试程序的全新思路,近年来不断出现新的符号执行技术和相关工具,被广泛应用于测试生成、负载测试、故障定位以及回归测试等场景。尽管取得了巨大进展,但符号执行仍然面临现实世界大型程序中存在的许多挑战,学术界和工业界也在不断探索符号执行和其他技术相结合以提升执行性能的方式,例如将符号执行与模糊测试相结合以提升测试生成的精确性和可扩展性。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7965

    浏览量

    149224
  • 代码
    +关注

    关注

    30

    文章

    4596

    浏览量

    67332
  • 软件测试
    +关注

    关注

    2

    文章

    217

    浏览量

    18430
  • 符号
    +关注

    关注

    0

    文章

    55

    浏览量

    4239
收藏 人收藏

    评论

    相关推荐

    MX项目-名称中有“&”符号时无法生成代码的原因?

    我使用了 CubeMX 5.6.1,然后我尝试为带有“ & ”符号的项目生成代码,并且生成卡在复制库文件中。我多次重新启动 CubeMX,但没有任何变化,所以我删除了“ & ”符号
    发表于 01-30 08:28

    为什么STM32在使用Device Configuration Tool生成代码后添加DEBUG预处理器符号

    你好!我已经在我所有的项目中测试过这个。我有几种带有多种符号的编译风格,但您只能使用默认风格测试此问题:Release 和 Debug。删除 Debug 风格的 DEBUG 预处理器符号
    发表于 02-01 06:36

    用MDK生成bin格式的可执行文件

    用MDK 生成bin 文件1用MDK 生成bin 文件Embest 徐良平在RV MDK 中,默认情况下生成*.hex 的可执行文件,但是当我们要
    发表于 08-02 10:52 71次下载

    Linux驱动程序缺陷检测研究

    驱动程序是操作系统的重要组成部分。驱动程序运行于内核态,其可靠性对于操作系统的安全可靠非常关键。针对Linux驱动程序,研究基于符号执行的驱动程序缺陷自动检测方法。提出了基于性质制导符号执行
    发表于 11-21 15:26 9次下载
    Linux驱动程序缺陷检测研究

    结合静态分析与动态符号执行的软件漏洞检测方法

    动态符号执行是近年来新兴的一种软件漏洞检测方法,它可以为目标程序的不同执行路径自动生成测试用例,从而获得较高的测试代码覆盖率。然而,程序的
    发表于 11-23 15:01 6次下载
    结合静态分析与动态<b class='flag-5'>符号执行</b>的软件漏洞检测方法

    基于DSEA的弱变异测试用例集生成方法

    为解决基于集合进化算法(SEA)的弱变异测试用例集生成过程中个体规模固定和执行开销大的问题,提出一种基于动态集合进化算法( DSEA)的弱变异测试用例集
    发表于 11-28 16:11 0次下载

    基于符号执行技术实现的驱动程序的漏洞检测

    的思路,提出了一种基于符号执行技术实现的驱动程序模拟环境,可以用于分析和检测Linux设备驱动程序中存在的安全漏洞。该环境通过模拟内核提供给驱动程序的服务接口,使驱动程序可以在应用层进行符号执行进而可对其进行漏洞检测。同时
    发表于 12-05 16:06 0次下载
    基于<b class='flag-5'>符号执行</b>技术实现的驱动程序的漏洞检测

    面向危险操作的动态符号执行方法

    针对缺陷检测的需求,提出了面向危险操作的动态符号执行方法.依据所关注的缺陷类型,定义危险操作及危险操作相关路径,通过计算覆盖不同上下文中危险操作的能力,协助动态符号执行选择高效初始输入,并利用危险
    发表于 01-14 14:02 0次下载

    FPGA I/O优化功能自动生成FPGA符号

    FPGA I/O 优化功能提供了自动化 FPGA 符号生成流程,该流程与原理图设计和 PCB 设计相集成,可节省大量创建 PCB 设计的时间,同时提高原理图符号的总体质量和准确性。
    的头像 发表于 05-20 06:16 2950次阅读
    FPGA I/O优化功能自动<b class='flag-5'>生成</b>FPGA<b class='flag-5'>符号</b>

    FPGA自动符号生成节省PCB设计创建时间

    FPGA的I / O优化提供了一个自动化的FPGA符号生成过程集成的原理图和PCB设计,节省天的PCB设计创建时间的整体质量和准确性,同时增加你的原理图符号
    的头像 发表于 10-16 07:06 2384次阅读

    软件测试的运行划分:动态静态测试的区别

    静态方法是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。
    的头像 发表于 06-29 11:05 1.6w次阅读

    如何使用符号执行的python实现攻击脚本分析平台

    传统的静态分析方法大多不能准确处理脚本与网络交互的过程,且会引入不可达路径,动态分析则需要搭建实验环境和手工分析。针对上述问题,提出一种基于符号执行的Python攻击脚本分析平台PyExZ3+。通过
    发表于 07-16 15:50 11次下载
    如何使用<b class='flag-5'>符号执行</b>的python实现攻击脚本分析平台

    结合混合符号执行的导向式灰盒模糊测试方法

    导向式灰盒模糊测试是一种能够快速生成测试用例,达到给定程序目标区域并且发现漏洞的模糊测试技术。针对当前导向式模糊测试难以通过魔术字节等检查语
    发表于 03-26 14:46 14次下载
    结合混合<b class='flag-5'>符号执行</b>的导向式灰盒模糊<b class='flag-5'>测试</b>方法

    符号执行技术可识别安全关键代码中的漏洞

      多核处理器在安全关键型应用中越来越受欢迎,因为它们提供了显著的价格和性能改进。但是,为多核硬件编写多线程应用程序是出了名的困难,并可能导致灾难性故障。下面描述了用于识别问题(包括数据争用)的符号执行技术?最常见的并发缺陷之一?以及静态分析如何帮助开发人员找到并消除它们。
    的头像 发表于 11-08 11:33 673次阅读
    <b class='flag-5'>符号执行</b>技术可识别安全关键代码中的漏洞

    鉴源论坛 · 观模丨基于搜索的测试生成

    基于搜索的测试生成测试生成问题建模为最优化问题,其核心思想是针对期望达到的测试目标,以相关目标(成本)函数为指引,使用搜索算法在输入域中寻
    的头像 发表于 12-02 16:25 740次阅读
    鉴源论坛 · 观模丨基于搜索的<b class='flag-5'>测试</b><b class='flag-5'>生成</b>