在完全隔离且自动化的 Docker 环境中复现 CVE-2023-4863(libwebp 堆缓冲区溢出)。基于 CEFIRE 的道德黑客模块实践。
在私有网络中启动八个容器:
| 容器 | 角色 |
|---|---|
| attacker | 使用 craft.c 生成 exploit.webp,并通过 HTTP 提供该文件以及一个模拟钓鱼页面 |
| victim-cli | Ubuntu 22.04,带 libwebp 1.2.2-2ubuntu0.22.04.1(有漏洞版本)。自动下载并处理该漏洞利用文件 → 崩溃 |
| 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 | Web 界面,通过 SSH 或 VNC 访问所有容器,无需额外安装 |
自动演示(victim-cli 对比 victim-patched)在启动时自动进行。GUI 中的可视化演示需要从 Guacamole 手动操作。
make up
make up 如果是首次运行会自动完成三件事:
initdb.sh)首次构建需要几分钟(下载基础镜像、克隆 PoC 仓库、安装软件包)。后续运行会使用 Docker 缓存,几乎是即时的。
完成后,你会在输出中看到 Guacamole 的 URL。受害者容器会在攻击者就绪并提供漏洞利用文件后(健康检查)才启动。
| 访问方式 | 用户 | 密码 |
|---|---|---|
| Guacamole(Web) |
在终端中,当实验室正在运行时:
# 查看有漏洞受害者的崩溃情况
make logs-victim-cli
# 查看已修补受害者的受控响应
make logs-victim-patched
在 victim-cli 中你将看到:
[*] 执行: 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)
[!] 退出代码: 134 (SIGABRT)
[!] CVE-2023-4863 已确认
在 victim-patched 中你将看到:
[*] 执行: dwebp /tmp/exploit.webp -o /tmp/salida.png
Decoding of exploit.webp failed.
Status: 3(BITSTREAM_ERROR)
[+] 退出代码: 1 — 受控错误
[+] CVE-2023-4863 已缓解
最直观的演示是通过在 XFCE 桌面的终端中使用 dwebp 来比较 victim-gui(有漏洞)和 victim-gui-patched(已修补)。
guacadmin / guacadminfirefox --no-sandbox http://attacker/index.html
exploit.webp → 崩溃(SIGABRT,进程死亡)Mozilla 在 releases.mozilla.org 上保留了一个公开且永久的版本存档。Google 已从其 CDN 中移除了旧版 Chrome 的 URL,导致无法可靠下载 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 # 进入攻击者 shell
make shell-victim-cli
make shell-victim-gui
make shell-victim-gui-patched
make down # 停止实验室
make clean # 停止并删除镜像和网络
Chrome 与 libwebp: Chrome 捆绑了自己的 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 |