我最近阅读了EJ Schwartz 博士的一篇题为“所有你想知道的关于动态污点分析和正向符号执行(但可能不敢问)”的论文。在论文中,他主要讨论了它们在二进制级别安全上下文中的应用。
我很好奇动态污点分析和正向符号执行之间的确切区别。
据我所知,只要存储在 x 中的信息传输到对象 y ,污点分析就会跟踪从对象 x( source ) 到对象 y( sink ) 的信息流。所以主要关心的是什么对象可以被源传递地影响。而符号执行将一些输入视为符号值,并尝试用符号值来表达其他变量;因此它回答了符号输入影响后续程序的条件。
我可以看到,在二进制层面,污点分析经常被提到返回地址覆盖导致的漏洞;而符号执行可以处理更多类型的易受攻击的问题,例如整数溢出、运行时断言错误、资源泄漏(例如,内存泄漏、文件打开/关闭)、缓冲区溢出。
然而,现代污点分析似乎不仅仅涉及数据流分析,它们大多会跟踪控制流条件;在几个漏洞检测场景中,受污染的输入也表示为符号值,并像符号执行一样传播。另一方面,由于底层约束求解器和执行/解释运行时的限制,符号执行引擎不能完全使用由不同路径条件分隔的符号值;因此,它们无法达到预期的高分支或路径覆盖率。
那么在一般情况下,是否可以说污点分析是一种粗略的符号执行,或者说符号执行是一种精确的污点分析呢?