OpenHamony_0x01

为大创做点准备

关于软件漏洞分析应用

JAVA 学习为重中之重..

Soot 静态分析

FlowDroid 污点分析

参考文献
移动应用安全常用组件
Soot
软件漏洞分析

2.1 数据流分析

使用 Soot 进行程序静态分析, 参考https://fynch3r.github.io/soot%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86/

2.2 污点分析

使用 FlowDroid 进行

2.2.1 污点分析是什么

污点 是在代码中直接引入 不受信任的数据源 或者 敏感数据 等数据源
这些污点存在于代码中会导致存在 数据完整性 或者 数据保密性 受到威胁

污点分析是跟踪分析污点信息再程序中流动的技术
漏洞分析中, 使用污点分析技术将所感兴趣的数据 ( 通常来自程序的外部输入 ) 标记为污点数据, 然后通过相关信息流动从而得知它们是否影响某些关键程序操作, 进而挖掘程序漏洞
即 将程序是否存在某种漏洞的问题 转化为 “污点信息是否会被 Sink 点上的操作所使用” 的问题

污点分析就是分析程序中由污点源点 引入的数据是否能够不经清理 (校验等) 处理, 而直接传播到污点汇聚点 (如果可以就说明产生了隐私数据泄露或危险数据操作等问题)

2.2.2 污点分析包含

2.2.2.1 source

污染源点
代表直接引入不受信任的数据源或敏感数据等

表示接收到系统外部不可信数据有: 文件、环境变量、网络数据包、命令行参数、用户空间到内核空间内存等
在程序中大致可以分为 3 类:

  1. 入参污点 [函数调用前 传入的参数本身是不可信数据]
  2. 出参污点 [函数调用后使用的 参数是不可信的]
  3. 返回值污点 [函数被调用后的 返回值是不可行的]

2.2.2.2 Transitive

传播
主要表示污点传入之后,在内部可以进行污点传染

函数参数传递、变量赋值、拷贝、计算

2.2.2.3 Sink

程序点
代表直接产生安全敏感操作 或者泄露隐私数据到外界

命令执行、SQL 操作、拷贝长度、循环条件、数组索引等

2.2.2.4 Sanitizer

代表通过移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。

  • 对于有符号变量,需要进行上下边界的检查;
  • 对于无符号变量,需要进行上边界的检查,才能认为做了有效校验。
  • 对于字符串变量,需要特定函数进行清污,才认为数据可信
1
2
3
4
5
6
7
8
9
10
11
scanf("%d", &x);
// Source 点,输入数据被标记为污点信息,并且认为变量 x 是污染的

y = x + k;
// 如果二元操作的操作数是污染的,那么操作结果也是污染的,所以变量 y 也是污染的

x = 0;
// 如果一个被污染的变量被赋值为一个常数,那么认为它是未污染的,所以 x 转变成未污染的

while (i < y)
// Sink 点,如果规定循环的次数不能受程序输入的影响,那么需要检查 y 是否被污染

2.2.3 污点分析过程

2.2.3.1 识别 污点源 汇聚点

根据不同语言系统差异 大致有以下标记方法

  • 使用启发式的策略进行标记,例如把来自程序外部输入的数据统称为“污点”数据,保守地认为这些数据有可能包含恶意的攻击数据;
  • 工具会根据具体应用程序调用的 API 或者重要的数据类型,手工标记源和汇聚点;
  • 工具使用统计或机器学习技术自动地识别和标记污点源及汇聚点。

2.2.3.2 污点传播分析

按照分析过程中关注的程序依赖关系的不同, 可以将污点传播分析分为显式流分析和隐式流分析

1. 显示流分析

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

1
2
3
scanf("%d", &x);

int y = x;
2. 隐式流分析

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

1
2
3
4
5
scanf("%d", &x);

if(x!=0){
int y = 1;
}

2.2.3.3 漏洞检测处理

无害处理模块是指污点数据经过该模块的处理后,数据本身不再携带敏感信息或者针对该数据的操作不会再对系统产生危害

1. 加密处理 (无害处理)模块
  • 一方面由于库函数中使用了大量的加密算法,导致攻击者很难有效地计算出密码的可能范围;
  • 另一方面是加密后的数据不再具有威胁性,继续传播污点标记没有意义.
2. 输入验证(input validation)模块

为了防止代码注入漏洞,PHP 提供的 htmlentities 函数可以将特殊含义的 HTML 字符串转化成 HTML 实体(例如,将’<’转化成’<’)
.输入字符串经过上述转化后不会再携带可能产生危害的代码,可以安全地 发送给用户使用.

2.2.4 静态污点分析

