内核栈溢出保护
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
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;
这个功能是在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
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献1条内容
所有评论(0)