CVE-2021-3156

Background

sudo的一个堆溢出漏洞

搭个环境

这里下个老版本的源码, 我选择了Sudo 1.9.5p1, 即上一个release版本.

clone下来以后, 回退到指定版本

git reset --hard e60ff9058b65f12652847316ec81954b4bce7bbe

然后设置安装路径

./configure prefix=/home/ubuntu/Desktop/cve-2021-3156

改一哈源码, 在漏洞点(plugins/sudoers/sudoers.c line 971)的地方加一个pause, 方便gdb连上去看

编译

make && make install

细节

360的公众号给出的漏洞验证方法是sudoedit -s /, 输出sudoedit: /: not a regular file表明存在漏洞, 看一下sudoedit是用来安全编辑一个系统文件的, 流程是先把目标文件复制一份到tmp, 然后启动编辑器编辑, 再把保存的文件覆盖回去, 不用全程保持root权限, 更加安全. 而-s, --shell: run shell as the target user; a command may also be specified 表示用一个目标用户来开一个新的shell.

公开文章中表示, 如果sudo以一个shell模式运行(shell -c), 即通过-s来设置shell模式, 或者通过-i来设置shell模式和shell登录模式, 查资料可知

  • sudo -i,加载用户变量,并跳转到目标用户home目录;
  • sudo -s,不加载用户变量,不跳转目录;

在sudo的main函数中, parse_args()函数会重写argv, 然后通过\转义所有的元字符(\n之类的)

更新

有大佬发了exp, 看了一下是利用tcache的, 即libc2.31+版本, 最近忙着找工作先鸽了, 有时间再写

Reference