Closed Bug 1490396 Opened 6 years ago Closed 6 years ago

[libFuzzer] Heap-buffer-overflow [@ ReadSize | Moz2DRenderCallback]

Categories

(Core :: Graphics: WebRender, defect, P1)

defect

Tracking

()

RESOLVED FIXED
mozilla64
Tracking Status
firefox-esr60 --- unaffected
firefox62 --- unaffected
firefox63 --- unaffected
firefox64 --- fixed

People

(Reporter: truber, Assigned: mattwoodrow)

References

(Blocks 1 open bug)

Details

(4 keywords, Whiteboard: [post-critsmash-triage])

Attachments

(1 file)

The following call to wr_moz2d_render_cb causes an input buffer over-read in m-c rev 423bdf7a802b0d302244492b423609187de39f56.

const uint8_t blob_buffer[] = {
  0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF};
uint8_t output_buffer[1973790];
wr_moz2d_render_cb(
  mozilla::wr::ByteSlice { .buffer: blob_buffer, .len: 19 },
  187, 187,
  2147483669, // mozilla:wr::ImageFormat::?
  nullptr, nullptr, nullptr,
  mozilla::wr::MutByteSlice { .buffer: output_buffer, .len: 1973790 });


==21189==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000306d8f at pc 0x7f0801fa8fe6 bp 0x7ffc0d759050 sp 0x7ffc0d759048
READ of size 8 at 0x603000306d8f thread T0
    #0 0x7f0801fa8fe5 in ReadSize /home/truber/src/m/u/gfx/webrender_bindings/Moz2DImageRenderer.cpp:380:7
    #1 0x7f0801fa8fe5 in mozilla::wr::Moz2DRenderCallback(mozilla::Range<unsigned char const>, mozilla::gfx::IntSizeTyped<mozilla::gfx::UnknownUnits>, mozilla::gfx::SurfaceFormat, unsigned short const*, mozilla::wr::TypedPoint2D<unsigned short, mozilla::wr::Tiles> const*, mozilla::wr::TypedRect<unsigned int, mozilla::wr::DevicePixel> const*, mozilla::Range<unsigned char>) /home/truber/src/m/u/gfx/webrender_bindings/Moz2DImageRenderer.cpp:414
    #2 0x7f0801fa3d2c in wr_moz2d_render_cb /home/truber/src/m/u/gfx/webrender_bindings/Moz2DImageRenderer.cpp:473:10
    #3 0x7f080e51772b in testMoz2DRenderCallback(unsigned char const*, unsigned long) /home/truber/src/m/u/gfx/tests/fuzzing/moz2d/TestMoz2D.cpp:89:3
    #4 0x561c28fcb864 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:517:13
    #5 0x561c28fc88f8 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:442:3
    #6 0x561c28fcd041 in fuzzer::Fuzzer::MutateAndTestOne() /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:650:19
    #7 0x561c28fcf045 in fuzzer::Fuzzer::Loop(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, fuzzer::fuzzer_allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:773:5
    #8 0x561c28faf108 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerDriver.cpp:754:6
    #9 0x7f080cfa0301 in mozilla::FuzzerRunner::Run(int*, char***) /home/truber/src/m/u/tools/fuzzing/interface/harness/FuzzerRunner.cpp:60:10
    #10 0x7f080ceb22b5 in XREMain::XRE_mainStartup(bool*) /home/truber/src/m/u/toolkit/xre/nsAppRunner.cpp:3997:35
    #11 0x7f080cec6513 in XREMain::XRE_main(int, char**, mozilla::BootstrapConfig const&) /home/truber/src/m/u/toolkit/xre/nsAppRunner.cpp:4956:12
    #12 0x7f080cec808e in XRE_main(int, char**, mozilla::BootstrapConfig const&) /home/truber/src/m/u/toolkit/xre/nsAppRunner.cpp:5063:21
    #13 0x561c28f0f6fc in do_main /home/truber/src/m/u/browser/app/nsBrowserApp.cpp:233:22
    #14 0x561c28f0f6fc in main /home/truber/src/m/u/browser/app/nsBrowserApp.cpp:315
    #15 0x7f0824a7782f in __libc_start_main /build/glibc-Cl5G7W/glibc-2.23/csu/../csu/libc-start.c:291
    #16 0x561c28e0f038 in _start (/home/truber/src/m/u/obj/ff-asan-release/dist/bin/firefox+0x37038)

