1.操作系统的软件堆栈、内存映射等区域配置,mmap、vdso页、共享库等,
实现方式:修改操作系统文件:/proc/sys/kernel/randomize_va_space,内容改为2。
原因:ASLR针对缓冲区溢出攻击,此处将堆栈、共享库映射等内存地址随机化,增加难度。
注意:randomize_va_space=1时表明栈、数据段、VDSO随机化,为2时表明堆栈、数据段、VDSO会随机化
作用范围:Linux下的软件(包括用户、系统服务进程)
2.软件堆栈保护
实现方式:编译时给gcc传参:-fstack-protector-all/-fstack-protector-strong,其中-fstack-protector-strong保护范围最广
原因:避免栈溢出被攻击,在缓冲区和控制信息间插入一个canary word,当缓冲区有溢出时,canary word会首先被覆盖,通过检测该字段实现防控 注意:windriver linux4.3 + MIPS环境不支持该操作
作用范围:用户编译的*.o;*.so;*.out(elf可执行文件)
3.软件链接库保护
实现方式:编译时给gcc传参:-Wl,-z,relro
原因:动态链接的ELF二进制程序使用称为全局偏移表(GOT)的查找表去动态解析位于共享库中的函数,增加此选项可以避免被攻击者查找到函数入口进而防止被篡改执行函数
注意:relro选项用于防护GOT表被修改 作用范围:用户编译的*.so;*.out(elf可执行文件)
4.软件链接库保护
实现方式:编译时给gcc传参:-Wl,-z,now
原因:开启立即绑定,即在3的基础上开启立即绑定GOT全部表项只读模式。较好防控缓冲区溢出攻击。
注意:该选项会导致软件启动性能下降, 但运行性能不受影响
作用范围:用户动态库
5.软件执行保护
实现方式:编译时给gcc传参:-Wl,-z,noexecstack
原因:缓冲区溢出的部分,锁定其数据段只读写,不可执行,即缓冲区溢出即时发生也不会执行恶意代码。
注意:windriver linux 4.3普通版本不支持该特性;windriver linux 6 + MIPS不支持该特性 作用范围:用户软件及动态库等
6.软件地址段保护
实现方式:编译时给gcc传参:-fPIC或-fpic
原因:编译代码时将用户软件编译成与地址无关的代码段,使得用户应用加载so之后,地址空间根据用户的应用走,而非so内部指定的位置,减少被攻击可能性
注意:-fPIC导致应用体积变大,-fpic产生的相对较小 作用范围:动态库(包括操作系统的库也要注意,不能拿来就用)
7.软件地址段保护
实现方式:编译时给gcc传参:–fPIE或-fpie及-pie
原因:将可执行程序的地址编译成随机加载,不予以固定地址开始执行,降低攻击可能性
注意:-fPIE产生代码稍大,-fpie产生代码相对较小;-fPIE编译选项,-pie链接选项 作用范围:动态库及可执行程序
8.软件编译、运行时链接动态库保护:
实现方式:gcc编译增加选项:-Wl,--disable-new-dtags,--rpath,/lib1:/lib2;-Wl,--enable-new-dtags,--rpath,/lib1:/lib2
原因:默认情况下,gcc通过环境变量LD_LIBRARY_PATH读取用户库路径、系统库路径(运行时也一样),如果默认路径被篡改且具备同名动态库,则可能链接到攻击代码
注意:文件系统路径需要存在
作用范围:用户软件、系统软件(系统软件情况下就需要使用官方发布的版本、或者下载源码重新制作文件系统)
9.软件编译、运行时静态区保护:
实现方式:gcc编译增加选项:-D_FORTIFY_SOURCE=2 -O2
原因:gcvc特性,对应用编译及运行静态区进行检查 注意:开销大,需要测试后使用
作用范围:动态库、可执行文件
10.软件动态库编译保护:
实现方式:gcc编译增加选项:-fvisibility=hidden
原因:设置elf文件的符号隐藏,可大幅提高链接加载性能
注意:调试困难 作用范围:动态库、可执行文件
11.软件运行堆栈保护:
实现方式:gcc编译增加选项:-fstack-check
原因:编译时检查应用的栈空间,如果超过编译告警阀值则产生告警;然后在程序中生成额外的指令来检查运行时栈不会被溢出,stack-check选项会在每个栈空间最低底部设置一个安全的缓冲区,如果函数中申请的栈空间进入安全缓冲区,则触发一个Storage_Error异常。但它所生成的代码实际上并不处理异常,如果检测到异常则会发出一个消息,通知操作系统处理。它只保证操作系统可以检测到栈扩展
注意:性能影响大 作用范围:可执行文件
12.软件调试符号保护:
实现方式:gcc编译增加选项:-s或者用strip、objcopy工具进行分离(建议后者,后期调试gdb手动可加载)
原因:符号表实际运行无用 注意:压缩后注意保存符号表文件
作用范围:可执行、动态库
13.Linux内核编译保护
内核编译前打开配置 CONFIG_CC_STACKPROTECTOR / CONFIG_CC_STACKPROTECTOR_STRONG 内核3.14及以上版本可支持CONFIG_CC_STACKPROTECTOR_STRONG原有CONFIG_CC_STACKPROTECTOR(对应-fstack-protector)修改为CONFIG_CC_STACKPROTECTOR_REGULAR
------------------------分割线-------------------------
3、4和5结合起来就是gcc传参:-Wl,-z,relro,-z,now,-z,noexecstack
------------------------分割线-------------------------
缩写 英文名 中文名
VDSO virtual dynamic shared object 虚拟动态共享对象
ASLR Address space layout randomization 地址空间分布随机
GOT global offset table 全局偏移量表
PIC position-independent code 地址无关代码