初步理解内核漏洞:(内核开发人员必读)
内核开发人员,如果不了解内核漏洞的话,容易在开发时引入漏洞,轻则导致内核崩溃,影响上面的所有应用程序;重则导致内核提权,即可以突破应用层的沙箱,进入内核,并在内核里面为所欲为。
本文章就是讲解一下常见的内核漏洞类型,让内核开发人员有个初步的了解,从而在开发时就会有潜意识,不会制造比较明显的漏洞了。(对于专门挖过内核漏洞的人来说,该文章就没必要看了:)。
常见的内核漏洞有下面几种:栈溢出(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函数,向该设备写数据