
CVE-2021-4034에 대한 개념 증명 (실험적 무흔적 악용 포함)
pkwned: CVE-2021-4034에 대한 개념 증명(Proof of Concept)
이 PoC는 glibc에서 실행되는 취약한 버전의 pkexec에서 PAYLOAD_PATH(constants.h에 정의됨)를 root 권한으로 실행합니다. "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_PATH=." 위에 FUSE 파일시스템을 마운트하는 gconv-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