pkwned:CVE-2021-4034 的概念验证
此 PoC 将以 root 权限运行 PAYLOAD_PATH(在 constants.h 中定义),前提是运行在 glibc 上的 pkexec 存在漏洞。目录 "GCONV_PATH=." 中需要包含一个可执行文件,其名称与包含 gconv 模块的目录同名。
正如 Qualys 公告 [1] 中所述,这会产生一条 syslog 消息。到目前为止,我找到了两种方法来阻止这种情况:
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-fuse 工具,它会在 "GCONV_PATH=." 上挂载一个 FUSE 文件系统,在调用一次 access("gconv", X_OK) 后,该文件系统看起来是空的。它仅在启用了 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