软件漏洞分析技术:漏洞分析基础
软件漏洞分析技术漏洞分析基础部分读书笔记。
软件漏洞
- 漏洞
- 漏洞概述
- 漏洞定义
- 漏洞特点
- 持久性与时效性
- 广泛性与具体性
- 可利用性与隐蔽性
- 漏洞分类与分级
- 漏洞分类
- 早期漏洞分类
- 多维度漏洞分类
- 综合性漏洞分类
- 漏洞库中的漏洞分类
- 漏洞分级
- CNNVD
- 微软
- US-CERT
- CVSS
- 漏洞的影响
漏洞分析发展历程
- 漏洞分析发展历程
- 软件漏洞分析
- 广义漏洞分析
- 漏洞挖掘
- 漏洞检测
- 漏洞应用
- 漏洞消除
- 漏洞管控
- 狭义漏洞分析
- 特指漏洞挖掘
- 架构安全分析
- 源代码漏洞分析
- 二进制漏洞分析
- 运行系统漏洞分析
- 原始萌芽阶段
- 通信安全
- 分析萌芽
- 信息加密
- 初步发展阶段
- 计算机安全
- 单一化漏洞挖掘
- 操作系统防护
- 高速发展阶段
- 互联网安全
- 多样化漏洞分析
- 信息系统防护
- 综合治理阶段
- 网际安全
- 系统化漏洞管控
- 防御体系建设
漏洞分析技术概述
- 漏洞分析技术概述
- 漏洞分析技术体系
- 软件架构安全分析
- 形式化架构分析技术
- 工程化架构分析技术
- 源代码漏洞分析
- 基于中间表示的分析技术
- 数据流分析
- 符号执行
- 污点分析
- 基于逻辑推理的分析技术
- 模型检测
- 定理证明
- 二进制漏洞分析
- 静态漏洞分析技术
- 动态漏洞分析技术
- 动静结合的漏洞分析技术
- 运行系统漏洞分析
- 信息收集
- 网络拓扑
- 操作系统
- 应用软件
- 公开资产
- 漏洞检测
- 配置管理检测
- MBSA
- Metasploit
- 通信协议验证
- Nessus
- Nmap
- 授权认证检测
- Nessus
- WebScarab
- 数据验证测试
- WVS
- AppScan
- 数据安全性验证
- Wireshark
- 漏洞确认
漏洞分析技术体系
软件架构安全分析
软件架构安全分析研究在软件设计构成中发现缺陷并且避免设计有缺陷的软件。
形式化架构分析技术
形式化分析技术主要使用形式化方法统一描述软件架构和安全需求,然后检测软件架构是否满足安全需求。形式化分析技术主要包括UMLsec建模描述分析法、软件架构模型法、离散时间马尔可夫转移链法和组件系统架构描述法。
工程化分析技术
工程化分析技术从攻击者的角度考虑软件面临的安全问题,实用性强,但是自动化程度较低。工程化分析技术包括场景分析法、错误用例分析法、威胁建模法。
源代码漏洞分析
源代码漏洞分析是针对高级语言编写的程序进行分析以发现漏洞的方法。
源代码漏洞分析通常使用静态分析方法。源代码分析在不运行软件的前提下进行分析,分析对象可以是源代码,也可以是其他形式的中间代码,例如 Java 程序的字节码。静态漏洞分析系统或者缺陷分析系统通常选择源代码作为分析对象,这是因为:
- 该类工具通常在程序开发阶段使用,源代码是可见的。
- 相比于编译后的中间代码,源代码有着更丰富的语义信息。
基于中间表示的分析技术
基于中间表示的分析技术以编译原理为主要基础技术,基本思想是先将源代码翻译为便于分析的中间表示,同时根据需要构建一些用于分析的数据结构,如控制流图、调用图等,然后根据一些预定义的分析规则对中间表示进行遍历,以判断分析规则所描述的漏洞是否存在。
基于中间表示的分析技术包括数据流分析、符号执行和污点传播等。
数据流分析
数据流分析是一种用来获取有关数据如何沿着程序执行路径流动的相关信息的分析技术,被广泛用于编译构成中的代码优化。
数据流分析一般从程序的一个控制流图开始,数据流分析主要有前向分析(forward analysis)、后向分析(backward analysis)两种。基于格(lattice)与不动点(fixpoint)理论的数据流分析是目前被广泛使用的技术。
符号执行
符号执行是使用符号值代替数字值执行程序的技术,在使用符号执行技术的分析过程中,分析系统将程序中变量的取值表示为符号和常量组成的计算表达式,将程序计算的输出表示为符号的函数。
污点分析
污点分析是一种跟踪并分析污点信息在程序中流动的技术,污点分析技术将所感兴趣的信息标记为污点信息(tainted information),通过跟踪污点信息的刘翔,检测这些信息是否会影响某些关键的操作。
基于逻辑推理的分析技术
此类方法以数学推理为基础,该方法将源代码进行形式化的描述,并在形式化描述的基础上,利用推理、证明等数学方法验证或者发现形式化描述的一些性质,以此推断程序是否存在某种类型的漏洞。
模型检测
为了提高分析的准确度,获取关于程序的更多性质,许多研究人员借用形式化方法来拓展基本分析技术,其中代表性的技术有模型检测(model checking)、定理证明等。模型检测使用状态歉意系统表示系统行为,用模态/时序逻辑公式描述系统的性质,通过系统性质是否符合预期来判断是否存在漏洞。
此类方法在检查硬件设计错误方面简单明了且自动化程度较高,但是应用在软件程序分析与验证时存在状态空间爆炸的问题。另外分析对象是形式化描述,如果形式化描述与程序不完全一致,可能导致检查结果无法反应程序中真实错误的情况。
定理证明
定理证明通过将验证问题转化为数学上的定理证明问题来判断待分析程序是否满足指定属性,是较为复杂但准确的方法。但是为了获取指定的属性以实现有效的证明,需要向程序源代码中添加特殊形式的注释,增加了程序员的工作量,无法广泛应用于大型程序中。
二进制漏洞分析
二进制漏洞分析技术是一种面向二进制可执行代码的软件安全性分析技术,通过对二进制可执行代码进行多层次(指令级、结构规划、形式化等)、多角度(外部接口测试、内部结构测试等)的分析,发现软件中的安全漏洞。分析主要涵盖的技术环节包括反汇编逆向分析、汇编代码结构化、中间表示、漏洞建模、动态数据流分析/污点分析、控制流分析/符号执行等。
静态分析
二进制漏洞静态分析是以人为定义的漏洞模型为指导,在二进制可执行程序中进行漏洞检测的一种方法,包括基于模式的漏洞分析和二进制代码对比。
基于模式的漏洞分析是一项较为简单、自动化程度较高且非常适用于安全漏洞检测的技术。
二进制代码对比通过将二进制文件进行不同层次的对比,从得到的差异之间发现安全漏洞。根据对比的深度不同,可以分为字符级别比较、指令级别比较和结构化比较。
动态分析
二进制漏洞动态分析是通过记录二进制程序的执行轨迹,并进一步分析程序在运行时的内存读写操作、函数调用关系、内存分配/释放等信息的一种漏洞检测方法,主要的技术为模糊测试。
动静结合的分析技术
动静结合的漏洞分析技术结合了动态漏洞分析技术的准确性和静态漏洞分析的路径完备性,代表性技术为动态污点分析和智能灰盒测试。
动态污点分析作为一种新兴的程序分析技术,已经在恶意软件分析、网络协议逆向、软件漏洞挖掘等领域得到应用。
智能灰盒测试是在传统模糊测试的基础上发展而来的一种在测试过程中引入目标系统的内在知识来辅助测试的漏洞分析技术,通过静态、动态等分析过程,获得一定程度的目标程序的结构、语义、控制流等辅助信息,然后有针对性地设计测试用例。灰盒测试一般使用符号执行和污点分析等技术,大大增加了代码的覆盖率,且有针对性地检测某些安全敏感点的行为也大大增加了漏洞发现的概率,提高了分析效率。
运行系统漏洞分析
运行系统是多种软件的有机整体,运行系统的漏洞分析相较于单个软件的漏洞分析有着其特殊性。具体体现在:
- 运行系统比单个软件更为复杂
- 黑盒(没有源代码和程序文档)
- 运行系统内部信息不公开,需要漏洞分析人员手动提取
目前,漏洞分析人员通过信息搜集、漏洞检测和漏洞确认三个步骤对运行系统进行漏洞分析。
信息收集
在此阶段,分析人员可以利用社会工程学、主机扫描技术、端口扫描技术等多项技术,通过人工或者一些自动化的工具手机有关运行系统架构、运行系统所部署机器的网络拓扑结构及其上面运行的操作系统类型版本、开启的端口及服务信息。
漏洞检测
配置管理测试是对系统配置进行检测,常用工具有:
- MBSA
- Metasploit
- 天珣安全配置审核系统
通信协议验证是对系统中的通信协议潜在的安全漏洞进行检测,有形式化方法和攻击验证方法两种,常用的工具有:
- Nessus
- Nmap
授权认证检测主要检测系统授权机制,主要工具有:
- Nessus
- WebScarab
数据验证测试主要发现外部数据可能产生的安全漏洞,主要工具有:
- Acunetix Web Vulnerability Scanner(WVS)
- AppScan
- 极光漏洞扫描工具
- 明鉴Web应用弱点扫描器
数据安全性验证主要检查系统内部数据自身安全,该类技术通常采用密码分析、在线密码破解、模拟物理入侵等方式来验证数据在系统上的安全性,主要工具是 Wireshark.
漏洞确认
在此阶段,分析人员对疑似漏洞列表中的漏洞进行逐一验证。