Windows 内存漏洞缓解措施

Shellcode 利用缓解

GS

  • GS 又称栈 COOKIE,主要是为了防御栈溢出,而且非常有效
  • 绕过
1)使用栈中的数据结构进行绕过,典型的虚函数(对象)、数组、指针结构,COOKIE 只对有字符缓冲区局部变量的函数进行防御
2)覆盖 SEH 结构并且在函数末尾验证 COOKIE 值之前触发异常,这样就可以绕过 COOKIE 验证
3)如果漏洞包含任意地址读写,可以替换全局变量区的 COOKIE 静态值来绕过 COOKIE

DEP

  • 数据执行保护(DEP)是防止从不应该的位置启动可执行代码
  • 绕过
1)通过 VirtualProtect 函数来关闭 DEP,如果遇到开启 ASLR 的情况还可以使用具有 VirtualProtect 函数偏移且没有开启 ASLR 的模块构造 ROP 链来绕过 DEP + ASLR

CFG

  • CFG 又称程序的控制流保护,针对程序中的间接调用进行保护
  • 绕过
1)使用不带 CFG 保护的模块
2)使用 CFG 保护不到的间接调用

ASLR

  • 通过加载程序的时候不再使用固定的基址加载,从而干扰 shellcode 定位
  • 绕过
1)可以通过使用没有开启 ASLR 的模块来绕过 ASLR
2)覆盖部分地址做到有限的 EIP 控制
3)通过地址泄露漏洞泄露模块基地址
4)暴力破解高字节地址从而获取指定地址,这通常需要重复执行多次利用,可能会导致程序崩溃

SEH 利用缓解

SafeSEH

  • 是一种针对 32 位可执行文件的 Windows 二进制保护机制,启用该选项后,链接器会在构建二进制文件时在 SEHandlerTable 中创建有效的异常处理程序地址列表,防止执行其它地址代码

SEHOP

  • SEHOP 会对 SEH 异常处理程序的句柄进行判断,包括异常句柄不能指向堆栈

ROP 缓解

内存保护检查

  • 保护关键 Windows API 如 VirtualProtect
  • 绕过
1)可以通过覆盖 ROP 保护开关(全局变量)的方式来终止 EMET 对于 ROP 链的阻止

调用者检查

  • 防止使用跳转或返回指令调用关键 Windows API

堆栈翻转

  • 检测堆栈是否已被翻转
  • 绕过
- 可以通过覆盖 ROP 保护开关(全局变量)的方式来终止 EMET 对于 ROP 链的阻止

模拟执行流程

  • 通过操纵和跟踪堆栈寄存器,在调用关键 Windows API 后检测 ROP Gadgets

ROPGuard

  • 原理是定义一组检查,这些检查在调用某些操作系统函数时执行,以确定这些函数是从 ROP 代码调用还是作为正常程序执行的结果调用

堆喷射缓解

页分配顺序随机化

  • 主要针对堆喷射

堆喷射保护

  • 将常用的堆喷射内存区域预先分配

空页面保护

  • 预分配空页面,防止攻击者对空页面进行利用

浏览器保护

MemGC

  • MemGC 的目的是通过防止释放内存块(如果发现对内存块的引用)来减少对 UAF 漏洞的利用。与仅检查寄存器和堆栈中块引用的内存保护器不同,MemGC 还会扫描 MemGC 管理的块的内容以获取引用。这项额外的检查意味着 MemGC 进一步减少了攻击者可以利用的可用 UAF 错误的数量

EPM

  • 增强保护模式 (EPM) 是 Windows 8 中引入的 Internet Explorer 功能,默认情况下此功能已关闭。出于安全目的,EPM 将尝试在“AppContainer”中运行 Internet Explorer 渲染器进程

堆隔离

  • 隔离堆功能是在 2014 年 6 月的 IE 更新中引入的,它旨在限制攻击者在释放某些类型的 IE 对象后重新分配和控制其块内容的选项,这是通过和分配其他类型对象的堆区分开的“隔离堆”中分配关键对象来完成的

内存保护

  • 2014 年 7 月 IE 更新中引入的内存保护器功能包括受保护的释放(也称为延迟释放)机制,该机制使得在某些情况下难以执行“释放操作”,具体来说,如果在堆栈中发现指向该块的悬空指针,它会尝试阻止释放该块。为了跟踪要释放的块并存储在决定何时执行实际释放块时使用的其他信息,IE 使用 CMemoryProtector 对象

代码完整性

代码完整性保护(CIG)

  • 编码为支持 CIG 的应用程序将仅加载使用 Microsoft 或 Windows Store 证书签名的代码(DLL、二进制文件)

任意代码防护(ACG)

  • 启用 ACG 后:(1) 代码也是不可变的,现有代码也无法写入,因此始终具有其预期内容 (2) 无法创建新的、未签名的代码页,例如无法使用 VitualAlloc 创建新的 RWX 代码页

增强防御

攻击面减少(ASR)

  • 允许配置在某些应用程序中阻止加载模块的列表

加载库检查

  • 阻止通过通用命名约定(UNC)路径加载 DLL 文件

禁止重要函数调用

  • 默认情况下它不允许调用 ntdll!LdrHotpatchRoutine 以防止 DEP/ASLR 被绕过,还可以配置其他功能

深度 Hook

  • 启用此功能后,EMET 不再只是挂钩上层的 API 函数,而是会一并挂钩那些上层 API 调用的底层函数

反绕道

  • 由于 EMET 在跳转(挂钩)Windows API 函数的前言中放置跳转指令,所以攻击者可以制作一个返回到绕行跳转指令之后的指令的 ROP,此保护尝试停止这些旁路

EAF

  • 有的 shellcode 会遍历模块的导出函数,以解析如 kernel32.dll、ntdll.dll 和 kernelbase.dll 等模块导出的重要函数,EMET 使用硬件断点来阻止访问这些模块导出表的任何线程
  • 绕过
1)利用 Windows 系统调用 NtSetContextThread 来清除 EMET 在 kernel32.dll 和 ntdll.dll 的导出地址表上设置的硬件断点

EAF+

  • 提供了额外的功能来保护 kernel32.dll、ntdll.dll 和 kernelbase.dll 的导出表,提供了将特定模块列入黑名单,这些模块永远不允许读取受保护的位置(mshtml.dll、Adobe Flash flash*.ocx、jscript.dll、vbscript.dll、vgx.dll)
  • 绕过
1)直接调用 GetProcAddress 来解析 NtSetContextThread 来进行隐式调用

你可能感兴趣的:(Windows,漏洞分析,防御性安全,Windows,利用缓解,内存漏洞,ASLR,DEP)