
Polkit Pkexec 취약점에 대한 개념 증명: CVE-2021-4034(Pkexec Local Privilege Escalation)
이 저장소에는 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