
PwnKit 취약점에 대한 익스플로잇의 간단한 구현입니다.
참고: 이 저장소와 그 내용은 학사 졸업 논문(GrAL)의 일부이며, 오직 교육적 목적과 학술 연구를 위해 작성되었습니다.
이 저장소는 CVE-2021-4034 취약점(PwnKit이라고도 함)에 대한 개념 증명(PoC - Proof of Concept)을 포함합니다. 이 메모리 손상 취약점은 Linux 시스템의 Polkit 구성 요소인 pkexec에 영향을 미칩니다. pkexec를 빈 인자 목록(argc == 0)으로 실행하면 환경 변수를 조작하여 임의의 공유 라이브러리를 강제로 로드하게 만들 수 있으며, 이를 통해 로컬 권한 상승을 얻을 수 있습니다.
다음은 이 결함을 악용하기 위해 실행 환경을 준비하는 데 필요한 단계를 설명합니다. 이 과정은 pkexec의 메모리 읽기/쓰기 오류를 어떻게 활용하는지 설명합니다:
gconv 구조)이 익스플로잇은 GLib이 오류 메시지를 출력하려 할 때 문자 변환을 처리하는 방식을 악용합니다. 이를 위해 첫 번째 단계는 GLib을 위한 GCONV 변환 모듈의 로컬 저장소 역할을 하는 특정 디렉토리 구조를 만드는 것입니다.
취약점의 핵심은 pkexec의 argc == 0 상태로 인해 발생하는 경계를 벗어난 쓰기를 활용하여 GCONV_PATH 환경 변수를 주입하는 것입니다. 이렇게 하면 프로그램이 비정상적인 문자 집합을 사용하도록 강제되며, 이는 GLib에게 문자 변환 모듈을 이전 단계에서 생성한 제어된 디렉토리에서 검색해야 함을 알려줍니다.
.so)우리 코드를 실행하기 위해서는 공유 라이브러리(공유 객체 또는 .so)를 컴파일해야 합니다. pkexec가 찾을 수 없는 문자 집합을 처리하려고 할 때, 이 라이브러리는 우리의 가짜 gconv 디렉토리에서 로드됩니다. pkexec는 SUID 비트가 설정된 바이너리이므로(root로 실행됨), 이 라이브러리가 로드되면 우리 코드는 root 권한을 획득하여 시스템을 완전히 제어하게 됩니다(예: root 셸을 여는 등).
gconv-modules 파일 구성마지막으로, 해당 로컬 디렉토리에 gconv-modules라는 구성 파일을 만들어야 합니다. 이 파일은 인덱스 역할을 합니다: GLib에게 요청된 특정 문자 집합의 변환을 수행하기 위해 어떤 특정 라이브러리(.so)를 로드해야 하는지 알려줍니다. 이 파일은 3단계에서 생성된 공유 라이브러리를 pkexec가 요청하는 변환과 연결합니다.
프로젝트에는 C 바이너리 컴파일과 환경 정리를 자동화하는 Makefile이 포함되어 있습니다.
프로젝트 컴파일: $ make
생성된 파일(임시 파일, 폴더, 바이너리)을 정리하려면: $ make clean