符号执行和污点分析之间有什么差距?

Hon*_*hen 9 security static-analysis dynamic-analysis runtime symbolic-computation

我最近读了EJ Schwartz博士的一篇题为"所有你想要了解动态污点分析和前进符号执行(但可能不得不提出来)"的论文.在本文中,他主要讨论了它们在二进制级安全上下文中的应用.

我很好奇动态污点分析前向符号执行之间的确切差异.

从我所看到的,每当存储在x中的信息被传送到对象y时,污点分析就跟踪从对象x()到对象y(接收)的信息流.因此,主要关注的是对象可以受到源的传递影响.符号执行将某些输入视为符号值,并尝试用符号表示其他变量; 因此它回答了什么条件的符号输入影响后续的程序.

我可以看到,在二进制级别,通常会提到污点分析,其中包含由覆盖返回地址引起的漏洞; 而符号执行可以处理更多类型的易受攻击的问题,如整数溢出,运行时断言错误,资源泄漏(例如,内存泄漏,文件打开/关闭),缓冲区溢出.

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

所以在一般情况下,我们可以说污点分析一种粗略的符号执行,还是符号执行一种精确的污点分析?

Ben*_*nny 2

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

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

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