* 本文作者:李丽,本文属FreeBuf原创奖励计划,未经许可禁止转载
漏洞背景
在今年5.30日linux sudo被爆出存在安全漏洞,sudo版本是1.8.20以及之前的版本都有可能会受到漏洞的影响,在开启selinux的情况和普通用户在sudoer者中,可以使普通用户造成覆盖任意文件,造成权限的提升。
漏洞分析
出现漏洞主要在sudo中的/src/ttyname.c中的
char *get_proccess_ttyname()函数中,这个函数功能获取终端名称,会有多种方式获取终端名称,而此次漏洞是出现在根据读取/proc/pid/stat的方式先获取设备号,然后根据设备号获取设备名的函数中,如图所示:
从网上下了一个漏洞版本的1.8.18版本sudo源码,分析char *get_proccess_ttyname()函数的整体的执行流程。
然后看一下读取/proc/pid/stat处的代码:
可以看出是按照空格来区分来读取信息,也就是读取第7个空格之前的信息,也就是第7段的信息,百度了以下发现第7段的信息如果是非0的话就是代表设备号。[root@localhost ~]# cat /proc/6873/stat
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56
这里面的第7项也就是34819就是当前终端的设备号,第2项a.out就是进程名字。
这里在回顾一下源代码中获取设备号的逻辑是判断有7个空格取空格前一项也就是第7项数据,第二项是进程的名字,漏洞就出现在这里,进程名字是我们可以可控的,那么