From 315457cae0d28e5c35e533a6898e165721725a07 Mon Sep 17 00:00:00 2001 From: buter <zhangyaozhong1@huawei.com> Date: Mon, 20 Dec 2021 09:29:09 +0800 Subject: [PATCH] add SecureCompile --- guide/SecureCompile(C&C++).md | 201 ++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 guide/SecureCompile(C&C++).md diff --git a/guide/SecureCompile(C&C++).md b/guide/SecureCompile(C&C++).md new file mode 100644 index 0000000..cef92b8 --- /dev/null +++ b/guide/SecureCompile(C&C++).md @@ -0,0 +1,201 @@ +## openGauss安全编译选项实施要求(C&C++) + +建议按如下方式使用安全编译选项,提高版本安全质量。 + +目录 ++ [打开地址随机化选项](#打开地址随机化选项) ++ [打开栈保护选项](#打开栈保护选项) ++ [打开GOT表重定位只读选项](#打开GOT表重定位只读选项) ++ [打开堆栈不可执行选项](#打开堆栈不可执行选项) ++ [打开-s选项或者使用strip工具](#打开-s选项或者使用strip工具) ++ [禁止使用rpath选项](#禁止使用rpath选项) + + + +### 打开地址随机化选项 + +【级别】 + + 要求 + +【描述】 + +**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。 \ No newline at end of file -- Gitee