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