• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

第十章:动态污点分析的原理

二进制分析实战 云涯 1周前 (11-18) 45次浏览

概述

10.1  什么是DTA

DTA也称为数据流追踪(Data Flow Tracking,DFT)、污点追踪(taint tracking)或污点分析(taint analysis),是一种程序分析技术,用于分析所选程序状态对程序其他部分状态的影响。

追踪“污点”的传播路径。 看看这个不干净的东西最终会影响到哪里。

10.2  DTA 三步:污点源、污点槽及污点传播

10.2.1  定义污点源

比如在厨房,如果想防止食物中毒,那么污染源就是生肉、生海鲜、没洗的蔬菜。这些东西可能携带细菌(污点),需要被标记和追踪。

如果你想防止异物混入,那么你的“污点源”可能就是玻璃容器或塑料包装袋。

你选择追踪的数据取决于你希望实现的目标,是“不安全数据的入口点”。

10.2.2  定义污点槽

如果你想防止食物中毒,你的“污点槽”就应该设在出餐口。检查员会在这里用快速检测仪(DTA库的检查函数)扫描即将出餐的菜肴,看看有没有生肉的细菌(污点数据)。

10.2.3  追踪污点传播

现在我们标记了生肉(污点源),也设立了出餐口检查站(污点槽)。但细菌不会瞬间移动,它是一步一步传播的。追踪污点传播就是实时跟踪这个传播过程。

这是监控系统(DTA库)最核心、最繁重的工作。 它需要在厨房的每个操作环节安装摄像头(插桩每一条数据处理指令),并遵循“污染规则”(污点策略)来推理。

传播例子:

厨师把生肉(污点源)放在砧板A上 -> 砧板A被污染。

厨师用同一把刀切了生肉,又去切熟食 -> 刀和熟食都被污染。

厨师用手(已污染)拿了盘子 -> 盘子被污染。

最后把熟食(已污染)放进盘子(已污染)端向出餐口 -> 警报大作!

 

10.3  使用DTA检测心脏滴血漏洞

想象你是一家米其林餐厅的主厨,你的秘制酱料配方(好比OpenSSL中的私钥)是你最重要的商业秘密。

10.3.1  心脏滴血漏洞概述

原来的安全流程:

客人点餐时说:”我要番茄意面,食材长度是6个字”

厨房看到”番茄意面”确实是6个字,就准备6人份的食材

一切正常!

 

心脏滴血漏洞的利用方式:

想象一个不怀好意的”客人”(攻击者)这样点餐:

他说:”我要面条,但食材长度是21个字”

注意!”面条”只有2个字,但他声称需要21个字的食材

漏洞所在:粗心的服务员(有漏洞的OpenSSL代码)只是简单相信客人说的”21个字”,于是:

从写着”面条”的食材区开始拿

拿了”面条”2个字后,继续往旁边拿…

结果拿到了旁边放着的秘制酱料配方(私钥)!

把这些不该给客人的机密信息一起打包送了出去

10.3.2  通过污点分析检测心脏滴血漏洞

现在,我们用DTA来防范这种欺骗:

 

第一步:标记敏感信息(定义污点源)

我们把秘制酱料配方(私钥)标记为”最高机密”(污点数据)

告诉监控系统:”这个配方一旦被外人看到就很危险!”

 

第二步:设置检查点(定义污点槽)

在出餐口(send系统调用)安装警报器

规则:任何带有”最高机密”标签的东西都不能送出厨房

 

第三步:实时追踪(污点传播)

攻击发生时:

恶意客人点餐:”我要面条,但需要21个字的食材”

粗心服务员开始准备:

先拿了”面条”(干净数据)

继续拿,拿到了旁边的秘制配方(污点数据)!

 

DTA系统立即工作:

监控摄像头发现:服务员的手碰到了秘制配方!

系统自动给服务员手上的所有食材都标记”可能污染”

当这份”问题餐”到达出餐口时…

🚨 警报大作! “检测到机密信息外泄!”

 

10.4  DTA 设计因素:污点粒度、污点颜色及污点传播策略

核心问题:之前的简单系统有什么局限性?

回想一下,我们之前的系统很简单:”生肉=污点,出餐口检查”。但现在遇到复杂情况了:

如果生肉只碰到了盘子的一小部分,整个盘子都要扔掉吗?

如果同时有生肉和过期牛奶两种危险源,怎么区分?

生肉经过烤箱烘烤后,还危险吗?

这就需要更精细的设计!

10.4.1  污点粒度-监控的精细程度”

位粒度:就像用显微镜追踪每一粒细菌。如果生肉只碰到刀尖的一个点,就只标记那个点。

字节粒度:就像用肉眼检查。只要刀沾了生肉,就把整把刀都标记为”污染”。

 

想象厨师用一把刀(操作数A)切了生肉,然后用这把刀搅拌沙拉(操作数B):

