常见漏洞缓解措施

Last update:2 months ago

Windows

DEP(数据执行保护)

Data Execution Prevention

CFG(控制流保护)

每次间接调用前都对函数指针进行检查,在函数指针被修改到非法地址时终止程序。

SEHOP、SafeSEH

SEHOP会检测SEH单链表的末尾是不是指向一个固定的SEH Handler。 SafeSEH会检测当前使用的 SEH Handler是否指向当前模块的一个有效地址。

Heap Randomization (LFH随机化堆分配地址)

Linux

NX ( DEP in Windows)

NX通过现代操作系统的内存保护单元(Memory ProtectUint, MPU)机制对程序内存按页的粒度进行权限设置,其基本规则为可写与可执行权限互斥。

GCC默认开启,关闭在编译时加入-z execstack

Stack Canary

GCC默认开启,关闭在编译是加入-fno-stack-protector

ASLR(Address Space Layout Randomization)

ASLR(Address space layout randomization,地址空间布局随机化)通过随机放置数据区域的地址空间来防止攻击者跳转到内存的特定位置。

在Linux系统中ASLR被分为0,1,2三个等级,可以通过 sudo bash -c "echo 2 > /proc/sys/kernel/randomize_va_space"设置。

0)没有随机化。即关闭ASLR。

1)保留的随机化。共享库、栈、mmap()分配的内存空间以及VDSO将被随机化。

2)完全的随机化。在1的基础上,通过 brk()分配的内存空间也将被随机化。

PIE

与ASLR相似,PIE保护的目的是让可执行程序ELF的地址进行随机化加载。

Full Relro

RELRO(RELocation Read-Only,只读重定位)让加载器将重定位表中加载时解析的符号标记为只读,这减少了GOT覆写攻击的面积。

RELRO可以分为Partial RELRO(部分RELRO)和 Full RELRO (完整RELRO)。开启Partial RELRO的话GOT表是可写的;开启 FULL RELRO 的话GOT表是只读的。

Full RELRO 保护与Linux下的Lazy Binding机制有关。其主要作用是禁止.GOT .PLT表和其他一些相关内存的读写。

SMAP/SMEP

SMAP(Supervisor Mode Access Prevention,管理模式访问保护)和SMEP(Supervisor Mode Execution Prevention,管理模式执行保护)的作用分别是禁止内核访问用户空间的数据和禁止内核执行用户空间的代码。arm里面叫 PXN(Privilege Execute Never) 和PAN(Privileged Access Never)。