软件的漏洞是在软件整个生命周期中因安全设计缺陷、编码错误和运行故障等问题而触发的。软件漏洞的出现不仅会影响到软件的运营同时也缩短了软件的生命周期。
在软件开发过程中避免不了对开发的代码进行调试分析,同样软件开发完成到发布市场前也需要对软件进行安全性分析评估,软件的分析可以基于符号执行技术也可以基于污点分析技术。本文主要以污点分析技术进行展开。
污点分析技术,它是一种用于跟踪并分析软件污点信息在程序中流动的技术,它是分析代码漏洞,检测攻击方式的重要手段。
污点分析技术的主要思想:将用户输入的数据作为污点分析技术的污点源,在程序执行过程中追踪污点源的传播,所有直接或间接受污点源影响的变量都是被污染的变量,这些变量统称为污点数据。
污点分析技术进行分析软件漏洞的原理:任何用户可控的变量都是不安全的,都是一个攻击面,当一个被污染的变量被用来执行危险的操作时候就容易触发产生漏洞。因此污点分析的重点在于对用户可控变量的分析。
(图片来源网络)
污点分析技术主要通过反汇编方式基于二进制方式进行对程序的数据和逻辑控制进行分析的。
污点分析技术,它可以抽象成一个三元组<sources, sinks, sanitizers>的形式。
Sources表示污点源:代表直接引入不受信任的数据(文件、环境变量、网络数据包、命令行参数、用户空间到内核空间内存)或者机密数据到系统中。
污点源又可细分为:入参污点、出参污点、返回值污点。
入参污点 : 程序中函数调用之前传入的参数本身就是不可信数据,属于污点。
出参污点 : 程序中函数调用之后使用的参数也是不可信的,属于污点。
返回值污点 : 程序中函数被调用之后的返回值也是不可信的,属于污点。
Sink表示污点汇聚点:代表直接产生安全敏感操作(数据完整性)或者泄露隐私数据(数据保密性)到外界,它的位置判断主要来源敏感系统函数调用和程序跳转。
污点汇聚点中敏感操作包括:命令执行、SQL操作、拷贝长度、循环条件、数组索引等。
Sanitizer表示无害处理:代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。
无害处理:污点数据经过无害处理模块的处理后,数据本身不再携带敏感信息或者针对该数据的操作不会再对系统产生危害。正确地使用无害处理可以降低系统中污点标记的数量,提高污点分析的效率,并且避免由于污点扩散导致的分析结果不精确的问题。
无害处理过程中常见操作:
1、对于有符号变量,需要进行上下边界的检查;
2、对于无符号变量,需要进行上边界的检查,才能认为做了有效校验;
3、对于字符串变量,需要特定函数进行清污,才认为数据可信。
污点分析的处理过程可以分成 3 个阶段完成 :
1、 识别污点源和汇聚点;
2、污点传播分析;
3、无害处理。
识别污点源和汇聚点方法:
1、使用启发式的策略进行对数据源标记,例如把来自程序外部输入的数据统称为“污点”数据,保守地认为这些数据有可能包含恶意的攻击数据。
2、根据具体应用程序调用的 API 或重要的数据类型,手工标记污点源和汇聚点。
3、可以借助使用统计或机器学习技术自动地识别和标记污点源及汇聚点。
污点分析技术从是否需要运行程序的角度可以将污点分析分为两种类型:静态污点分析和动态污点分析。
静态污点分析:它主要在源代码级,通过分析程序源代码来推演污点的传播。
静态污点分析技术 : 它是在不修改和不运行程序代码的前提下,采用词法分析、数据流分析、控制流分析、模型检查、定理证明、符号执行、污点传播分析等技术手段对程序文件进行扫描从而生成程序的反汇编代码来掌握程序功能的一种方法。
静态污点分析步骤:
1、根据程序中的函数调用关系构建调用图CG(call graph);
2、在函数内部或者函数间根据不同的程序特性进行具体的数据流传播分析。常见的污点传播方式包括:直接赋值传播、通过函数调(过程)用传播以及通过别名(指针)传播。
动态污点分析:它是在程序实际运行过程中通过对数据流或控制流进行监控,从而实现对数据在内存中的污点数据传播、数据误用等进行跟踪和检测。
动态污点分析技术:动态污点分析技术主要是通过反汇编后二进制的数据调试分析过程,通过实时分析监控程序的污点数据再程序中的传播来检测数据能否从污点源传播到污点汇聚点。它主要侧重于检测程序在实际运行的过程中污点数据的传播情况。
动态污点分析技术(动态代码插桩、系统模拟、虚拟机监视器)的3步骤:
1、污点数据标记:程序攻击面是程序接受输入数据的接口集,一般由程序入口点和外部函数调用组成。在污点分析中,来自外部的输入数据会被标记为污点数据。根据输入数据来源的不同,可分为三类:网络输入、文件输入和输入设备输入。
2、污点数据动态跟踪:在污点数据标记的基础上,对进程进行指令粒度的动态跟踪分析,分析每一条指令的效果,直至覆盖整个程序的运行过程,跟踪数据流的传播。
3、污点数据误用检查:在正确标记污点数据并对污点数据的传播进行实时跟踪后,就需要对攻击做出正确的检测即检测污点数据是否有非法使用的情况。
污点分析技术中从污点传播上又可细分为:显示流分析、隐式流分析。
污点传播分析中:显式流分析就是分析污点标记如何随程序中变量之间的数据依赖关系传播。也就是所谓的数据流传播。
污点传播分析中:隐式流分析是分析污点标记如何随程序中变量之间的控制依赖关系传播,也就是分析污点标记如何从条件指令传播到其所控制的语句。也就是没有之间的数据流传递,但是会通过影响控制流而影响到数据。
在污点分析过程中主要能挖掘分析出的漏洞有:缓冲区溢出漏洞、整数溢出漏洞、除法中除0的漏洞、SQL注入漏洞、跨站脚本漏洞、命令注入漏洞等等。
(图片来源网络)
SQL注入漏洞
缓冲区溢出漏洞
污点分析(由于是window端的所有可以通过ollydbg工具进行动态分析)
污点分析作为信息流分析的一种实践技术,它不仅可以用于挖掘分析安全漏洞也可以用于分析隐私数据泄露的问题。但是在污点分析过程中存在不同语言的特性、系统框架的差异,因此在利用污点分析技术过程中也变得比较复杂,也就没办法做成通用性的污点分析,只能基于不同应用场景进行对污点分析技术进行特殊性定制。
基于污点分析技术小结,在程序中比较容易出现漏洞的根源点主要集中在运算指令中加减乘除等,操作赋值拷贝相关的函数等。由于污点分析技术需要结合程序的语言特性和二进制的汇编方式去分析,因此研究污点分析技术的门槛也相对比较高。
在污点分析过程中可以先从敏感危险函数入手(memcpy,strcpy,strcmp等等),接着分析函数的参数或者返回值,以此去定位程序中是否存在相关的溢出漏洞。
点赞、转发
【推荐阅读】