0x603000306d8f is located 1 bytes to the left of 19-byte region [0x603000306d90,0x603000306da3)
allocated by thread T0 here:
    #0 0x561c28ed32a8 in __interceptor_malloc (/home/truber/src/m/u/obj/ff-asan-release/dist/bin/firefox+0xfb2a8)
    #1 0x561c28f1081d in moz_xmalloc /home/truber/src/m/u/memory/mozalloc/mozalloc.cpp:70:17
    #2 0x7f080e517674 in operator new[] /home/truber/src/m/u/obj/ff-asan-release/dist/include/mozilla/mozalloc.h:151:12
    #3 0x7f080e517674 in testMoz2DRenderCallback(unsigned char const*, unsigned long) /home/truber/src/m/u/gfx/tests/fuzzing/moz2d/TestMoz2D.cpp:85
    #4 0x561c28fcb864 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:517:13
    #5 0x561c28fc88f8 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:442:3
    #6 0x561c28fcd041 in fuzzer::Fuzzer::MutateAndTestOne() /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:650:19
    #7 0x561c28fcf045 in fuzzer::Fuzzer::Loop(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, fuzzer::fuzzer_allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerLoop.cpp:773:5
    #8 0x561c28faf108 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) /home/truber/src/m/u/tools/fuzzing/libfuzzer/FuzzerDriver.cpp:754:6
    #9 0x7f080cfa0301 in mozilla::FuzzerRunner::Run(int*, char***) /home/truber/src/m/u/tools/fuzzing/interface/harness/FuzzerRunner.cpp:60:10
    #10 0x7f080ceb22b5 in XREMain::XRE_mainStartup(bool*) /home/truber/src/m/u/toolkit/xre/nsAppRunner.cpp:3997:35
    #11 0x7f080cec6513 in XREMain::XRE_main(int, char**, mozilla::BootstrapConfig const&) /home/truber/src/m/u/toolkit/xre/nsAppRunner.cpp:4956:12
    #12 0x7f080cec808e in XRE_main(int, char**, mozilla::BootstrapConfig const&) /home/truber/src/m/u/toolkit/xre/nsAppRunner.cpp:5063:21
    #13 0x561c28f0f6fc in do_main /home/truber/src/m/u/browser/app/nsBrowserApp.cpp:233:22
    #14 0x561c28f0f6fc in main /home/truber/src/m/u/browser/app/nsBrowserApp.cpp:315
    #15 0x7f0824a7782f in __libc_start_main /build/glibc-Cl5G7W/glibc-2.23/csu/../csu/libc-start.c:291

SUMMARY: AddressSanitizer: heap-buffer-overflow /home/truber/src/m/u/gfx/webrender_bindings/Moz2DImageRenderer.cpp:380:7 in ReadSize
Shadow bytes around the buggy address:
  0x0c0680058d60: fa fa fa fa fa fa fa fa fa fa 00 00 00 05 fa fa
  0x0c0680058d70: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c0680058d80: fa fa fd fd fd fd fa fa fa fa fa fa fa fa fa fa
  0x0c0680058d90: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c0680058da0: fa fa fa fa fa fa 00 00 00 05 fa fa fd fd fd fd
=>0x0c0680058db0: fa[fa]00 00 03 fa fa fa fa fa fa fa fa fa fa fa
  0x0c0680058dc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c0680058dd0: fa fa fa fa fa fa fd fd fd fd fa fa fa fa fa fa
  0x0c0680058de0: fa fa fd fd fd fd fa fa fa fa fa fa fa fa fa fa
  0x0c0680058df0: fa fa fa fa fa fa fa fa fa fa fd fd fd fd fa fa
  0x0c0680058e00: fd fd fd fa fa fa 00 00 00 05 fa fa 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
==21189==ABORTING
Priority: -- → P1
Not clear if this affects the actual shipping code, but I'll mark it sec-high to be safe.
Keywords: sec-high
MozReview-Commit-ID: ElIkCKdeGgv
Assignee: nobody → matt.woodrow
Comment on attachment 9010164 [details]
Bug 1490396 - Don't let indexOffset overflow when sanity checking it. r?jrmuizel

Jeff Muizelaar [:jrmuizel] has approved the revision.
Attachment #9010164 - Flags: review+
https://hg.mozilla.org/mozilla-central/rev/d81fa4aed4e2
Group: gfx-core-security → core-security-release
Status: NEW → RESOLVED
Closed: 6 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla64
Flags: qe-verify-
Whiteboard: [post-critsmash-triage]
Group: core-security-release
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: