GCC 编译器安全性保障全景
一 核心机制与编译选项
| 保护机制 | 作用 | 典型选项 | 备注 |
|---|---|---|---|
| NX/DEP(不可执行栈) | 将数据页标记为不可执行,阻断在数据区执行 shellcode | -z noexecstack(开启),-z execstack(关闭) | 现代系统通常默认开启 |
| Stack Canary(栈金丝雀) | 在函数返回前校验金丝雀值,检测栈溢出 | -fstack-protector(含缓冲区的函数)、-fstack-protector-strong(GCC 4.9+ 更强覆盖)、-fstack-protector-all(所有函数) | 覆盖越广开销越大 |
| RELRO(重定位只读) | 将重定位表(如 GOT)在加载或立即解析后设为只读,降低 GOT 覆盖风险 | -Wl,-z,relro(Partial)、-Wl,-z,now(Full) | Full RELRO 需立即解析所有符号 |
| PIE/ASLR(位置无关可执行) | 使代码段/数据段基址随机化,提升利用难度 | -fPIE -pie(可执行程序) | 库用 -fPIC;ASLR 强度受内核 /proc/sys/kernel/randomize_va_space 影响 |
| FORTIFY_SOURCE | 对常见危险函数(如 strcpy/gets)在编译期/运行期做边界检查 | -D_FORTIFY_SOURCE=2(常用) | 需开启优化(如 -O1/-O2) |
| Stack Clash 防护 | 降低栈与堆/映射区碰撞导致的溢出风险 | -fstack-clash-protection | 对大规模分配/递归场景尤为重要 |
| 立即绑定 | 减少延迟绑定窗口,配合 Full RELRO 降低 PLT/GOT 攻击面 | -Wl,-z,now | 启动略慢,安全性更高 |
二 运行时与系统层加固配合
三 检测与诊断工具链
四 前沿与架构相关缓解
五 落地建议与注意事项