软件分析:污点分析

0 阅读5分钟

一、污点分析基本原理

污点分析,是信息分析的一种实践技术:如果系统满足了用户定制的信息流策略,那么系统是信息流安全的。
污点分析,标记程序中的数据(外部输入数据或者内部数据)为污点,通过对带污点标记的数据的传播实施分析来达到保护数据完整性和保密性俄目的。
如果信息从被标记的污点数据传播给未标记的数据,那么需要将未标记的标记为污点数据;如果被标记的污点数据传递到重要数据区域或者信息泄露点,那就意味着信息流策略被违反。
污点分析,被广泛地应用在隐私数据泄露检测、漏洞挖掘等实际领域。

三元组

污点分析可以抽象成一个三元组<sources,sinks,sanitizeres>的形式:

  • source:污点源,代表直接引入不受信任的数据或者机密数据到系统中
  • sink:污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性)
  • sanitizer,无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害

工作流程

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

三个阶段

污点分析可以分成3个阶段:识别污点源和汇聚点、污点传播分析、无害处理。

识别污点源和汇聚点

识别污点源和污点汇聚点,是污点分析的前提。目前,在不同的应用程序中,识别污点源和汇聚点的方法各不相同,缺乏通用方法。现有的识别污点源和汇聚点的方法可以大致分成3类:

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

污点传播分析

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

显示流分析

9.png

隐式流分析

12.png

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

  • 欠污染:由于对隐式流污点传播处理不当导致,本应被标记的变量没有被标记的问题,称为“欠污染问题”(under-taint)。
  • 过污染:由于污点标记的数量过多而导致污点变量大量扩散的问题,称为“过污染问题”(over-taint)。
  • 目前,针对隐式流问题的研究,重点是尽量减少欠污染和过污染的情况。

无害处理

污点数据,在传播的过程中,可能会经过无害处理模块,无害处理模块是指污点数据经过该模块的处理后,数据本身不再携带敏感信息或者针对该数据的操作不会再对系统产生危害。换言之,带污点标记的数据在经过无害处理模块后,污点标记可以被移除。
常数赋值是最直观的无害处理的方式,加密处理、程序验证等在一定程度上,可以认为是无害处理。

二、污点分析方法

显示流分析(基于数据依赖分析)

静态污点传播分析:简称静态污点分析,是指在不运行且不修改代码的前提下,通过分析程序变量间的数据依赖关系来检测数据能否从污点源传播到污点汇聚点。
静态污点分析的对象,一般是程序的源码或中间表示,可以将对污点传播中显示流的静态分析问题转化为对程序中静态数据依赖的分析:首先,根据程序中的函数调用关系构建调用图(call graph,简称CG);然后,在函数内或者函数间根据不同的程序特性进行具体的数据流传播分析。

13.png

动态污点传播分析:简称动态污点分析,是指在程序运行过程中,通过实时监控程序的污点数据在系统程序中的传播来检测数据能否从污点源传播到污点汇聚点。
动态污点传播分析,首先需要为污点数据扩展一个污点标记(tainted tag)的标签并将其存储在存储单元(内存、寄存器、缓存等)中,然后根据指令类型和指令操作数设计相应的传播逻辑传播污点标记。

14.png

研究重点

动态污点传播分析的一个研究重点是,如何降低分析代价。基于硬件的分析技术需要定制硬件的支持,基于软件的技术由于程序插桩或代码重写会带来额外的性能开销。

15.png

隐式流分析(基于控制依赖分析)

污点传播分析中的隐式流分析,就是分析污点数据如何通过控制依赖,进行传播,如果忽略了对隐式流污点传播的分析,则会导致欠污染的情况;如果对隐式流分析不当,那么除了欠污染之外,还可能出现过污染的情况。

16.png

17.png

18.png

19.png

20.png

参考

南开大学刘哲理老师编写的《软件安全:漏洞利用及渗透测试》教材的配套教学视频