
Polkit Pkexec の脆弱性の概念実証: CVE-2021-4034(Pkexec ローカル権限昇格)
このリポジトリには、Polkit Pkexec の脆弱性 CVE-2021-4034 (Pkexec Local Privilege Escalation) の仕組みを理解するために開発したエクスプロイトが含まれています。Polkit (旧称 PolicyKit) は、Unix 系オペレーティングシステムで特権を制御する役割を持つコンポーネントです。特権を持たないプロセスが、特権を持つプロセスと通信するための整理された手段を提供します。この脆弱性により、システムの一般ユーザーなど、管理特権を持たない任意のユーザーが、システム上で最大の特権を獲得できます。
この脆弱性は、pkexec の main() 関数が、引数が 0 であるコマンドライン引数を処理する際に発生します。この関数は引数リストにアクセスしようとし、結果として rgvvoid (コマンドライン引数のコントローラ) にアクセスしようとします。つまり、pkexec が呼び出しパラメータを正しく処理せず、環境変数をコマンドとして実行しようとしたときに発生します。その結果、メモリが境界外で読み書きされ、攻撃者はこれを悪用して環境変数を注入し、悪意のあるコードをロードさせることができます。
理解するのは簡単で、これらの環境変数を注入できるという事実がコードを脆弱にしています。私がこの脆弱性を悪用するために使用した方法は、Qualys が使用したものと同じです。プロセスは単純で、pkexec の作業環境に GCONV_PATH 変数を注入するだけです。つまり、システムの一般ユーザーが利用できる任意のディレクトリです。この変数は共有ライブラリを root として実行します。この手法はノイズが多く、多くの痕跡を残すことを明確にしておく必要があります。なぜなら、変数の注入によってディレクトリが作成され、それが root ユーザーと特権を共有するからです。
システムが脆弱であることが判明した場合は、できるだけ早く更新してください。それでも脆弱であると思われる場合は、一時的な緩和策として pkexec の SUID ビットを次のように削除できます: # chmod 0755 /usr/bin/pkexec
脆弱性の仕組みの詳細はこちら。
このエクスプロイトは、Debian、Ubuntu、Fedora、CentOS ベースの脆弱なディストリビューションで即座に動作します。この脆弱性についての学習と、現在 C 言語だけでどこまで到達できるかを確認するために作成されました :D。これを不正な目的に使用しないでください。
$ git clone https://github.com/Nosferatuvjr/PwnKit
$ cd PwnKit
$ chmod +x ./PwnKit.sh
$ ./PwnKit.sh
# id
または
$ git clone https://github.com/Nosferatuvjr/PwnKit
$ cd PwnKit
$ chmod +x ./PwnKit
$ ./PwnKit
$ ./PwnKit id #shell interativa

gcc -shared PwnKit.c -o PwnKit -Wl,-e,entry -fPIC