10

我最近阅读了EJ Schwartz 博士的一篇题为“所有你想知道的关于动态污点分析和正向符号执行(但可能不敢问)”的论文。在论文中,他主要讨论了它们在二进制级别安全上下文中的应用。

我很好奇动态污点分析正向符号执行之间的确切区别。

据我所知,只要存储在 x 中的信息传输到对象 y ,污点分析就会跟踪从对象 x( source ) 到对象 y( sink ) 的信息流。所以主要关心的是什么对象可以被源传递地影响。而符号执行将一些输入视为符号值,并尝试用符号值来表达其他变量;因此它回答符号输入影响后续程序的条件。

我可以看到,在二进制层面,污点分析经常被提到返回地址覆盖导致的漏洞;而符号执行可以处理更多类型的易受攻击的问题,例如整数溢出运行时断言错误资源泄漏(例如,内存泄漏、文件打开/关闭)、缓冲区溢出

然而,现代污点分析似乎不仅仅涉及数据流分析,它们大多会跟踪控制流条件;在几个漏洞检测场景中,受污染的输入也表示为符号值,并像符号执行一样传播。另一方面,由于底层约束求解器和执行/解释运行时的限制,符号执行引擎不能完全使用由不同路径条件分隔的符号值;因此,它们无法达到预期的高分支路径覆盖率。

那么在一般情况下,是否可以说污点分析一种粗略的符号执行,或者说符号执行一种精确的污点分析呢?

4

4 回答 4

2

有趣的问题!这是我的 2 美分:符号执行使用一种污点分析来构造路径约束。符号执行还使用 SMT/SAT 求解器为变量和/或输入生成具体值,从而满足某个路径约束。

由于污点分析不使用 SMT/SAT 求解器,我会说它不是一种符号执行。也许有人可以说污点分析是符号执行的一部分

这只是一个意见。请随时挑战它。

于 2015-12-16T16:58:36.310 回答
0

我认为关键的区别在于执行是具体的还是象征性的——您是否对单个具体执行的污染传播(用于检查信息泄漏或控制流劫持)感兴趣,或者您是否想探索其他可能性通过利用求解器的力量进行这种传播。动态污点分析的优点是开销低,因此适用于运行时监控。另一方面,(纯/动态)符号执行能够探索除具体路径之外的路径,因此适合对您感兴趣的安全属性进行离线分析。

于 2017-06-25T20:15:07.173 回答
0

我同意@Benny,这是一个非常有趣的问题。通过提出这类问题,您可能会学到很多东西,当您尝试回答这些问题时,您可能会学到更多。

我想补充本尼的回答:

为了实现污点跟踪和符号执行,必须定义语言的语义(例如二进制文件中的 x86 汇编)。例如,必须描述什么

add eax, ebx

“手段”,即对国家做事。污点跟踪语义的定义可以看作是符号执行语义的一种子集。污点跟踪语义被编码在符号执行语义中。共同的部分是

  • 如果ebx被污染了,那么eax就被污染了。
  • 如果ebx是符号(iow 包含一个包含一个或多个符号变量的 SMT 公式),那么eax是符号

然而,符号执行的语义必须包含更多信息(例如精确的算术运算): -eax是“eax之前的内容”+“ebx之前的内容”

请评论或纠正我!

于 2016-02-26T17:56:00.823 回答
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
}

在这种情况下,符号执行会公开所有八种可能的执行路径,而污点分析(如果我没记错的话)不会。

于 2016-11-24T19:35:47.697 回答