小白学污点分析

(标题里的小白指我自己)

0x00 前言

污点分析(Taint Analysis)技术是信息流分析技术的一种实践方法,在信息泄露检测、漏洞探测、逆向工程等方面有广泛的应用并被移植到各种不同的环境和平台当中。污点分析技术将系统或应用程序中的数据标记为污点或非污点,当污点数据根据信息流传播策略可影响到非污点数据时,则将该非污点数据的标记修改为污点,当污点标签最终随数据传播到指定的存储区域或者信息泄露点时,则认定该系统违反了信息流策略。根据污点分析目标软件是否运行, 通常可将其分为静态污点分析(Static Taint Analysis,STA)与动态污点分析(Dynamic Taint Analysis,DTA)。根据目标程序分析粒度不同,污点分析技术可分为粗粒度污点分析(Coarse-grained Taint Analysis)和细粒度污点分析(Fine-grained Taint Analysis)。

0x01 污点分析原理

​ 污点分析技术模型包括污点源污点汇聚点无害化处理等部分。

​ 污点源(source):污点信息在程序中的产生点,即直接引入不受信任的数据或者机密数据到系统中。

​ 污点汇聚点(sink):系统将污点数据输出到敏感数据区或者外界,造成敏感数据区被非法改写或者隐私数据泄露。其中敏感操作可归 纳为以下四种:(1) 内存分配函数; (2) 数组访问指令; (3) 循环控制; (4) 危险函数, 如 strcpy/printf/fprintf 等。

​ 无害化处理(sanitizer):通过数据加密或重新赋值等操作使数据传播不再对系统的完整性和保密性产生危害。

​ 污点分析的处理过程可以分成 3 个阶段:(1) 识别污点源和汇聚点 (2) 污点传播分析 (3) 无害处理。

​ 污点数据主要通过数据间的依赖关系在系统或应用程序中进行传播,这种依赖关系又分为数据依赖和控制依赖。数据依赖主要包括程序中各变量间的直接赋值、数学计算等操作,控制依赖主要包括程序中各变量间的条件判断与指令跳转等情况。

5.5_overview

0x02 静态污点分析

​ 静态污点分析是指在不运行且不修改代码的前提下离线分析变量间数据和控制依赖关系,以检测污点数据能否从污点源传播到污点汇聚点。静态污点分析的对象是程序代码或中间表示(Intermediate Representation, IR)。静态污点分析的优点是代码覆盖率高, 缺点是不能获取程序真实的执行过程, 分析复杂且漏报率较高。可以学习LLVM IR并完成CSCD70

LLVMIR

0x03 动态污点分析

​ 动态污点分析是在目标程序运行过程中通过实时跟踪监控并记录程序变量、寄存器和内存等的值,确定污点数据能否从污点源传播到污点汇聚点。动态污点分析的主要过程由三个阶段组成:

1) 污点标记(污染源识别):将 source 点的输入数据标记为污点源数据,包括来自网络、文件及外部设备输入的外部数据。一般采用影子内存技术对污点数据进行标记,如果某寄存器或内存中存放的是污点数据,则影子内存将会生成一个污点数据结构的指针与该污点数据一一对应, 该污点数据结构保存的是与该污点相关信息,否则影子内存为空。为了跟踪污点数据的显示传播,需要在每个数据移动指令和算数指令执行前监控,当指令的结果被其中一个操作数污染后,把结果数据对应的影子内存设置为一个指针,指向源污染点操作数指向的数据结构。

2) 污点传播 (动态跟踪):在程序执行过程中跟踪污点数据的传播过程, 如果某个污点数据被复制到其他缓冲区, 或进行了一些运算, 将会导致其他内存数据变成不可信数据, 则将其标记为“被污染” (tainted)数据。动态污点跟踪通常基于三种机制:动态代码插桩(e.g. DynamoRio, Pin, Valgrind)、全系统模拟、虚拟机监视器。二进制代码级的污点分析有两种粒度,一是直接分析 x86 等指令集(效率更高),二 是中间语言(IR)。

3) 攻击检测(策略及规则) :检查程序中是否有非法使用污点数据的情况,常见的包括检测跳转地址攻击、格式化字符串攻击及缓冲区溢出攻击等,若检测到非法使用,则终止程序继续运行并报告潜在的攻击漏洞。

0x04 Clang Static Analyzer

源码:https://code.woboq.org/llvm/clang/

文档:https://clang.llvm.org/docs/ClangStaticAnalyzer.html

Clang AST: https://www.youtube.com/watch?v=VqCkCDFLSsc

架构:Parser, ExprEngine, StateManager, ConstraintManager, StoreManager……(懒得画图)

可以尝试编写一些检查器。参考:https://zhuanlan.zhihu.com/p/369254889

也可以查看taint-generic-config进一步思考。

困死了。。睡觉zzz

0x05 参考链接

https://www.k0rz3n.com/2019/03/01/%E7%AE%80%E5%8D%95%E7%90%86%E8%A7%A3%E6%B1%A1%E7%82%B9%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF/

https://www.bookstack.cn/read/CTF-All-In-One/doc-5.5_taint_analysis.md#%E5%8A%A8%E6%80%81%E6%B1%A1%E7%82%B9%E5%88%86%E6%9E%90

https://hexterisk.github.io/blog/posts/2020/05/03/taint-analysis/

https://hexterisk.github.io/blog/posts/2020/06/03/dynamic-binary-instrumentation-and-pin/

https://xueshu.baidu.com/usercenter/paper/show?paperid=1b0f00d0aw7g0tr0by4w0gn0cs524325&site=xueshu_se

https://xz.aliyun.com/t/7979

https://xueshu.baidu.com/usercenter/paper/show?paperid=2e4f5bd4cac517e72fd7fc80c74b047a&site=xueshu_se

https://arxiv.org/pdf/2007.05955.pdf