The Dirty Pipe
Linux kernel privilege escalation
摘要
Linux Kernel 5.8及以后版本中允许覆盖重写任意可读文件中的数据,未经授权的本地用户可以使用此漏洞写入由只读文件支持的页面缓存中的页面,可以利用此漏洞进行本地权限提升。类似于CVE-2016-5195 “Dirty Cow”。此漏洞影响 5.17-rc6 之前的 Linux 内核版本。
评分
CVSSV3 :7.8
POC已公开
影响范围
影响版本
5.8 <= Linux kernel < 5.16.11 / 5.15.25 / 5.10.102
安全版本
该漏洞已在Linux 5.16.11、5.15.25 和 5.10.102 中修复。
漏洞验证
目前存在两个可用poc,一个是原作者Max Kellermann的poc,原poc是通过覆写文件来达到提权的目的,另一个是它的改进版,通过覆盖SUID程序来达到提权的目的。
(1)通过覆盖SUID程序进行提权poc验证
SUID (Set User ID) 是文件的一种权限,允许用户以其所有者的权限执行文件。Linux 二进制文件可以拥有这种类型的权限集有很多原因。例如,ping 实用程序需要 root 权限才能打开网络套接字,但它也需要由标准用户执行,以验证与其他主机的连接。
但是,如果某些现有的二进制文件和实用程序具有 SUID 权限,则可以使用它们将权限提升到 root。
以下命令可以发现系统上运行的所有 SUID 可执行文件。更具体地说,这些命令是尝试在用户 root 拥有的具有 SUID 权限位的目录中查找文件,然后将所有其重定向到 /dev/null 以便仅列出用户有权访问的二进制文件使用权。
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
复现过程
①查询suid可执行文件
②提权
(2)通过覆写/etc/passwd文件进行提权poc验证
①用法
②备份/etc/passwd
sudo cp /etc/passwd /etc/passwd.bak
③查看/etc/passwd
cat /etc/passwd
这里了解一下/etc/passwd中各用户数据每个字段的含义(因为我也不是很清楚)。
第一个字段中保存的是:注册名,也就是用户名称,这里为root。
第二字段为:口令(passwd),也就是密码,这里的x代表的是密码标志,而不是真正的密码,真正的密码是保存在 /etc/shadow 文件中。
注:在早期的 UNIX 中,这里保存的就是真正的加密密码串。现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。
第三个字段就是用户 ID(UID),这里为0,代表超级用户。
注:0=超级用户、1~499=系统用户(伪用户)、500-65535=普通用户。
第四个字段就是用户的组 ID、这里为0,代表所属组为0组。
第五个字段是这个用户的简单说明,这里为root,没有什么特殊作用,可以不写。
注:如用户的真实姓名、办公室地址、联系电话等。
第六个字段是这个用户的家目录,这里为/root。
注:超级用户的家目录是 /root 目录,普通用户在 /home/ 目录下建立和用户名相同的目录作为家目录,如 lamp 用户的家目录就是 /home/lamp/ 目录。
第七个字段为:用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,可以理解为用户登录之后所拥有的权限,这里为/bin/bash,代表可以使用bash程序。
例:若为/sbin/nologin代表禁止登录,一般为系统用户。若为/usr/bin/passwd,这是修改用户密码程序的路径,代表用户只能改自己的密码。
更详细的解释参考:
http://c.biancheng.net/view/839.html
④执行命令进行提权
参考p师傅的方法,执行命令
./exploit /etc/passwd 5 ":0:0:rootx:"
将root用户的密码置空,再次切换root用户可以免密切换。
这里碰到一个问题,当我执行命令
./exploit /etc/passwd 5 ":0:0:root:"
切换root用户失败。
再次尝试:
./exploit /etc/passwd 5 ":0:0:r1234:"
成功。盲猜应该是在用户密码为空的情况下注册名和描述性信息不能相同,具体原因不知道,有了解的师傅可以帮忙给解释一下。
相关POC关注公众号401SecNote后台回复CVE-2022-0847获取,包含源码和可执行文件。
Max Kellermann's blog:https://dirtypipe.cm4all.com/
修复建议
升级linux内核到安全版本:
Linux 内核 >= 5.16.11
Linux 内核 >= 5.15.25
Linux 内核 >= 5.10.102
参考链接:
https://dirtypipe.cm4all.com/
https://haxx.in/files/dirtypipez.c
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-0847
https://blog.csdn.net/qq_44657899/article/details/106934143
https://www.cnblogs.com/sainet/p/15785864.html
https://twitter.com/phithon_xg/status/1500902906916081666?s=20&t=YcmV8MOOFk_lprrnlNe-wg
声明:本文作为个人学习记录使用,请勿用于非法行为。