1. 概述
1.1发展简史
- 信息流分析方法:1976年,普渡大学D.E.Denning提出信息流的概念。通过向每一个数据对象“绑定”安全级别的方法,研究如何防止安全泄漏。
- 污点传播:在信息流基础上发展而来的一种跟踪数据在程序中处理逻辑的分析方法。根据不同的“绑定”机制,分为静态污点传播和动态污点传播。
- 静态污点传播方法:路径空间庞大,路径推演。
- 动态污点传播方法:
- 动态插桩技术和工具:Valgrind、Pin、qemu…
- TaintBochs
- TaintCheck:恶意代码检测与防御。
- TaintScope:软件漏洞分析与挖掘
- TaintDroid:移动端。
- TEMU:Dawn Song, http://bitblaze.cs.berkeley.edu/
- 污点传播的本质:数据流的跟踪。
2. 基本原理介绍
典型的污点传播过程演示:
1
2
3
4
5x = get_input
...
y = x + 42
...
goto y恶意数据流由x传播到y。
主要组成元素:
- 污点源:外部引入的数据。
- 传播规则:扩散规则和清楚规则,定义在不同条件下的污点数据流向逻辑策略。
- 监测点:判断污点数据是否被非法使用。
3. 主要方法介绍
3.1 污点源标记
- 主要流程
- 污点识别:识别外部数据输入。
- 内存映射:利用影子内存进行标记。
3.2 污点传播计算
- 应用程序级监控:指令插桩,在程序运行的过程中,在每条指令执行前(后)插入分析代码的形式。
- Valgrind:将原始二进制代码转换成中间代码,插桩后再重新编译为二进制代码。
- Pin:Windows环境下的动态指令插桩工具。Copy&Annote。
- 操作系统级别:
- QEMU
- DECAF
- 污点传播类型:
- 显示传播:赋值、函数(过程)调用、别名(指针)传播。
- 隐式传播:指针依赖、控制依赖(GAP点)。
4. 典型实例分析
下面是显式污点传播和污点传播的分析实例:
显式污点传播很容易理解,这里主要贴一下隐式污点传播:
变量Y 和变量X 之间并没有直接或间接的数据依赖关系(显式流关系),但X 上的污点标记可以经过控制依赖
隐式地传播到Y.具体来说,由第4 行的循环条件控制的外层循环顺序地取出X 中的每一个字符,转化成整型后
赋给变量x,再由第7 行的循环条件控制的内层循环以累加的方式将x 的值赋给y,最后由外层循环将y 逐一传
给Y.最终,第12 行的Y 值和X 值相同,程序存在信息泄漏问题.但是,如果不进行隐式流污点传播分析,第12 行
的变量Y 将不会被赋予污点标记,程序的信息泄漏问题被掩盖。
5. 参考文献:
- 污点分析技术的原理和实践应用: http://www.jos.org.cn/1000-9825/5190.htm