
Docker 기반의 실험실로 CVE-2023-4863(libwebp의 힙 버퍼 오버플로우)을 재현하며, 자동화된 크래시 시연, 패치 버전과 취약 버전 비교, 격리된 네트워크에서의 GUI 기반 브라우저 익스플로잇을 포함합니다.
완전히 격리되고 자동화된 Docker 환경에서 CVE-2023-4863(libwebp의 힙 버퍼 오버플로)을 재현합니다. CEFIRE의 윤리적 해킹 모듈 실습을 기반으로 합니다.
사설 네트워크에 8개의 컨테이너를 띄웁니다:
| Container | 역할 |
|---|---|
| attacker | craft.c로 exploit.webp를 생성하고, 가짜 피싱 페이지와 함께 HTTP로 제공 |
| victim-cli | Ubuntu 22.04, libwebp 1.2.2-2ubuntu0.22.04.1 (취약). 익스플로잇을 자동으로 다운로드하여 처리 → 충돌(crash) |
| victim-patched | Ubuntu 22.04, Ubuntu 보안 저장소의 libwebp (패치됨). 동일 익스플로잇 → 제어된 오류, 충돌 없음 |
| victim-gui | Ubuntu 22.04, XFCE, VNC 및 Firefox 110 (취약). exploit.webp로 브라우저 실제 충돌 |
| victim-gui-patched | Ubuntu 22.04, XFCE, VNC 및 Firefox 126 (패치됨). 동일 익스플로잇 → 브라우저 정상 작동 |
| postgres | PostgreSQL — Guacamole 인증 및 연결의 백엔드 |
| guacd | Apache Guacamole 데몬 (프로토콜 프록시) |
| guacamole | 웹 인터페이스. SSH 또는 VNC를 통해 모든 컨테이너에 접근 가능하며, 추가 설치 불필요 |
자동 데모(victim-cli vs victim-patched)는 시작 시 자동으로 실행됩니다. GUI의 시각적 데모는 Guacamole에서 수동 상호작용이 필요합니다.
make up
make up은 처음 실행 시 세 가지 작업을 자동으로 수행합니다:
initdb.sh 실행)첫 번째 빌드는 몇 분 정도 소요됩니다 (기본 이미지 다운로드, PoC 저장소 복제, 패키지 설치). 이후 실행에서는 Docker 캐시를 사용하여 거의 즉시 완료됩니다.
완료되면 Guacamole URL이 출력에 표시됩니다. 피해자 컨테이너는 공격자가 준비되어 익스플로잇을 제공할 때까지 시작되지 않습니다 (healthcheck).
| 접근 | 사용자 | 비밀번호 |
|---|---|---|
| Guacamole (웹) |
연구소가 실행 중인 상태에서 터미널에서:
# 취약한 피해자에서 충돌 확인
make logs-victim-cli
# 패치된 피해자에서 제어된 응답 확인
make logs-victim-patched
victim-cli에서 볼 내용:
[*] Ejecutando: dwebp /tmp/exploit.webp -o /tmp/salida.png
Decoding of exploit.webp failed.
Status: 3(BITSTREAM_ERROR)
*** glibc detected *** double free or corruption (!prev) ***
Aborted (core dumped)
[!] EXIT CODE: 134 (SIGABRT)
[!] CVE-2023-4863 CONFIRMADO
victim-patched에서 볼 내용:
[*] Ejecutando: dwebp /tmp/exploit.webp -o /tmp/salida.png
Decoding of exploit.webp failed.
Status: 3(BITSTREAM_ERROR)
[+] EXIT CODE: 1 — Error controlado
[+] CVE-2023-4863 MITIGADO
가장 시각적인 데모는 victim-gui(취약)와 victim-gui-patched(패치됨)를 XFCE 데스크톱 터미널에서 dwebp를 사용하여 비교하는 것입니다.
guacadmin / guacadminfirefox --no-sandbox http://attacker/index.html
exploit.webp를 렌더링하려고 시도 → 충돌 (SIGABRT, 프로세스 종료)Mozilla는 releases.mozilla.org에 모든 버전의 영구 공개 아카이브를 유지합니다. Google은 Chrome의 이전 버전 URL을 CDN에서 제거하여 Chrome 116을 안정적으로 다운로드하는 것이 불가능해졌습니다. Firefox 110도 동일하게 취약하며(둘 다 libwebp를 내장), Mozilla 아카이브에서의 다운로드는 안정적이고 재현 가능합니다.
ssh root@localhost -p 2220 # attacker
ssh root@localhost -p 2221 # victim-cli
ssh root@localhost -p 2223 # victim-patched
ssh root@localhost -p 2222 # victim-gui
ssh root@localhost -p 2224 # victim-gui-patched
직접 VNC: localhost:5900 (victim-gui) 및 localhost:5901 (victim-gui-patched).
make logs # 모든 로그 실시간 보기
make status # 컨테이너 상태 확인
make shell-attacker # 공격자 셸
make shell-victim-cli
make shell-victim-gui
make shell-victim-gui-patched
make down # 연구소 중지
make clean # 중지 + 이미지 및 네트워크 삭제
Chrome과 libwebp: Chrome은 자체 libwebp 복사본을 번들로 제공합니다(시스템 libwebp 사용 안 함). 버전 ≥ 116.0.5845.187에는 패치가 포함되어 있습니다. Google이 이전 버전 URL을 제거했기 때문에 Dockerfile은 현재 안정 버전(패치됨)으로 폴백합니다. dwebp를 사용한 충돌 데모는 동일하게 유효하며 더 안정적입니다.
격리된 네트워크: 실행 중에는 어떤 컨테이너도 인터넷에 접근할 수 없습니다. 모든 트래픽은 개인 Docker 네트워크 cve4863-lab-net 내에 유지됩니다.
guacadmin |
guacadmin |
| 모든 컨테이너 SSH | root | toor |
| VNC victim-gui 및 victim-gui-patched | — | secret |