污点分析技术(一)基本原理

这两天在AFLSMART的论文时发现提到了动态污点分析这项技术,正好前两天在VUL337课题组里面也发现有大佬提到过这个,但是还是不太明白,趁着今天有时间给自己科普一下。

参考博客:https://www.cnblogs.com/LittleHann/p/13034079.html

0x1 污点分析定义

根据这篇博客,污点分析由三部分组成:污点源(source)、污点汇集点(sink)和数据流处理(processor)

其中,source指的是最开始引入外部数据的操作;sink代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性)的操作。(我也理解为最后一次处理被污染的数据的操作);processor代表数据加密或者转义的过程,是一个把数据无害化的过程

在我看来,污点分析有点像是高中生物学的同位素示踪法,通过引入同位素,然后检测受污染的区域,以达到显示整个处理流程的目的,然后来分析可能出现的问题。

0x2 识别污点源和污点汇聚点

识别污点源和污点汇聚点是污点分析的前提。目前,在不同的应用程序中识别污点源和汇聚点的方法各不相同,这其实是一个泛概念,在不同的场景下,污点源和汇聚点污点分析会表现出不同的形式,这里的场景例如:

  • 不同的系统模型
  • 编程语言之间的差异
  • 待跟踪分析的对象的差异

对于污点汇聚点来说,可以从概念上大致分为3类:

  • 使用启发式的策略进行标记。例如在webshell检测中,将来自程序外部输入的数据统称为“污点”数据,保守地认为这些数据有可能包含恶意的攻击数据
  • 根据具体应用程序调用的 API 或者重要的数据类型,手工标记源和汇聚点。例如在webshell检测中,将file_get_contents这一类危险函数的执行结果标记为污点,继续后续的跟踪
  • 使用统计或机器学习技术自动地识别和标记污点源及汇聚点.

0x3 污点传播分析

污点传播分析就是分析污点标记数据在程序中的传播途径。按照分析过程中关注的程序依赖关系的不同, 可以将污点传播分析分为以下两种:

  • 显式流分析
  • 隐式流分析

1.显式流分析

污点传播分析中的显式流分析就是分析污点标记如何随程序中变量之间的【数据依赖关系】传播

1
2
3
4
5
6
7
8
9
10
void foo(){
int a = source(), //污点源
int b = source(); //污点源
int x,y;
x = a * 2;
y = b + 4;
sink(x); //污点汇聚点
sink(y); //污点汇聚点
}
//代码逻辑输入的值会乘2或者加4被泄露

在上面这段代码中,a和b被污点源函数source标记为污点源,设标记为taint_a和taint_b,在第5、6行的对x、y赋值的过程中,其数据内容直接依赖于变量a、b,显式流分析会分别将taint_a和taint_b传播给x、y,由于x,y在第7、8行到达污染汇聚点,我们就可以按照预设的策略得出结论,例如上面代码存在的信息泄露问题。

2.隐式流分析

污点传播分析中的隐式流分析是分析污点标记如何随程序中变量之间的【控制依赖关系】传播,也就是分析污点标记如何从条件指令传播到其所控制的语句

1
2
3
4
5
6
7
8
9
10
11
12
13
void foo(){
string X = source(); //污点源
string Y = new string();
for(int i = 0;i < X.length();i++){
int x = (int) X.charAt(i);
int y = 0;
for(int j = 0;j < x;j++){
y = y + 1;
}
Y = Y + (char) y;
}
sink(Y); //污点汇聚点
}

在上图所示的代码中,变量 X 是被污点标记的字符串类型变量,变量 Y 和变量 X 之间并没有直接或间接的数据依赖关系(显式流关系),但 X 上的污点标记可以经过控制依赖隐式地传播到 Y。

具体来说,由第 4 行的循环条件控制的外层循环顺序地取出 X 中的每一个字符,转化成整型后赋给变量 x,再由第 7 行的循环条件控制的内层循环以累加的方式将 x 的值赋给 y,内层循环执行完毕后,x == y。最后由外层循环将 y 逐一传给 Y。

最终,第 12 行的 Y 值和 X 值相同,程序存在信息泄漏问题。

但是,如果不进行隐式流污点传播分析,第 12 行 的变量 Y 将不会被赋予污点标记,程序的信息泄漏问题被掩盖。

3.欠污染和过污染问题

隐式流污点传播一直以来都是一个重要的问题,和显式流一样,如果不被正确处理,会使污点分析的结果不精确。

  • 由于对隐式流污点传播处理不当导致本应被标记的变量没有被标记的问题称为欠污染(under-taint)问题
  • 由于污点标记的数量过多而导致污点变量大量扩散的问题称为过污染(over-taint)问题

欠污染和过污染问题,都会导致在汇聚点污点检测的时候产生误报或者漏报,这也是目前隐式流问题研究的重点。

0x4 无害处理

污点数据在传播的过程中可能会经过无害处理模块,无害处理模块是指污点数据经过该模块的处理后,数据本身不再携带敏感信息或者针对该数据的操作不会再对系统产生危害。换言之,带污点标记的数据在经过无害处理模块后,污点标记可以被移除。

正确地使用无害处理可以降低系统中污点标记的数量,提高污点分析的效率,并且避免由于污点扩散导致的分析结果不精确的问题。

1.加密处理

开发者将敏感数据进行加密处理,加密库函数就是processor模块,加密后,攻击者就无法计算出密码的可能范围

2.输入验证

为了防止外界输入带有危险操作或者对系统关键区域产生危害,通常会对输入数据进行验证,输入验证是一个无害处理模块

3.输入转义

比如防注入的转义,字符串经过转义后就不会携带可能产生威胁的代码

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021-2024 Kery
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信