Page 1 of 1

[分享] Linux gnu 安全编译优化参数使用

Posted: 2022年 Dec 19日 16:35
by shanjm

普通编译选项

Werror

作用:将编译中出现的所有警告转换为错误,排除代码中的一些潜在风险,保证代码不同编译器间的一致性
方法:
-Werror

Wall

作用:编译时显示所有的警告消息,排除代码中的一些潜在风险,保证代码不同编译器间的一致性
方法:
-Wall

安全编译选项

ASLR

作用:地址空间布局随机化,来增大入侵者预测目的地址的难度,从而降低进程被成功入侵的风险
方法:
关闭地址空间的随机化: echo 0 > /proc/sys/kernel/randomize_va_space
保留的随机化,其中共享库、栈、mmap 以及 VDSO 将被随机化: echo 1 > /proc/sys/kernel/randomize_va_space
完全的随机化,在 BUILD_ASLR_PARTIAL的基础上,通过 brk() 分配的内存空间也将被随机化: echo 2 > /proc/sys/kernel/randomize_va_space

PIE

作用:代码段和数据段的随机化工作,在利用缓冲溢出和移动操作系统中存在的其它内存崩溃缺陷时采用面向返回的编程 (Return Oriented Programming) 方法变得难得多
方法:
不开启PIE:
开启PIE 强度为1:
可执行文件:-fpie -pie
库: -fpie
开启PIE 强度为2:
可执行文件:-fPIE -pie
库:-fPIE

CANARY

作用: 栈溢出保护,当启用栈保护后,函数开始执行的时候会先往栈里插入 Cookie 信息,函数返回时会验证 Cookie 信息是否合法,非法则停止运行,攻击者在覆盖返回地址的时候往往也会将 Cookie 信息给覆盖掉,导致栈保护检查失败进而阻止 ShellCode 的执行
方法:
关闭栈溢出保护: -fno-stack-protector
启用堆栈保护,只为局部变量中含有 char 数组的函数插入保护代码:-fstack-protector
启用堆栈保护,为所有函数插入保护代码:-fstack-protector-all
更广范围的栈保护:-fstack-protector-strong

FORTIFY

作用: 用于检查是否存在缓冲区溢出的错误,针对的是字符串、内存操作函数,例如 memcpy memset strcpy strcats snprintf 等等。
方法:
默认不会开启检查:空
仅在编译时检查:-D_FORTIFY_SOURCE=1
在程序运行时也会检查,如果判断到缓冲区溢出则会直接终止程序:-O2 -D_FORTIFY_SOURCE=2

RELRO

作用:read Only Relocation 由 linker 指定 binary 的一块经过 dynamic linker 处理过 relocation 之后的区域为只读.设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对 Global Offset Table, GOT 攻击。
方法:
关闭 relro: -z norelro
部分开启 即Partial RELRO,GOT 表具有写权限:-z lazy
全部开启,GOT 为只读: -z now

NX

作用:NX (No-eXecute protect)将数据所在内存页标识为不可执行,当程序溢出成功转入 ShellCode 时,程序会尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。
方法:
开启:-z noexecstack ,-z noexecheap
关闭:-z execstack ,-z execheap