Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Heap-based buffer overflow in CdtmLoader::load() #86

Closed
fcambus opened this issue Aug 6, 2019 · 1 comment
Closed

Heap-based buffer overflow in CdtmLoader::load() #86

fcambus opened this issue Aug 6, 2019 · 1 comment

Comments

@fcambus
Copy link
Contributor

fcambus commented Aug 6, 2019

Hi,

While fuzzing AdPlug with American Fuzzy Lop, I found a heap-based buffer overflow in CdtmLoader::load(), in src/dtm.cpp L101.

Attaching a reproducer (gzipped so GitHub accepts it): test01.dtm.gz

=================================================================
==5873==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x621000001384 at pc 0x7fcee873f465 bp 0x7fff110e4d70 sp 0x7fff110e4d68
WRITE of size 1 at 0x621000001384 thread T0
    #0 0x7fcee873f464 in CdtmLoader::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, CFileProvider const&) /home/fcambus/adplug/src/dtm.cpp:101:40
    #1 0x7fcee86e91d5 in CAdPlug::factory(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Copl*, CPlayers const&, CFileProvider const&) /home/fcambus/adplug/src/adplug.cpp:169:10
    #2 0x4fcd62 in play(char const*, Player*, int) /home/fcambus/adplay-unix/src/adplay.cc:309:11
    #3 0x4fbaf4 in main /home/fcambus/adplay-unix/src/adplay.cc:544:5
    #4 0x7fcee7f2709a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a)
    #5 0x41f759 in _start (/home/fcambus/reps/adplay+0x41f759)

0x621000001384 is located 4 bytes to the right of 4736-byte region [0x621000000100,0x621000001380)
allocated by thread T0 here:
    #0 0x4f67e2 in operator new(unsigned long) (/home/fcambus/reps/adplay+0x4f67e2)
    #1 0x7fcee873e727 in CdtmLoader::factory(Copl*) /home/fcambus/adplug/src/dtm.cpp:32:10
    #2 0x7fcee86e911d in CAdPlug::factory(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Copl*, CPlayers const&, CFileProvider const&) /home/fcambus/adplug/src/adplug.cpp:168:10
    #3 0x4fcd62 in play(char const*, Player*, int) /home/fcambus/adplay-unix/src/adplay.cc:309:11
    #4 0x4fbaf4 in main /home/fcambus/adplay-unix/src/adplay.cc:544:5
    #5 0x7fcee7f2709a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2409a)

SUMMARY: AddressSanitizer: heap-buffer-overflow /home/fcambus/adplug/src/dtm.cpp:101:40 in CdtmLoader::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, CFileProvider const&)
Shadow bytes around the buggy address:
  0x0c427fff8220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c427fff8230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c427fff8240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c427fff8250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c427fff8260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c427fff8270:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c427fff8280: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c427fff8290: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c427fff82a0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0c427fff82b0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0c427fff82c0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==5873==ABORTING
@fcambus
Copy link
Contributor Author

fcambus commented Aug 6, 2019

This issue has been assigned CVE-2019-14691.

miller-alex added a commit to miller-alex/adplug that referenced this issue Apr 3, 2020
While fuzzing AdPlug with American Fuzzy Lop, Frederic Cambus
found several memory issues and reported them on github. Hook
up the reproducers he provided as test cases in stresstest.cpp.
This includes tests for the following github issues:

* Issue adplug#85 ("Heap-based buffer overflow in
  CxadbmfPlayer::__bmf_convert_stream()")
* Issue adplug#86 ("Heap-based buffer overflow in CdtmLoader::load()")
* Issue adplug#87 ("Heap-based buffer overflow in CmkjPlayer::load()")
* Issue adplug#88 ("Multiple heap-based buffer overflows in Ca2mLoader::load()")
* Issue adplug#89 ("Multiple heap-based buffer overflows in CradLoader::load()")
* Issue adplug#90 ("Multiple heap-based buffer overflows in CmtkLoader::load()")
* Issue adplug#91 ("Double free in Cu6mPlayer::~Cu6mPlayer()")

Co-authored-by: Frederic Cambus <fred@statdns.com>
Bug: adplug#85
Bug: adplug#86
Bug: adplug#87
Bug: adplug#88
Bug: adplug#89
Bug: adplug#90
Bug: adplug#91
miller-alex added a commit to miller-alex/adplug that referenced this issue Apr 3, 2020
There are several issues when loading .dtm files which can lead
to invalid memory accesses. This patch fixes the following:

* In CdtmLoader::load(), ensure that title and author strings
  are properly terminated to avoid out-of-bounds reads.
* Check that the number of instruments is valid. This avoids a
  heap-based buffer overflow (see issue adplug#86).
* Reading the description string could overflow a stack buffer
  by 1 byte and write past the end of the array into an adjacent
  class member (which is only initialized later). Get rid of the
  stack buffer and truncate the description if necessary.
* Fail loading when an error is detected while trying to read
  data from the file or while decoding RLE data.
* Check the argument of CdtmLoader::getinstrument() to avoid
  out-of-bound accesses.

This fixes CVE-2019-14691.

Fixes: adplug#86
Malvineous pushed a commit that referenced this issue May 11, 2020
While fuzzing AdPlug with American Fuzzy Lop, Frederic Cambus
found several memory issues and reported them on github. Hook
up the reproducers he provided as test cases in stresstest.cpp.
This includes tests for the following github issues:

* Issue #85 ("Heap-based buffer overflow in
  CxadbmfPlayer::__bmf_convert_stream()")
* Issue #86 ("Heap-based buffer overflow in CdtmLoader::load()")
* Issue #87 ("Heap-based buffer overflow in CmkjPlayer::load()")
* Issue #88 ("Multiple heap-based buffer overflows in Ca2mLoader::load()")
* Issue #89 ("Multiple heap-based buffer overflows in CradLoader::load()")
* Issue #90 ("Multiple heap-based buffer overflows in CmtkLoader::load()")
* Issue #91 ("Double free in Cu6mPlayer::~Cu6mPlayer()")

Co-authored-by: Frederic Cambus <fred@statdns.com>
Bug: #85
Bug: #86
Bug: #87
Bug: #88
Bug: #89
Bug: #90
Bug: #91
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants