初步理解内核漏洞:(内核开发人员必读)
内核开发人员,如果不了解内核漏洞的话,容易在开发时引入漏洞,轻则导致内核崩溃,影响上面的所有应用程序;重则导致内核提权,即可以突破应用层的沙箱,进入内核,并在内核里面为所欲为。
本文章就是讲解一下常见的内核漏洞类型,让内核开发人员有个初步的了解,从而在开发时就会有潜意识,不会制造比较明显的漏洞了。(对于专门挖过内核漏洞的人来说,该文章就没必要看了:)。
常见的内核漏洞有下面几种:栈溢出(stack overflow)、堆溢出(heap overflow)、整型溢出漏洞(integer overflow)、释放后重用(use-after-free)、双重释放(double free)、线程竞争(race condtion).
下面通过例子,一一进行简单地介绍:
栈溢出:
例子:
static size_t deviceA_write(struct file *filp, const char __user *buf, size_t len, loff_t *data)
{
int ret = 0;
char tmp[100] = { 0 };
/* write data to the buffer */
if (copy_from_user(tmp, buf, len)) {
return -EFAULT;
}
上述是一个设备驱动的代码,提供了write的接口。即用户在应用层可以调用write函数,向该设备写数据。 内核开发人员都知道copy_from_user是从应用层往内核层拷贝数据,其第一个参数tmp为拷贝的目的地址;第二个参数buf 为拷贝的源地址;第三个参数为拷贝的数据的长度。在这里目标地址的长度为100,但是由于没有对拷贝的长度(len)做限制,当用户传入的长度大于100时,用户的数据就会覆盖掉tmp的100个字节以外的数据。由于栈是从高往低的,因此覆盖的数据会是比tmp的高地址的数据。程序的返回地址一般在进行函数调用时放到栈上,在这里如果将返回地址覆盖掉了,那么就可以

本文主要为内核开发人员介绍常见的Linux内核漏洞,包括栈溢出、堆溢出、整型溢出、释放后重用、双重释放和线程竞争,通过实例解析漏洞原理,帮助开发者在开发时避免引入安全隐患。
最低0.47元/天 解锁文章
2349

被折叠的 条评论
为什么被折叠?



