From: Ron E <ronaldjedgerson () gmail com>
Date: Fri, 19 Sep 2025 22:24:20 -0400
gmo2msg in libelf contains a stack-based buffer overflow in po/gmo2msg.c
when constructing filenames from the first program argument (lang). The
program uses a fixed-size local buffer (char buf[1024]) and writes into it
using sprintf(buf, "%s.gmo", lang) and sprintf(buf, "%s.msg", lang) without
validating the length of lang. Supplying a sufficiently long lang argument
(e.g., ~1200 bytes) causes sprintf to write past the end of buf, leading to
a stack-buffer-overflow that crashes the process and may enable code
execution under favorable conditions.
*Impact:*
-
Immediate, reproducible crash when passing a long lang argument.
-
If the binary is executed in a privileged context (e.g., run by a
privileged service, installed setuid, package scripts), or on targets with
downgraded exploit mitigations, a reliable exploit may be feasible.
-
Memory corruption could be used as a primitive in a larger exploit chain.
*Proof of Concept:*
./gmo2msg "$(python3 -c 'print("A"*1200)')"
*Output:*
=================================================================
==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
_______________________________________________
Sent through the Full Disclosure mailing list
https://nmap.org/mailman/listinfo/fulldisclosure
Web Archives & RSS: https://seclists.org/fulldisclosure/
Current thread:
- libelf 0.8.12 Stack-based buffer overflow in gmo2msg (libelf) via unbounded sprintf of lang argument Ron E (Sep 22)