GCC的-fstack-protector-all与-fstack-protector-strong哪个防护能力更强?
GCC栈防护选项
-fstack-protector-all与-fstack-protector-strong防护能力对比 结论
仅从防护能力维度判断,-fstack-protector-all的防护能力更强。
官方规则说明
GCC对两个选项的定义如下:
-fstack-protector-all:作用与-fstack-protector类似,但会对所有函数添加栈防护。-fstack-protector-strong:作用与-fstack-protector类似,但会额外为包含本地数组定义、或存在本地栈帧地址引用的函数添加栈防护。
差异分析
- 覆盖范围:
-fstack-protector-all是无差别覆盖所有函数,不管函数内部是否存在栈溢出风险点,都会插入栈金丝雀校验逻辑。-fstack-protector-strong仅针对包含高风险操作的函数添加防护,无对应风险操作的函数不会触发栈防护。 - 漏洞覆盖能力:
-fstack-protector-all可以覆盖到一些非常规的栈溢出场景,比如手动操作栈指针的逻辑错误、静态链接库中隐藏的栈操作漏洞等,这类场景不符合-fstack-protector-strong的触发条件,不会被防护。 - 性能损耗:
-fstack-protector-all的全量防护会带来更高的运行时性能开销,-fstack-protector-strong只针对高风险函数添加防护,性能损耗更低,是多数发行版默认的栈防护选项。
内容的提问来源于stack exchange,提问作者newlinuxer
相关产品推荐
相关产品推荐