显微镜系统(位粒度):发现只有刀的刀尖碰到了沙拉的一小部分,只标记那一小部分沙拉为污染。

肉眼系统(字节粒度):看到刀沾过生肉,就把整碗沙拉都标记为污染。

 

显微镜:精准,但需要很多摄像头(性能开销大)

肉眼:不够精准(可能误报),但速度快

通常选择:用”肉眼系统”,在准确性和速度间取得平衡

 

10.4.2 污点颜色 – “区分不同危险源”

原来的系统只有一种”危险标签”,但现在我们需要区分:

红色标签:生肉细菌

蓝色标签:过期牛奶

紫色标签:既接触生肉又接触过期牛奶

 

为什么要区分颜色?

如果客人生病,我们可以追踪是哪种危险源导致的:

如果是红色→加强生肉处理流程

如果是蓝色→检查牛奶保质期

 

颜色混合(按位或):

红色(0x01) + 蓝色(0x02) = 紫色(0x03)

这样就能精确知道污染来自哪些源头

 

10.4.3 污点传播策略 – “不同的处理规则”

这是最有趣的部分!不同的烹饪操作,污染传播的方式不同:

厨房操作 技术对应 污染如何传播 为什么?
直接搬运 (c = a) mov指令 完全复制污染 就像把生肉直接从A盘移到B盘
混合搅拌 (c = a + b) add指令 取两者的污染并集 就像把生肉和蔬菜混合炒
自我抵消 (c = a ⊕ a) 自身异或 清除所有污染 就像把有毒物质与其解毒剂混合
移位操作 (c = a << 6) 左移指令 污染跟着移动 就像把污染区域向左平移

关键洞察: 不同的操作需要不同的”污染判断规则”!

 

10.4.4 过污染和欠污染 – “监控系统的误判”

欠污染(该报没报):

比喻:生肉上的细菌通过刀把传播到了菜板,但监控系统没发现

后果:危险被漏掉,客人可能食物中毒

原因:监控摄像头有盲区,或者规则太简单

 

过污染(误报):

比喻:厨师戴着一次性手套切生肉,但系统把整道菜都标记为污染

后果:浪费食物,降低工作效率

原因:规则太严格,分不清直接接触和间接接触

 

10.4.5 控制依赖 – “间接的影响”

假设规则是:”如果客人说’我很饿’,就多给他加一份菜”

恶意客人不断说”我很饿”(控制循环条件)

厨师因此给他加了10份菜(影响了最终结果)

但客人并没有直接说”给我10份菜”

 

问题:

传统的”DTA监控”只追踪直接数据流

它能看到客人说了什么,但看不到因为客人说的话而产生的间接影响

这就是”控制依赖”导致的欠污染

 

为什么不解决这个问题?

因为如果追踪所有间接影响,会产生大量误报:

正常客人说”我很饿”→系统误认为是攻击

真正的攻击很少见,但误报会非常多

 

10.4.6 影子内存 – “监控系统的记录本”

影子内存是由DTA系统分配的虚拟内存区域,用于追踪其余内存的污点状态。通常,DTA系统还在内存中分配一个特殊的结构,用于追踪CPU寄存器的污点信息。

比喻: 监控系统需要一个专门的记录本来记录每个食材、餐具的污染状态。

不同类型的记录本:

简单记录本(基于位图):只记录”干净/污染”,占用空间小

彩色记录本(字节数组):记录具体是哪种污染,占用中等空间

详细记录本(整数数组):记录32种不同颜色,占用很大空间

 

内存开销问题:

64位厨房(大餐厅)需要很大的记录本

但可以通过优化:只记录实际使用的区域,忽略永远不会污染的区域

10.6  练习

格式字符串漏洞是类C编程语言中一类著名的软件漏洞。当printf函数参数为用户控制的格式字符串时会出现这种漏洞,如程序中出现 printf(user)而不是正确形式的printf(“%s”, user)。 请你设计一个可以检测从网络或命令行发起的格式字符串漏洞攻击的 DTA 工具。该工具的污点源和污点槽应该是什么,以及需要哪种污点传播策略和粒度?在第11章结束时,你将能够实现自己的漏洞检测器!

 

污点源:网络输入、命令行输入

污点槽:所有格式字符串函数例如print、fprintf等

传播策略:字符串操作传播、指针赋值传播等

粒度:字节粒度

影子内存:只为实际包含污点数据的堆栈分配影子内存。

// 攻击案例1:直接使用用户输入
char buffer[100];
recv(socket, buffer, 100, 0);  // 标记buffer为污点
printf(buffer);                // 检测到污点格式字符串→警报

// 攻击案例2:间接传递
char user_input[100];
fgets(user_input, 100, stdin); // 标记为污点
char *format = user_input;     // 污点传播
printf(format);                // 检测到污点→警报

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:第十章:动态污点分析的原理
喜欢 (0)