软件安全分析与应用:软件漏洞挖掘与分析
软件安全分析与应用第9章软件漏洞挖掘与分析读书笔记。
- 软件漏洞挖掘与分析
- 基础知识
- 典型漏洞类型
- 溢出(堆、栈、整数)
- 重用(use after free)
- web漏洞(sql、xss)
- 漏洞利用
- 漏洞防护
- 软件漏洞机理分析
- 脆弱点分析
- 路径分析
- 内存分布分析
- 分析实例
- 软件漏洞利用
- 攻击链构造
- 攻击路径出发
- 保护机制绕过
基础
利用漏洞可以进行:
- 执行代码
- 信息窃取
- 权限提升
- 拒绝服务
- 认证绕过
典型漏洞类型
- 栈溢出
- 堆溢出
- 重用(use after free)
- 整数溢出
- 其他(sql、xss)
漏洞利用技术
内存喷射技术的代表技术是堆喷射技术(heap spray),主要用于攻击IE、Firefox浏览器等常用软件。传统堆喷射技术的关键在于,在内存中申请大量的具有固定大小的对象,在其中填入相同内容,每一个对象中间都含有若干NOP指令序列和攻击代码,这样使得进程的地址空间被大量的注入代码所占据。在程序的控制流被劫持时,大量的包含攻击代码的碎片能够提高EIP转移达到目标的概率,碎片中的NOP指令形成指令缓冲区,使得EIP转移目标仅需要在一定的误差范围内,即可引发攻击代码的执行。
- NOP:空指令
- EIP:寄存器,存储cpu要读取的地址
ROP(Return-Oriented Programming),是指攻击者从已有的库或者可执行文件中提取指令片段,构建攻击代码。
基于内存地址信息泄漏构造利用,由于DEP和ASLR的同时使用,使得攻击者即使能够找到ROP代码片段,也很难在内存中关联起来。对此有两种方法解决:
- 寻找未随机化的模块
- 针对全部模块都被随机化的情况,利用程序在运行时泄漏的信息来构造 ROP
漏洞防护
针对软件漏洞的形成机理和利用方法,研究人员也提出了与之对应的防护方法,主要包括针对栈溢出的 Stack Cookie,针对堆溢出的 SAFE 堆释放操作,针对控制流劫持攻击的数据区执行保护(Data Execution Protection, DEP)和地址随机化(Address Space Layout Randomization, ASLR)等机制。
Stack Cookie在堆栈中保存一个cookie值,如果堆栈溢出该数据被覆盖则停止执行。
DEP面对的主要目标是缓冲区溢出,缓冲区溢出攻击需要在数据段写可执行的攻击代码,然后劫持控制流转移到攻击代码。具体实现方法是将数据段代码标记为不可执行代码。
ASLR也是针对缓冲区溢出的保护措施,通过堆、栈、动态库等布局的随机化,增加攻击者的攻击难度。主要对以下4类地址进行随机化:
- 堆地址
- 栈基址
- PE文件映像基址
- 进程环境块
机理分析
路径分析
- 基于污点传播的路径指令序列提取
- 基于符号执行的路径条件提取
内存布局分析
- 输入数据直接映射
- 输入数据可逆计算后映射
使用经过修改的污点传播算法可以进行数据映射的分析.
漏洞利用
漏洞利用有:
- 攻击链构建
- 攻击路径触发
- 保护机制绕过
攻击链构建
攻击链构建的目标是在内存中找到能够放置控制流转移代码的空间,在放入控制流代码转移后,使得被劫持的控制流能够顺利转移到 ShellCode.
常见的跳板指令有:
- call/jmp register
- calljmp [register+offset]
- 连续指令序列
攻击路径触发
攻击路径触发是漏洞利用中较为重要的一环,最终利用的生成是通过重构输入的方式实现的,其目标是通过构造输入数据,使程序能够执行到控制流劫持点。
保护机制绕过
操作系统使用了数据执行保护、堆栈 cookie、ASLR 等技术对可能发生的漏洞攻击进行保护。所以攻击者需要对此类保护机制进行绕过,常用的方法有:
- pop+jmp 间接控制 EIP
- 调用 API 关闭 DEP
- JIT Spraying