漏洞利用缓解措施

Posted by Rohex on 2020-01-03
Words 749 and Reading Time 2 Minutes
Viewed Times

操作系统安全防护

  1. ASLR
    ASLR(Address space layout randomization,地址空间布局随机化)通过随机放置数据区域的地址空间来防止攻击者跳转到内存的特定位置。在windows上ASLR主要包括堆栈随机化、PEB与TEB随机化、映像随机化,windows系统上虽然xp时代就提出来了,但是从vista开始ASLR才真正发挥作用。在linux上ASLR主要包括栈地址随机化、LIBS/MMAP随机化、EXEC随机化、BRK随机化、VDSO随机化。在没有ASLR的情况下让程序跳转到一个已经存在的系统函数的漏洞利用方式被称为ret2libc。

    • 栈地址随机化:2.6.15内核开始支持。
    • 2LIBS/MMAP随机化:程序每次执行动态库都被加载到不同的内存位置。2.6.15内核开始支持。
    • EXEC随机化:程序每次执行都将加载到不同的内存位置。可以这么理解,LIBS/MMAP随机化相当于windows中dll的随机化,而EXEC随机化相当于windows中exe的随机化。
    • BRK随机化:linux系统中brk和mmap这两个系统调用用来分配内存。当brk ASLR关闭的时候,start_brk和brk都是指向bss段的尾部的;当brk ASLR开启的时候,start_brk和brk初始位置是bss段的尾部加一个随机的偏移。2.6.26内核开始支持。
  2. DEP 堆栈不可执行

编译器安全防护

  1. Built as PIE
    前面说了EXEC的随机化,实际上更准确的说法是PIE(Position Independent Executables,位置无关可执行文件)。PIE只有在系统开启ASLR和编译时开启-fpie -pie选项这两个条件同时满足时才会生效。最初因为在像x86这样通用寄存器较少的架构上PIE的性能损失比较明显,所以并不是所有的程序都启用了PIE。从Ubuntu 17.10和Fedora 23开始为所有的架构都启用了PIE。

  2. Built with RELRO
    RELRO(RELocation Read-Only,只读重定位)让加载器将重定位表中加载时解析的符号标记为只读,这减少了GOT覆写攻击的面积。RELRO可以分为Partial RELRO(部分RELRO)和Full RELRO(完整RELRO)。开启Partial RELRO的话GOT表是可写的;开启FULL RELRO的话GOT表是只读的。从Fedora 23开始所有软件包都已启用了Full RELRO。开启-Wl,-z,relro选项即可开启Partial RELRO;开启-Wl,-z,relro,-z,now选项即可开启Full RELRO。

  3. Stack Protector
    Stack Protector又名canary,stack cookie……等等,类似于VS编译器中的GS。gcc4.2中添加了-fstack-protector和-fstack-protector-all编译参数以支持该功能,gcc4.9中添加了-fstack-protector-strong编译参数让保护的范围更广。

新型防护技术

PAC

PXN

CET

CFI

SMEP

SMAP

MTE

作者声明

本文版权归作者(rohex)所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。

This is copyright.