污点分析在多个先进的漏洞检测方法中经常被提到,旨在利用这种技术定位引发程序错误的关键输入。分享一篇发表于2005年NDSS的TaintCheck论文,一种经典的动态污点分析工具,结合DFSan数据流分析器深入理解污点分析原理。
论文摘要
软件漏洞对互联网会造成灾难性的影响,类似CodeRed和Slammer这类的蠕虫病毒可以在数小时甚至数分钟内危害数十万台主机,造成巨大的损失。为了抵御这种互联网攻击,需要一种能够快速且自动的攻击检测和过滤机制。
这篇论文提出了一种动态污点分析工具TaintCheck用于自动检测通过内存重写进行漏洞利用的大多数网络攻击,该工具不需要对源码进行特殊编译,而是在程序运行时执行二进制重写来实现动态污点分析。研究和实验表明TaintCheck可以检测多种类型的漏洞利用且都没有产生误报,基于该工具还可以改进对攻击行为的自动签名生成。
1 背景介绍
蠕虫病毒能够在短时间内快速攻击大量的互联网主机,为应对这类安全风险需要有一种自动检测和防御机制。首先,这种自动检测应该很容易部署,且有较低的误报和漏报,能够检测大多数漏洞。其次,一旦新的漏洞利用被发现,能够计算出攻击签名进行高效筛选,检查后续网络流量中是否含有类似攻击。
为了做到上述要求,需要如下两个关键技术:
- 细颗粒度的攻击检测器
将攻击检测的方法粗略地分为两种类型:粗颗粒度的和细颗粒度的。其中,粗颗粒度的方法检测异常的行为,例如网络端口扫描,关键系统调用,敏感请求内容等,这些技巧简单实用且屏蔽了复杂的程序架构。而细颗粒度的方法则深入到程序内部,了解引起漏洞的原因,提供更加详细的信息,掌握该漏洞是如何被利用的,从而构建模式以规避更多类似的攻击手段。
- 自动化的攻击签名工具
由于细颗粒度的检测器是十分昂贵的,不太可能在每一台主机上都进行部署。一旦新的利用攻击被发现,主机需要能够快速地进行筛选和识别。传统的基于载荷内容的攻击签名,通常采用手动构造签名维护一个数据库,需要利用检测器来自动地分析漏洞利用以及生成攻击签名。
这篇论文开发的动态污点分析工具TaintCheck,可以在不需求源码的条件下,可靠地检测大多数针对内存的重写攻击,并且没有发现已知的误报,同时允许基于攻击签名生成实现自动化的语义分析。
2 TaintCheck设计
攻击者想要程序错误执行,会让程序接收其特殊构造的值,而不是来源于可信的输入。论文将来自于外部的不可信的输入,及其通过算术运算派生的数据都标记为tainted
,然后监控程序执行来跟踪被污染数据的传播。传统方法通过检测攻击者是否对关键内存部分进行重写来发现攻击,污点分析则是追踪被污染的数据是否相关的重写函数调用来发现攻击,因而可以检测更大范围的攻击类型。
2.1 工具模型
TaintCheck将程序运行在虚拟机环境中,依靠Valgrind工具来执行动态污点分析。Valgrind是一个开源的仿真器,可用于进行内存调试和性能分析,它设计了一种与精简指令集类似的指令系统UCode,用于进行程序运行时插桩和代码分析。
TaintCheck设计了3个组件,图1展示了攻击检测流程。额外的Exploit Analyzer组件收集分析过程的信息,当成功检测到攻击之后,会利用这些信息自动化生成攻击签名。
- TaintSeed
TaintSeed组件将不可信来源的输入数据标记为被污染的,内存中的每个字节,包括寄存器、堆栈等,都对应一个4字节的影子内存空间,用于存储指向Taint
数据结构的指针,或设置为空(表示没有被污染)。
当内存被标记为被污染时,TaintSeed组件会分配一个Taint
数据结构,记录系统调用号、当前栈的快照、被写入的数据副本,然后返回地址写入到影子内存空间中,这些信息在成功检测到攻击时被Exploit Analyzer组件使用。
- TaintTracker