赞
踩
这篇文章来源于CCF的C类会议SEKE 2021。文章主要介绍了一种快速到达软件补丁的混合执行技术。看这篇文章主要是看他如何快速生成到达补丁附近的输入。
软件更新在带来新功能的同时,也有可能引入新的bug。因此,安全研究人员会在软件发布前测试更新的软件。许多研究者都在开发新技术来实现高覆盖率的测试组件。文章提到现有的concolic execution不足以在真实程序里快速,自动地生成测试样例。本文提出了一种基于concolic execution的方法来确保补丁的合法性和可靠性。
输入包含两个,一个是新版本的程序和补丁,另外一个是从test suite 选择的一部分输入。输出是触发bug或者覆盖测试补丁行的输入。
主要分为地址映射和定向混合执行两个步骤。地址映射部分分为构建控制流图、构建映射和动态修正控制流图和调用图。
生成调用图:根据补丁行所在的函数,将补丁分为几个集合。然后选择每个集合里的其中一行作为核心目标。这一行需要是补丁的核心部分。然后使用IDA Pro来静态分析新版本的程序,构建控制流图和调用图。然后使用核心目标来在控制流图中标记可能的执行路径,并且标记相应的函数调用路径。由于间接跳转和指针可能会影响静态分析的准确性,在后面的步骤中会动态修正CFG和CG。
构建映射:混合执行器使用初始输入去测试新版本的程序。当遇到一个分支时,执行器会生成一个新的状态,并且告诉address finder去找下一条地址的指令。然后将新的状态映射到这个地址,并将状态放在候选池里。当混合执行遇到分支时,会将新生成的分支状态加到执行树里。FCEP构造执行树和静态分析一样,把为true的状态放到左子树,false状态放在右子树。由于true分支和false分支和静态分析生成的cfg一样,所以每个分支的下条指令地址可以很快查询到。
动态修正CFG和CG:由于静态分析不能很准确地推断间接跳转和函数指针调用,在使用静态分析去指导混合执行的时候会存在很多false negative。如果FCEP遇到间接跳转和函数指针调用,就动态修正CFG和CG去获取路径更精确的信息。
目标搜索策略:
当遇到条件分支时,生成新的状态,并被放入候选池中。然后会根据搜索策略从候选池中选择一个新的状态去执行。在测试开始前,FCEP从调用图获取了每个函数的范围,并且从CFG中选择了一条被标记的路径,可以从main函数执行到核心目标。当执行完初始状态后,FCEP需要确定新生成的状态是否命中了目标函数。如果命中了,FCEP就会选择靠近目标的路径去继续执行。如果没有状态命中目标函数,FCEP会去寻找调用目标函数的函数caller,并且去确认是否有状态在caller地址范围里。
程序的代码地址不是连续的,但是函数内的地址是连续的。因此,当选择最近的状态时,采用新状态的地址减去目标指令的地址来作为依据。对于目标函数,目标是补丁行,对于调用链上的其他函数,目标是函数调用的那一行。
当新的分支状态生成时,FCEP就会去确认下条指令是否命中了目标函数,如果命中了,就给这个状态高优先级。当一条路径命中了核心目标代码,FCEP就会继续选择命中目标函数的状态,继续去混合执行,直到没有状态命中目标函数,或者超时了。在这个步骤中,FCEP只要执行高优先级的状态,直到所有高优先级的状态都被执行了。在这之后,对下一个核心目标继续上面的步骤。这个过程的目的是尽可能地测试离补丁较近的代码。
实验部分就不细说了,这次主要看的是文章的思想。
总的来说是先用静态分析确定目标,再设计混合执行的搜索策略来测试补丁后的程序。混合执行的搜索策略是先在函数粒度上搜索目标函数,再在函数内搜索目标状态。这个思路也挺不错的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。