【软件分析】【污点分析】认识污点分析技术

举报
huahua.Dr 发表于 2022/09/25 15:43:01 2022/09/25
【摘要】 一、污点是什么污点就是在代码中直接引入不受信任的数据源或者敏感数据等数据源二、为什么要污点分析因为这些污点会带来一些列安全边界问题,这些污点流入到代码中会直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性)等严峻安全问题,因此,为了增强产品安全性,抵御黑客攻击,并且在交付外部市场符合内外部各种安全认证和安全检查,需要进行污点分析,将污点分析放到静态分析工具中,进行污...

一、污点是什么

污点就是在代码中直接引入不受信任的数据源或者敏感数据等数据源

二、为什么要污点分析

因为这些污点会带来一些列安全边界问题,这些污点流入到代码中会直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性)等严峻安全问题,因此,为了增强产品安全性,抵御黑客攻击,并且在交付外部市场符合内外部各种安全认证和安全检查,需要进行污点分析,将污点分析放到静态分析工具中,进行污点拦截,提升安全问题。

三、污点分析技术原理及介绍

污点分析概念

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

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

污点分析包含〈sources, Transitive,sinks, sanitizers)

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

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

  • 入参污点:程序中函数调用之前传入的参数本身就是不可信数据,属于污点。
  • 出参污点:程序中函数调用之后使用的参数也是不可信的
  • 返回值污点:程序中函数被调用之后的返回值也是不可行的

Transitive:主要表示污点传入之后,在内部可以进行污点传染,常见的有:函数参数传递、变量赋值、拷贝、计算等

sink即污点汇聚点(或爆发点), 代表直接产生安全敏感操作 (比如 违反数据完整性) 或者泄露隐私数据到外界 (比如 违反数据保密性);常见的操作有:命令执行、SQL操作、拷贝长度、循环条件、数组索引等

sanitizer即清理处理,代表通过移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。常见操作:

  • 对于有符号变量,需要进行上下边界的检查;
  • 对于无符号变量,需要进行上边界的检查,才能认为做了有效校验。
  • 对于字符串变量,需要特定函数进行清污,才认为数据可信

 

使用污点分析检测程序漏洞的工作原理如下图所示:

四、如何进行污点分析

分析出具有污点高风险的模块,对高风险模块进行污点分析定制,准确梳理并标识“入参污点”、“出参污点”、“返回值污点”、“污点传递”接口。工具会对外部数据进行跟踪测试,观察代码对外部数据的处理是否存在风险。

污点分析的处理过程可以分成3个阶段:

1)识别污点源和汇聚点(根据所分析的系统的不同使用定制的识别策略)

识别污点源和污点汇聚点是污点分析的前提.目前,在不同的应用程序中识别污点源和汇聚点的方法各不相同.缺乏通用方法的原因一方面来自系统模型、编程语言之间的差异.另一方面,污点分析关注的安全漏洞类型不同,也会导致对污点源和污点汇聚点的收集。

方法可以大致分成3类:

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

2)污点传播分析:利用特定的规则跟踪分析污点信息在程序中的传播过程

污点传播分析就是分析污点标记数据在程序中的传播途径.按照分析过程中关注的程序依赖关系的不同, 可以将污点传播分析分为显式流分析和隐式流分析.

显示流分析

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

以下面为例:

1)变量 a 和 b 被预定义的污点源函数 source 标记为污点源.

2假设 a 和 b 被赋予的污点标记分别为taint_a 和 taint_b.

3由于第 5 行的变量 x 直接数据依赖于变量 a,第 6 行的变量 y 直接数据依赖于变量 b,显式流分析会分别将污点标记 taint_a 和 taint_b 传播给第 5 行的变量 x 和第 6 行的变量 y.

4又由于 x 和 y 分别可以到达第 7 行和第 8 行的污点汇聚点(用预定义的污点汇聚点函数 sink 标识),存在信息泄漏的问题.

隐式流分析

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

以下面为例:

1)变量 X 是被污点标记的字符串类型变量,

2由第 4 行的循环条件控制的外层循环顺序地取出 X 中的每一个字符,转化成整型后赋给变量 x,

3再由第 7 行的循环条件控制的内层循环以累加的方式将 x 的值赋给 y,

4最后由外层循环将 y 逐一传给 Y.

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

6)变量 Y 和变量 X 之间并没有直接或间接的数据依赖关系(显式流关系),但 X 上的污点标记可以经过控制依赖隐式地传播到 Y.

3)漏洞检测、无害处理。

污点数据在传播的过程中可能会经过无害处理模块,无害处理模块是指污点数据经过该模块的处理后,数据本身不再携带敏感信息或者针对该数据的操作不会再对系统产生危害.换言之,带污点标记的数据在经过无害处理模块后,污点标记可以被移除.正确地使用无害处理可以降低系统中污点标记的数量,提高污点分析的效率,并且避免由于污点扩散导致的分析结果不精确的问题.

1)为了防止敏感数据被泄露(保护保密性),通常会对敏感数据进行加密处理,此时,加密库函数应该被识别成无害处理模块.

  • 一方面由于库函数中使用了大量的加密算法,导致攻击者很难有效地计算出密码的可能范围;
  • 另一方面是加密后的数据不再具有威胁性,继续传播污点标记没有意义.

2)为了防止外界数据因为携带危险操作而对系统关键区域产生危害(保护完整性),通常会对输入的数据进行验证.此时,输入验证(input validation)模块应当被识别成无害处理模块.

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。