
CVE-2021-4034の概念実証(実験的なトレースレス悪用を含む)
pkwned: CVE-2021-4034 の概念実証
この PoC は、glibc 上で動作する脆弱性のあるバージョンの pkexec から、root 権限で PAYLOAD_PATH(constants.h で定義)を実行します。ディレクトリ「GCONV_PATH=.」には、gconv モジュールを含むディレクトリの名前と同じ実行可能ファイルが含まれている必要があります。
Qualys のアドバイザリ [1] で概説されているように、これにより syslog メッセージが生成されます。これまでに、それを防ぐための 2 つのアプローチを見つけました:
641 if (access (path, F_OK) != 0) 642 { 643 g_printerr ("Error accessing %s: %s\n", path, g_strerror (errno)); 644 goto out; 645 }
このリポジトリには、「GCONV_PATH=.」の上に FUSE ファイルシステムをマウントする gconv-fuse ユーティリティが含まれており、access("gconv", X_OK) を 1 回呼び出した後は空に見えます。これは、FUSE の user_allow_other 設定オプションが有効な場合にのみ機能します。
356 if (!g_file_get_contents ("/etc/shells", 357 &contents, 358 NULL, /* gsize *length */ 359 &error)) 360 { 361 g_printerr ("Error getting contents of /etc/shells: %s\n", error->message); 362 g_error_free (error); 363 goto out; 364 }
マウント名前空間を使用して、その上に読み取り不可能なファイルをマウントできますが、それにはユーザー名前空間も必要であり、非特権ユーザーを root にマッピングして、pkexec の setuid ビットを無効にします(例:「unshare -r -u -m」)。
GLib は g_find_program_in_path の修正をマージしていることに注意してください(おそらく v2.70.3 および v2.71.0 以降の次の安定版向け)。これにより、常に実際のフルパスを返すことで、このエクスプロイトが実行不可能になります。[2]
[1] https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt [2] https://gitlab.gnome.org/GNOME/glib/-/commit/13ee46538f901a8eca8e7a4c167a8838ed0858d4