我最近读了一篇论文,标题为 "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(source)到对象 y(sink)的信息流y。因此,主要关注的是哪些对象可以被源传递影响。虽然符号执行将某些输入视为符号值,并尝试用符号值来表达其他变量;因此,它回答了符号输入在什么条件下影响后续程序。
我可以看到,在二进制层面,污点分析经常被提到返回地址覆盖导致的漏洞;而符号执行可以处理更多类型的易受攻击的问题,例如整数溢出、运行时断言错误、资源泄漏(例如内存泄漏、文件泄漏)打开/关闭),缓冲区溢出。
然而,现代污点分析似乎不仅仅涉及数据流分析,大多数都会跟踪控制流条件;在一些漏洞检测场景中,受污染的输入也表示为符号值,并像符号执行一样传播。另一方面,由于底层约束求解器和执行/解释运行时的限制,符号执行引擎无法完全使用由不同路径条件分隔的符号值;因此,它们无法达到预期的高分支或路径覆盖率。
那么在一般情况下,我们是否可以说污点分析是一种粗略的符号执行,或者符号执行是 一种精确的污点分析?
最佳答案
有趣的问题!这是我的 2 美分:符号执行使用一种污点分析来构建路径约束。符号执行还采用 SMT/SAT 求解器来生成变量和/或输入的具体值,以满足特定的路径约束。
由于污点分析不使用 SMT/SAT 求解器,所以我认为它不是一种符号执行。 也许可以说污点分析是符号执行的一部分。
这只是一个意见。请随意挑战。
关于security - 符号执行和污点分析之间有什么差距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28811770/