2.2.4.1 基于 数据流

  1. 记录污点信息 (常用布尔型变量表示是否被污染)
  2. 程序语句的分析 (赋值 条件 调用等)
  3. 代码遍历

2.2.4.2 基于 依赖关系

污点数据相关的程序漏洞是主要关注对象,如 SQL 注入漏洞、命令注入漏洞和跨站脚本漏洞等

2.2.5 动态污点分析

动态污点分析是在程序运行的基础上,对数据流或控制流进行监控,从而实现对数据在内存中的显式传播、数据误用等进行跟踪和检测。动态污点分析与静态污点分析的唯一区别在于静态污点分析技术在检测时并不真正运行程序,而是通过模拟程序的执行过程来传播污点标记,而动态污点分析技术需要运行程序,同时实时传播并检测污点标记。

2.2.5.1 污点数据标记

程序攻击面是程序接受输入数据的接口集,一般由程序入口点和外部函数调用组成。

在污点分析中,来自外部的输入数据会被标记为污点数据。根据输入数据来源的不同,可分为三类:网络输入、文件输入和输入设备输入
这些数据可能以内存临时数据的形式存储,也可能以文件的形式存储。当程序需要使用这些数据时,一般通过函数或系统调用来进行数据访问和处理,因此只需要对这些关键函数进行监控,即可得到程序读取或输出了什么污点信息。另外对于网络输入,也需要对网络操作函数进行监控
识别出污点数据后,需要对污点进行标记。
污点生命周期是指在该生命周期的时间范围内,污点被定义为有效。
污点生命周期开始于污点创建时刻,生成污点标记,结束于污点删除时刻,清除污点标记。

2.2.5.2 污点动态跟踪

当污点数据从一个位置传递到另一个位置时,则认为产生了污点传播

规则

指令类型 传播规则 举例说明
拷贝或移动指令 T(a)<-T(b) mov a, b
算数运算指令 T(a)<-T(b) add a, b
堆栈操作指令 T(esp)<-T(a) push a
拷贝或移动类函数调用指令 T(dst)<-T(src) call memcpy
清零指令 T(a)<-false xor a, a

注:T(x) 的取值分为 true 和 false 两种,取值为 true 时表示 x 为污点,否则 x 不是污点。

对于污点信息流,通过污点跟踪和函数监控,已经能够进行污点信息流流动方向的分析。但由于缺少对象级的信息,仅靠指令级的信息流动并不能完全给出要分析的软件的确切行为。
因此,需要在函数监控的基础上进行视图重建,如获取文件对象和套接字对象的详细信息,以方便进一步的分析工作。

根据漏洞分析的实际需求,污点分析应包括两方面的信息:

  • 污点的传播关系,对于任一污点能够获知其传播情况。
  • 对污点数据进行处理的所有指令信息,包括指令地址、操作码、操作数以及在污点处理过程中这些指令执行的先后顺序等。

污点动态跟踪的实现通常使用:

  • 影子内存:真实内存中污点数据的镜像,用于存放程序执行的当前时刻所有的有效污点。
  • 污点传播树:用于表示污点的传播关系。
  • 污点处理指令链:用于按时间顺序存储与污点数据处理相关的所有指令。

当遇到会引起污点传播的指令时,首先对指令中的每个操作数都通过污点快速映射查找影子内存中是否存在与之对应的影子污点从而确定其是否为污点数据,然后根据污点传播规则得到该指令引起的污点传播结果,并将传播产生的新污点添加到影子内存和污点传播树中,同时将失效污点对应的影子污点删除。
同时由于一条指令是否涉及污点数据的处理,需要在污点分析过程中动态确定,因此需要在污点处理指令链中记录污点数据的指令信息。

2.2.5.3 污点误用检查

污点敏感点,即 Sink 点,是污点数据有可能被误用的指令或系统调用点,主要分为:

  • 跳转地址:检查污点数据是否用于跳转对象,如返回地址、函数指针、函数指针偏移等。具体操作是在每个跳转类指令(如 call、ret、jmp 等)执行前进行监控分析,保证跳转对象不是污点数据所在的内存地址。
  • 格式化字符串:检查污点数据是否用作 printf 系列函数的格式化字符串参数。
  • 系统调用参数:检查特殊系统调用的特殊参数是否为污点数据。
  • 标志位:跟踪标志位是否被感染,及被感染的标志位是否用于改变程序控制流。
  • 地址:检查数据移动类指令的地址是否被感染。

在进行污点误用检查时,通常需要根据一些漏洞模式来进行检查
首先需要明确常见漏洞在二进制代码上的表现形式,然后将其提炼成漏洞模式,以更有效地指导自动化的安全分析。