linux内核中有个编译选项CC_STACKPROTECTOR用来开启GCC的stack-protector功能,
这个功能是在GCC4.9版本中引入,用来检测栈是否遭到溢出攻击。


目前我们用的版本中开启了这两个选项CONFIG_CC_STACKPROTECTOR、CONFIG_CC_STACKPROTECTOR_REGULAR。


编译器栈溢出保护原理:
函数栈存储结构,从栈底往上一般是形参,返回地址,控制信息(EBP),局部变量。
栈溢出往往是局部变量超过了他自身的存储位置,覆盖到了返回地址,
如果返回地址被恶意攻击者利用,就会导致执行攻击者设计的代码,造成安全隐患。
编译器对栈溢出的保护就是在控制信息前面多存储一个特殊的canary word,
函数返回时检测canary word是否有被改写,如果被改写,意味着发生了栈溢出。


以下面代码为例,看下栈溢出的过程:
int vulFunc() {
    char name[10];
    //…
    return 0;

}

图 1. 溢出前的函数栈
溢出前的函数栈
图 2. 溢出后的函数栈
溢出后的函数栈


如果能在运行时检测出这种破坏,就有可能对函数栈进行保护。目前的堆栈保护实现大多使用基于 “Canaries” 的探测技术来完成对这种破坏的检测。


GCC 4.9 中三个与堆栈保护有关的编译选项
-fstack-protector:
启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。
-fstack-protector-all:
启用堆栈保护,为所有函数插入保护代码。
-fno-stack-protector:
禁用堆栈保护。

GitHub 加速计划 / li / linux-dash
12
2
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 5 年前
5def40a3 Add host customization support for the NodeJS version 5 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