CVE-2019-18276 :Bash 5.0 Patch 11 - SUID Priv Drop

0x01.漏洞描述

在GUN Bash 5.0 补丁11 shell.c的diable_priv_mode()中发现一个问题,默认情况下,如果Bash运行时其有效UID不等于其实际UID,它将通过将其有效UID设置为其真实UID来放弃特权。但是,这样仍存在安全问题。在Linux和其他支持“保存的UID”功能的系统上,保存的UID不会被删除。UID为0运行的二进制文件不受影响。

0x02.漏洞影响版本

version : < Bash 5.0补丁11版本

0x03.漏洞利用

1.新建两个用户

upload successful

2.bash版本也符合

upload successful

3.在attacked用户的根目录下有一个security.txt文件,文件的权限如下图所示

upload successful

4.用户hacker无法读取文件

upload successful

5.用户hacker,查看/bin/bash的权限,如下图所示

upload successful

在这里我们可以看到,/bin/bash的所有者和所属组是attacked和bash的权限,这里关键的是用户的s权限。这里介绍一下s权限 ,包含S_ISUID、S_ISGID两个常量在内,叫做强制位权限,作用在于设置使文件在执行阶段具有文件所有者的权限,相当于临时拥有文件所有者的身份。这里hacker用户所使用的bash是attacked权限的bash。

6.这里我们查看用户的id

upload successful

upload successful

upload successful

upload successful

这里我们可以看到攻击者和被攻击者的uid,gid,group不一致,并且hacker的/bin/bash权限符合漏洞的要求

7.执行exp,更改攻击者的有效id

upload successful

这里可以看到成功执行EXP

8.hacker用户查看attacked用户下的security.txt文件

upload successful

这里我们已经能查看attacked用户的security.txt文件

0x04.漏洞修复原理

upload successful

这里我们可以看到使用了setresuid(),setresgid(),定义在 <unistd.h>头文件中
setresgid:分别设置真实的,有效的和保存过的组标识号

1
int setresuid(uid_t ruid ,uid_t euid ,uid_t suid );

setresuid:分别设置真实的,有效的和保存过的用户标号

1
int setresgid(gid_t rgid ,gid_t egid ,gid_t sgid );

setresuid:非特权进程可以将其实际UID,有效UID和已保存的设置用户ID更改为以下之一:当前实际UID,当前有效UID或当前已保存的设置用户ID,特权进程(在Linux上,具有CAP_SETUID功能)可以将其实际UID,有效UID和已保存的set-user-ID设置为任意值,如果参数之一等于-1,则相应的值不会更改。setresgid的原理和setresuid的类似。

0x05.漏洞修复

请手动更新至最新版