建议按如下方式使用安全编译选项,提高版本安全质量。
目录
【级别】
要求
【描述】
Linux用户态
a.使用命令 echo 2 >/proc/sys/kernel/randomize_va_space 打开系统随机化配置
作用阶段: 运行系统配置
作用范围: 堆、栈、内存映射区(mmap基址、shared libraries、vdso页)
用法: echo 2 >/proc/sys/kernel/randomize_va_space
说明:
ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。randomize_va_space等于1时,栈、数据段、VDSO会随机化,randomize_va_space等于2时,堆地址也会随机化。
需要ASLR开启的级别为最高级别,即randomize_va_space等于2
b.打开PIC选项实现动态库随机加载
作用阶段: 编译选项
作用范围: 动态库
用法: –fPIC(-fpic)
说明:
地址无关选项将发生在代码段的重定位移到数据段实现,so文件加载时代码段不会发生任何变化,做到所有进程共用一个代码段副本。
-fPIC和-fpic均指示GCC产生地址无关代码,唯一的区别是-fPIC产生代码稍大,-fpic产生代码相对较小。
c.打开PIE选项实现可执行文件随机加载
作用阶段: 编译链接选项
作用范围: 可执行程序
用法: –fPIE(-fpie)-pie
说明:
具备PIE的可执行文件,在加载执行时可像共享库一样随机加载。有研究表明:PIE可有效降低固定地址类攻击、缓冲溢出类攻击的成功概率。
(1)关注对应的热补丁版本是否支持PIE选项,不支持的场景下不建议使用该选项
(2)-fPIE编译选项,-pie链接选项。
(3)-fPIE产生代码稍大,-fpie产生代码相对较小。
【级别】
要求
【描述】
Linux平台用户态
作用阶段: 编译选项
作用范围: 可重定位文件(.o)、动态库、可执行程序
用法: -fstack-protector-all/-fstack-protector-strong
说明: 当存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来劫持程序控制流。启用栈保护后,在缓冲区和控制信息间插入一个canary word。攻击者在覆盖返回地址的时候,往往也会覆盖canary word。通过检查canary word的值是否被修改,就可以判断是否发生了溢出攻击。
【级别】
要求
【描述】
Linux平台用户态
a.部分重定向只读选项
作用阶段: 链接选项
作用范围: 动态库、可执行程序
用法: -Wl,-z,relro
说明:
动态链接的ELF二进制程序使用称为全局偏移表(GOT)的查找表去动态解析位于共享库中的函数。攻击者通过缓冲区溢出修改GOT表项的函数地址值来达到攻击的目的。通过增加RELRO选项,可以防止GOT表被恶意重写。
b.全部重定向只读选项
作用阶段: 链接选项
作用范围: 动态库、可执行程序
用法: -Wl,-z,now,relro
说明:
开启部分重定项只读保护后,再开启立即绑定可实现全部重定向只读保护,即:全部重定向只读(GOT表全保护):-Wl,-z,relro,-z,now
可较好对ret2plt的攻击进行防护,而对诸如缓冲区溢出等攻击无法防范。
【级别】
要求
【描述】
Linux平台用户态
作用阶段: 链接选项
作用范围: 动态库、可执行程序
用法: -Wl,-z,noexecstack
说明:
1.如果有内嵌函数,会导致功能错误,需要先用-Wtrampolines进行检测
【级别】
要求
【描述】
Linux平台用户态
作用阶段: 链接选项
作用范围: 动态库、可执行程序
用法: -s 或 strip工具
说明:
符号在链接过程中,发挥着至关重要的作用,链接过程的本质就是把多个不同的目标文件“粘”到一起,符号可看作链接的粘合剂,整个链接过程正是基于符号才正确完成的。链接完成后,符号表对可执行文件运行已经无任何作用,反而会成为攻击者构造攻击的工具,因此删除符号表可防御黑客攻击。事实上删除符号表除防攻击外,还可对文件减肥,降低文件大小。
1.对于静态库,可重定位文件(.o)不能strip,否则出现编译错误,只涉及ELF可执行文件和动态库
2.可以使用"-s"编译选项或strip工具对动态库和可执行文件删除符号表
3.建议发布前直接使用strip工具,strip级别为默认,如strip bin.out。
【级别】
要求
【描述】
Linux平台用户态
作用阶段: 链接选项
作用范围: 动态库、可执行程序
用法: -Wl,--disable-new-dtags,--rpath,/libpath1:/libpath2;-Wl,--enable-new-dtags,--rpath,/libpath1:/libpath2;-Wl,--enable-new-dtags,--rpath,/libpath1:/libpath2
说明:
主要用于防护LD_LIBRARY_PATH替换同名动态库的攻击。通过加入此选项可以指定一个运行时动态库搜索的路径,该路径的搜索优先级高于LD_LIBRARY_PATH指定的路径。可执行文件在运行阶段进行动态库搜索时会首先在--rpath指定的路径查找动态库,然后才会到LD_LIBRARY_PATH指定的路径搜索。因此可以有效防御LD_LIBRARY_PATH =[attackpath]来替换同名动态库的攻击。
但是该选项也有很多局限性,如指向的路径不安全,若普通用户可以在这些目录中使用恶意程序替换正常程序,造成权限提升,引发不安全路径漏洞,因此禁止使用rpath。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。