CVE-2019-14287 sudo提权漏洞
本文参考博客:参考博客
- 看到很多博客都将该漏洞概括为“非授权的特权用户可以绕过限制获得特权”
- sudo版本<1.8.28会受到影响
下面细细分析
先来了解下linux下的几个概念:
- root:root是系统中唯一的超级用户,具有系统中所有的权限
- sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的工具,暂时切换到超级用户模式来执行超级用户权限,也就是说经由sudo执行的指令就好像是root在执行
不过通过useradd命令添加的用户,不具备能执行sudo指令的权限,需要将其加入sudo组,而本次漏洞的利用前提之一就有当前用户存在于sudo权限列表中,所以是“特权用户”
漏洞复现
实验环境如下:
- Linux kalilinux 4.17.0-kali1-amd64 #1 SMP Debian 4.17.8-1kali1 (2018-07-24) x86_64 GNU/Linux
- sudo版本:利用sudo -V命令,我的是1.8.23
首先添加一个测试用户test,将其密码设置为rootuseradd test
passwd test
然后就要对/etc/sudoers进行修改
- ps:/etc/sudoers这个文件比较敏感,我是先将其
chmod 777 /etc/sudoers
,然后修改完后,如果不把权限改回来,sudo就不可以用了,如下所示:所以要改回来chmod 440 /etc/sudoers
修改内容如下:
含义是:test用户可以以非root身份执行/usr/bin/id,也就是其不能以root身份执行
上面其实说的就是管理员的一些配置,如果管理员不这么配我们就没办法了,下面我们就要在上述配置的基础上展开操作
切换到test用户su test
然后试图以root身份来执行/usr/bin/idsudo id
发现出现了下面的提示:
然后sudo有个选项- u,是可以通过指定用户的方式来代替该用户执行后面的命令
比如sudo -u test1 id
,就是此时test是以test1的身份来执行id的
然后当我们使用sudo -u#-1 id
或者sudo -u#4294967295 id
就可以触发漏洞,绕过之前的限制以root身份执行命令,4294967295(-1 的补码,其实内部是按无符号整数处理的)
如下所示:
漏洞原理分析
看一下官方修改的补丁补丁网址
不允许值为上述两值了
那为什么uid为-1和4294967295的时候,最后得到的结果是以uid为0,也就是root身份执行呢?
这里根据参考博客的博主学会了一个命令strace
- strace:可以跟踪系统调用的执行,然后以一行文本输出系统调用的名字、参数和返回值,具体使用可参考这篇博客linux神器strace
strace -u 需要root身份,切回su
执行命令strace -u test sudo -u#-1 id
在返回的系统调用命令中观察到:
根据参考博客知道,setresuid是系统调用setresuid32的封装,而setresuid32最后调用的是内核函数sys_setresuid(在kernal/sys.c文件中)
这里推荐一个在线查询linux源代码的网站:LXR(可以上网百度)
最后层层阅读,在/security/commoncap.c中找到了默认返回值(函数cap_task_fix_setuid)0
总结
该漏洞就是在具有sudo权限的用户被施加了某些限制(比如某些命令不能以root身份执行这样的约束),可以通过sudo的漏洞绕过限制,以root身份执行。
修复方法
- 更新sudo大于1.8.27
- 做好sudo用户列表管理