
Full Disclosure mailing list archives
CHMLIB 0.40a Integer Overflow in LZX Decompression of CHMLib
From: Ron E <ronaldjedgerson () gmail com>
Date: Sat, 13 Sep 2025 14:47:27 -0400
An integer overflow vulnerability exists in the LZX decompression routines of CHMLib (tested in version 0.40, latest release as of 2025). The issue occurs within lzx.c during bitstream parsing (lzx_read_lens and LZXdecompress), where crafted CHM files can supply values that cause left-shift operations to exceed the representable range of 32-bit signed integers. When processing malformed compressed blocks, operations such as: leaf = pos >> 16; table[(next_symbol << 1)] = 0; bitbuf |= ((inpos[1]<<8)|inpos[0]) << (ULONG_BITS-16 - bitsleft); perform shifts on large values (value << 16), triggering undefined behavior. This corrupts the Huffman decode tables and decompression state. *Impact:* - Crafted CHM files can crash applications using CHMLib by causing failures or illegal memory operations during decompression. - Although direct heap overflows were not observed in this testing, the corrupted decompression state (match_length, match_offset) could under certain inputs lead to out-of-bounds reads or writes. *Proof of Concept:* ASAN_OPTIONS=abort_on_error=1,allocator_may_return_null=0,detect_leaks=0 \ UBSAN_OPTIONS=print_stacktrace=1 \ ./chmextract crafted_overflow_lzx.chm /tmp/out *Observed errors:* lzx.c:663:37: runtime error: left shift of 39074 by 16 places cannot be represented in type 'int' lzx.c:569:25: runtime error: left shift of 53200 by 16 places cannot be represented in type 'int' lzx.c:440:9: runtime error: left shift of 63471 by 16 places cannot be represented in type 'int' _______________________________________________ Sent through the Full Disclosure mailing list https://nmap.org/mailman/listinfo/fulldisclosure Web Archives & RSS: https://seclists.org/fulldisclosure/
Current thread:
- CHMLIB 0.40a Integer Overflow in LZX Decompression of CHMLib Ron E (Sep 15)