污点传播分析
-
污点分析是一种软件数据流分析技术,该技术通过标记程序中的数据为污点,跟踪程序处理污点数据的内部流程,进而帮助人们进入深入地程序分析和理解。
-
信息流:形式化描述程序中数据处理和传递的方法。
-
污点分析是在信息流理论的基础上,通过将程序外部输入或内部数据“绑定”污点标签的方式,实现了更加细粒度的程序分析。
-
通过借助动态污点分析,可以实时跟踪外部数据在程序内部的异常使用行为,而对于大部分恶意代码来说,其自身往往需要依赖特定的外部数据作为攻击载体,因此,通过污点分析来跟踪外部数据是否被用来作为某些异常行为的输入,可以有效地检测出系统中是否存在蠕虫、木马等恶意代码。
-
TaintCheck的核心思想:将来自网络的数据包标记为污点,借助指令插装技术分析每一条执行语句所对应的污点传播过程,进而通过污点误用规则检测出可能造成攻击的情况。
-
基于污点分析的模糊测试方法:根据数据完整性检测的机制,通过会将整个数据项进行复杂计算后和数据项中的校检和进行比较,如果计算结果和校检和一致,则表明数据是完整的,否则无法通过检测。
-
TaintBochs的核心思想:利用硬件层标记的方法跟踪敏感数据在全系统范围内的处理情况,最后借助动态污点传播分析敏感数据可能的泄露情况。
-
在利用污点分析方法进行实际分析的过程中,首先需要确定污点源,即污点分析的目标来源。而完整和高效的污点源识别是保证后续污点分析正确性的前提。
-
对于污点源的识别是通过监控程序从外部读取文件和接受数据包相关的系统调用来实现的。
-
污点源识别方法分为两类:一类是无约束识别,即从所有外部读取的数据内容都作为污点源标记;另一类是有约束识别,即只有从特定文件或者网络地址读取的数据内容才作为污点源标记。
-
无约束污点源识别的方法,是通过提取读入缓冲区和实际读入长度等参数来保证污点源的正确识别。
-
在动态跟踪过程中,一般需要涉及三个阶段,即动态指令监控、污点传播计算以及污点状态更新。
-
动态指令监控是进行污点跟踪的前提,只有正确监控程序执行过程中运行的每条指令,才能有效分析污点的处理过程;污点传播计算则通过分析每条监控指令的语义信息,并利用相关的污点扩散、清除规则来保证正确的传播过程;污点状态更新是反映传播计算的结果,其一般通过更新影子内存来实现。
-
Valgrind使用的D&R思路:第一,将程序运行的机器码转换成一条或者多条中间表示形式;第二,针对每一条IR添加分析指令,并将这些指令同样转化为多条IR;第三,通过将所有的IR再次重组成机器码的形式,最终实现指令插装的功能。
-
Pin使用的C&A思路:首先将想、程序运行的代码原封不动地复制一份,并利用自身包含的即时编译器从代码副本中获取一定数量的代码进行编译;随后,编译器会生成同样架构下的代码并添加额外的注释方法;最后,通过将新生成的代码和注释方法一起执行的方式实现指令的插装功能。
-
污点传播计算是结合已有污点数据和程序执行过程来实现污点扩散或者漂白的过程,是污点分析过程中最关键的步骤之一。