Integer overflow in p_lx_elf.cpp for i386 UPX (devel branch) #190
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issue #128 was fixed by validating e_phoff, e_shoff, etc. However, it doesn't check for integer overflow correctly: casting
unsigned int
to
unsigned long
works for 64-bit executable butunsigned long
is 32-bit for 32-bit executable. So 32-bit UPX is still vulnerable to integer overflow.A PoC is attached. Compile UPX as 32-bit, and then use it to pack the PoC. You can see UPX crashes immediately, due to reading invalid address.
My PoC is based on the
POC1
file posted in Issue #128 by @hongphipham95. I changede_type
to 0x03,e_shoff
to 0xFFFFE000, ande_shnum
to 0x00FF.This change makes
(unsigned long)e_shoff + e_shnum * sizeof(Elf32_Shdr)
overflow (at src/p_lx_elf.cpp#L262), and thus pass the checking.Simply changing
unsigned long
tounsigned long long
fixes this bug.Version:
ASAN: