7 Star 4 Fork 13

openGauss/security

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
SecureCompile(C&C++).md 6.30 KB
一键复制 编辑 原始数据 按行查看 历史
buter 提交于 2021-12-20 09:29 . add SecureCompile

openGauss安全编译选项实施要求(C&C++)

建议按如下方式使用安全编译选项,提高版本安全质量。

目录

打开地址随机化选项

【级别】

要求

【描述】

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的值是否被修改,就可以判断是否发生了溢出攻击。

打开GOT表重定位只读选项

【级别】

要求

【描述】

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进行检测

打开-s选项或者使用strip工具

【级别】

要求

【描述】

Linux平台用户态

作用阶段: 链接选项

作用范围: 动态库、可执行程序

用法: -s 或 strip工具

说明:

符号在链接过程中,发挥着至关重要的作用,链接过程的本质就是把多个不同的目标文件“粘”到一起,符号可看作链接的粘合剂,整个链接过程正是基于符号才正确完成的。链接完成后,符号表对可执行文件运行已经无任何作用,反而会成为攻击者构造攻击的工具,因此删除符号表可防御黑客攻击。事实上删除符号表除防攻击外,还可对文件减肥,降低文件大小。

1.对于静态库,可重定位文件(.o)不能strip,否则出现编译错误,只涉及ELF可执行文件和动态库

2.可以使用"-s"编译选项或strip工具对动态库和可执行文件删除符号表

3.建议发布前直接使用strip工具,strip级别为默认,如strip bin.out。

禁止使用rpath选项

【级别】

要求

【描述】

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。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/opengauss/security.git
git@gitee.com:opengauss/security.git
opengauss
security
security
master

搜索帮助

Cb406eda 1850385 E526c682 1850385