软件漏洞分析
软件漏洞分析的定义
- 广义漏洞分析:指的是围绕漏洞所进行的所有工作,包括:
- 漏洞挖掘:使用程序分析或软件测试技术发现软件中可能存在的未知的安全漏洞
- 漏洞检测:又称漏洞扫描,基于漏洞特征库,通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测,以发现可利用的已知漏洞
- 漏洞应用:借助漏洞堆软件或其依附的目标系统进行模拟攻击,并且对攻击代码进行生存性验证
- 漏洞消除:对漏洞进行修复,包括漏洞防御、补丁修复、安全加固等
- 漏洞管控:包括漏洞收集与发布、漏洞资源的积累与分析、漏洞的准则规范的制定等
- 狭义漏洞分析:特指漏洞挖掘,包括:
- 架构安全分析:在设计阶段进行软件架构分析,从更高、更抽象的层次保障软件安全性
- 源代码漏洞分析:通常使用静态分析方法,整个过程包括源代码模型构造、漏洞模式提取、基于软件模型和漏洞模式的模式匹配
- 二进制漏洞分析:包括静态分析和动态分析两种
- 运行系统漏洞分析:分析对象是已经实际部署的软件系统,通过信息收集、漏洞检测和漏洞确认三个基本步骤堆软件系统进行漏洞分析
软件分析技术概述
技术类别 | 基本原理 | 分析阶段 | 分析对象 | 分析结果 | 优点 | 缺点 |
---|---|---|---|---|---|---|
软件架构安全分析 | 通过对软件架构进行建模,并对软件的安全需求或安全机制进行描述,然后检查架构模型直至满足所有安全需求 | 软件设计 | 软件架构 | 设计错误 | 考虑软件整体安全性,在软件设计阶段进行 | 缺少实用且自动化程度高的技术 |
源代码漏洞分析 | 通过对程序代码的模型提取及程序检测规则的提取,利用静态的漏洞分析技术分析结果 | 软件开发 | 源代码 | 代码缺陷 | 代码覆盖率高,能够分析出隐藏较深的漏洞,漏报率较低 | 需要人工辅助,技术难度大,对先验知识(历史漏洞)依赖性较大,误报率较高 |
二进制漏洞分析 | 通过对二进制可执行代码进行多层次(指令级、结构化、形式化等)、多角度(外部接口测试、内部结构测试等)的分析,发现软件程序中的安全缺陷和安全漏洞 | 软件设计、测试及维护 | 二进制代码 | 程序漏洞 | 不需要源代码,漏洞分析准确度较高,实用性广泛 | 缺乏上层的结构信息和类型信息,分析难度大 |
运行系统漏洞分析 | 通过向运行系统输入特定构造的数据,然后对输出进行分析和验证的方式来检测运行系统的安全性 | 运行及维护 | 运行系统 | 配置缺陷 | 考虑由多种软件共同构成的运行系统的整体安全性,检测项全面,准确度高 | 对分析人员的经验依赖度较大 |
源代码漏洞分析
技术 | 基本原理 | 优点 | 缺点 | 典型工具 |
---|---|---|---|---|
数据流分析 | 数据流分析是一种用于收集计算机程序在不同点计算的值的信息的技术。进行数据流分析的最简单的一种形式就是对控制流图的某个节点建立数据流方程,然后通过迭代计算,反复求解,直到到达不动点 | 具有更强的分析能力,适合需要考虑控制流信息且变量属性之操作十分简单的静态分析问题 | 分析效率低,过程间分析和优化算法复杂,编程工作量大,容易出错且效率低 | Coverity, Prevent, Llocwork, Fortify, SCA, FindBugs, Checkmax |
符号执行 | 符号执行是指用符号值替代真实值,模拟程序的执行,从而得到程序的内部结构及其相关信息,从而产生有针对性的测试用例 | 生成的测试用例有针对性,测试覆盖率较高,可以检测到深层次的问题 | 在进行系统化的符号执行时,会产生路径爆炸或是求解困顿等问题 | EXE, KLEE, Clang, DART |
污点分析 | 该技术对输入的数据建立污点传播标签,之后静态地跟踪被标记数据的传播过程,检查是否有危险函数或是危险操作 | 该技术的优点在于可以通过对数据的传播快速地找到典型的与输入数据相关的漏洞 | 该技术有时会受到编译器优化的影响,同时需要构造污点传播树,这种树的构造比较复杂,有时需要人工介入 | Pixy, TAJ |
模型检测 | 该技术主要通过将程序转换为逻辑公式,然后使用公理和规则来证明程序是否是一个合法的定理。如果程序合法,那么被测程序便满足先前所要求的安全特性 | 对路径的分析敏感,对于路径、状态的结果具有很高的精确性;检验并发错误能力较好,验证过程完全自动化 | 由于穷举了所有可能状态,增加了额外的开销;数据密集度较大时,分析难度很大;对时序、路径等属性,在边界处的近似处理难度大 | SLAM, MOPS, Bandera |
定理证明 | 该方法主要是将原有程序验证中由研究人员手工完成的分析过程变为自动推导,其主要目的是证明程序计算中的特性 | 使用严格的推导证明控制检测的进行,误报率低 | 某些域上的公式推导缺乏适用性,对新漏洞扩展性不高 | ESC, Saturn |
二进制漏洞分析
技术 | 基本原理 | 应用范围 | 优点 | 缺点 | 典型工具 |
---|---|---|---|---|---|
模糊测试 | 向被测程序发送随机或预先给定的数据 | 以文件、网络数据或是本地输入以其他对外部输入数据依赖较大的软件 | 原理简单,执行所需计算量较少,相关工具较为成熟,可以很方便地应用于大型软件的测试中 | 测试用例针对性低,覆盖率较低,测试结果不确定性较大 | SPIKE, Peach, Sully, BeStorm, MU-4000 |
动态污点分析 | 对输入数据建立污染标签,在程序内部处理数据的同时加入污染标签的传播,通过分析标签的传播得出程序的内部结构 | 以文件、网络数据或是本地输入及其他对外部输入数据依赖较大的软件 | 可以获取程序内部的基本信息,易于发现与输入关联度较大的漏洞 | 需要动态插桩或是虚拟化等技术支持,实现较为复杂,并且污染传播算法对分析结果影响较大 | TaintCheck, Dyta, Argos, Temu |
基于模式的漏洞分析 | 利用中间表示语言或是其他工具将漏洞抽象为具有一定特殊性的模式,最终通过找到这种模式进而找到相关漏洞 | 需要对被分析漏洞表现形式有较深了解,并且需要对被分析软件进行一定转化 | 对漏洞表现形式抽象程度较高,随着建模准确度的提升,漏洞分析的准确度和速度都会有很大提升,代表着未来研究的方向 | 目前的漏洞建模较为简单,有时误报率较高 | BinNavi |
二进制代码比对 | 通过比对不同二进制文件,尤其是补丁文件与原文件之间的差异获取修改信息,从而定位并获取漏洞信息 | 需要有针对某一漏洞的补丁文件或是两个不同版本的同型软件 | 算法较为成熟,实现简单,有许多相关使用工具 | 由于需要补丁或新版软件的比对,所以该类技术仅能发现已被报告并修复的漏洞 | Bindiff, IDA Compare, eEye Binary Diffing Suite |
智能灰盒测试 | 利用动态符号执行等技术,针对被测软件生成有针对性的测试用例,从而提高测试用例的覆盖能力 | 以文件、网络数据或是本地输入及其他对外部输入数据依赖较大的软件 | 可以有效提升测试用例的覆盖率,从而提高发现漏洞的可能性 | 由于算法和计算量等问题,在使用时容易出现路径爆炸和求解困顿等问题,对大型软件的测试效果不是很理想 | SAGE, SmartFuzz |
运行系统漏洞分析
技术 | 基本原理 | 应用范围 | 优点 | 缺点 | 典型工具 |
---|---|---|---|---|---|
配置管理测试 | 配置管理测试是对运行系统配置进行安全性测试,检查系统各配置是否符合运行系统的安全需求和制定的安全策略 | 检查配置漏洞 | 可以全面地分析和检查运行系统的配置项 | 需要对运行系统的业务需求,业务类型和运行环境有充分的了解,需要更多的人工介入 | MBSA, Metasploit |
通信协议测试 | 通信协议验证是对运行系统通信协议中潜在的安全漏洞进行检测。攻击验证是常用的通信协议验证手段。它利用已知的攻击手段对运行系统进行模拟攻击以判断通信协议是否存在某种类型的安全漏洞 | 检测通信协议中潜在的漏洞 | 攻击验证的通信协议验证手段检测结果较为准确,能够用于大规模运行系统 | 攻击验证方法只适用于某些特定类型的通信协议安全漏洞检测 | Nessus, Nmap |
授权认证测试 | 认证测试通过了解运行系统的授权、认证工作流程来尝试规避运行系统的授权、认证机制 | 检测运行系统中授权、认证机制中潜在的漏洞 | 分析结果较为准确 | 该类技术需要深入了解运行系统的授权认证工作,需要较多的人工参与分析工作 | Nessus, WebScarab |
数据验证测试 | 数据验证测试目的在于发现由于运行系统没有正确验证来自客户端或外界的数据而产生的安全漏洞。该类技术主要通过构造特定的输入以检测是否可以触发运行系统的某些特定类型安全漏洞 | 检测运行系统中授权、认证机制中潜在的漏洞 | 技术比较成熟,可用工具较多,操作简单 | 分析结果误报率比较高 | MVS, AppScan |
数据安全性验证 | 数据安全性验证旨在发现威胁运行系统内部数据自身安全性的漏洞 | 检测运行系统中在存储和传输数据时潜在的漏洞 | 技术比较成熟,可用工具较多,操作简单 | 分析结果误报率比较高 | WireShark |
参考资料
- 《软件漏洞分析技术》