我最近在"All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask)"读了一篇题为Dr. EJ Schwartz的论文。在本文中,他主要讨论了它们在二进制级安全上下文中的应用。
我很好奇动态污点分析和前进符号执行之间的确切差异。
从我所看到的,每当存储在x中的信息传输到对象时,污点分析就会跟踪从对象x(源)到对象y( sink )的信息流年。因此主要关注的是源可以传递影响的对象。虽然符号执行将某些输入视为符号值,而尝试以符号形式表示其他变量;因此,它回答符号输入影响后续程序的条件。
我可以看到,在二进制级别,经常会提到污点分析与返回地址被覆盖引起的漏洞;符号执行可以处理更多类型的易受攻击的问题,例如整数溢出,运行时断言错误,资源泄漏(例如,内存泄漏,文件)打开/关闭),缓冲区溢出。
然而,现代污点分析似乎不仅涉及数据流分析,其中大多数都将跟踪控制流条件;在一些漏洞检测场景中,受污染的输入也表示为符号值,并像符号执行一样传播。另一方面,由于底层约束求解器和执行/解释运行时的限制,符号执行引擎无法完全使用由不同路径条件分隔的符号值;因此,他们无法按预期实现高分支或路径覆盖。
所以在一般情况下,我们可以说污点分析 是 是一种粗略的符号执行,还是符号执行 是 一种精确的污点分析?
答案 0 :(得分:2)
有趣的问题!这是我的2美分:符号执行使用一种污点分析来构建路径约束。符号执行还使用SMT / SAT求解器为变量和/或输入生成具体值,以便满足某个路径约束。
由于污点分析不使用SMT / SAT求解器,我认为它不是一种符号执行。 也许有人会说污点分析是符号执行的一部分。
这只是一个意见。请随意挑战。
答案 1 :(得分:0)
我同意@Benny,这是一个非常有趣的问题。通过制定这些问题,你可能会学到很多东西,当你尝试回答这些问题时,你可能会学到更多。
我想补充Benny的回答:
为了实现污点跟踪和符号执行,必须定义语言的语义(例如,在二进制的情况下为x86汇编)。例如,必须描述什么
add eax, ebx
'表示',即对该州。污点跟踪语义的定义可以看作是符号执行语义的一种子集。污点跟踪语义在符号执行语义中编码。常见的部分是
ebx
被污染,则eax
会被污染。ebx
是符号(i.o.w。包含一个包含一个或多个符号变量的SMT公式),则eax
是符号然而,符号执行的语义必须包含更多信息(例如,精确的算术运算):
- eax
是" eax
之前的任何内容" +"在ebx
之前"
请评论或纠正我!
答案 2 :(得分:0)
在我看来,要回答你的问题,我们必须回答以下问题:i)符号执行是否有可能找到污点分析可以的所有执行路径,以及更多; ii)污点分析是否有可能找到符号执行可以执行的所有执行路径,以及更多; iii)他们是否具有找到相同执行路径的相同潜力; iv)他们都可以计算另一个不能执行的执行路径。
在我看来,iv)是正确的,这意味着一个不是一个子集。但是,我确实同意确实有很大的重叠。
我们可以消除选项i)和iii)因为符号执行只能找到可行的执行路径,而污点分析可能会发现它不可行而不会求解约束。
为了消除选项ii),我认为(如果我错了,请纠正我)有符号执行可以暴露的执行路径而污点分析不能。例如:
for(int i=0;i<3;i++) {
if(someString.charAt(i)=='4')
//do something
else
//do something else
}
在这种情况下,符号执行会暴露所有八个可能的执行路径,而污点分析(如果我没有弄错)则不会。
答案 3 :(得分:0)
我认为关键的区别在于执行是具体还是符号 ---您是否对的污点传播(用于检查信息泄漏或控制流劫持)感兴趣单一具体执行,或者如果您想通过利用求解器的力量探索此类传播的其他可能性。动态污点分析的优点是低开销,因此适合运行时监控。另一方面,(纯/动态)符号执行能够探索除具体路径之外的路径,因此适合于对您感兴趣的安全属性进行离线分析。