strukturag / libde265

Open h.265 video codec implementation.
Other
1.7k stars 457 forks source link

Heap Buffer Overflow in sao.cc #307

Open swirsz opened 2 years ago

swirsz commented 2 years ago

Asan is showing a heap buffer overflow error

Platform: Ubuntu 20.04 Source compiled: November 13, 2021

poc.zip

================================================================= ==4025910==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6130000063b0 at pc 0x000001cc74cf bp 0x7f96cd3f7990 sp 0x7f96cd3f7988 READ of size 1 at 0x6130000063b0 thread T2

0 0x1cc74ce in void apply_sao_internal(de265_image, int, int, slice_segment_header const, int, int, int, unsigned short const, int, unsigned short, int) /src/libde265/libde265/sao.cc:252:28

#1 0x1cc2da4 in apply_sao<unsigned char> /src/libde265/libde265/sao.cc:270:5
#2 0x1cc2da4 in thread_task_sao::work() /src/libde265/libde265/sao.cc:441:9
#3 0x1cfb81d in worker_thread(void*) /src/libde265/libde265/threads.cc:233:11
#4 0x7f96d0cd4608 in start_thread /build/glibc-eX1tMB/glibc-2.31/nptl/pthread_create.c:477:8
#5 0x7f96d0bfb292 in __clone /build/glibc-eX1tMB/glibc-2.31/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Address 0x6130000063b0 is a wild pointer inside of access range of size 0x000000000001. SUMMARY: AddressSanitizer: heap-buffer-overflow /src/libde265/libde265/sao.cc:252:28 in void apply_sao_internal(de265_image, int, int, slice_segment_header const, int, int, int, unsigned short const, int, unsigned short, int) Shadow bytes around the buggy address: 0x0c267fff8c20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8c30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8c40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8c50: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8c60: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa =>0x0c267fff8c70: fa fa fa fa fa fa[fa]fa fa fa fa fa fa fa fa fa 0x0c267fff8c80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8c90: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8ca0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8cb0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c267fff8cc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 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 Thread T2 created by T0 here:

0 0x510c8c in pthread_create /src/llvm-project/compiler-rt/lib/asan/asan_interceptors.cpp:207:3

#1 0x1cfb3c1 in de265_thread_create /src/libde265/libde265/threads.cc:41:96
#2 0x1cfb3c1 in start_thread_pool(thread_pool*, int) /src/libde265/libde265/threads.cc:271:15
#3 0x1c73f43 in decoder_context::start_thread_pool(int) /src/libde265/libde265/decctx.cc:346:3
#4 0x1c6f726 in de265_start_worker_threads /src/libde265/libde265/de265.cc:264:28
#5 0x6ba656 in libde265_new_decoder(void**) /src/libheif/libheif/heif_decoder_libde265.cc:173:3
#6 0x63beb9 in heif::HeifContext::decode_image_planar(unsigned int, std::__1::shared_ptr<heif::HeifPixelImage>&, heif_colorspace, heif_decoding_options const*, bool) const /src/libheif/libheif/heif_context.cc:1086:29
#7 0x63a495 in heif::HeifContext::decode_image_user(unsigned int, std::__1::shared_ptr<heif::HeifPixelImage>&, heif_colorspace, heif_chroma, heif_decoding_options const*) const /src/libheif/libheif/heif_context.cc:1014:15
#8 0x60c15f in heif_decode_image /src/libheif/libheif/heif.cc:917:35
#9 0x6c76bd in TestDecodeImage(heif_context*, heif_image_handle const*, unsigned long) /src/libheif/libheif/file_fuzzer.cc:61:9
#10 0x6c6f97 in LLVMFuzzerTestOneInput /src/libheif/libheif/file_fuzzer.cc:102:5
#11 0x4583c3 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) cxa_noexception.cpp
#12 0x443cd2 in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned long) /src/llvm-project/compiler-rt/lib/fuzzer/FuzzerDriver.cpp:324:6
#13 0x44979a in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) cxa_noexception.cpp
#14 0x4726c2 in main /src/llvm-project/compiler-rt/lib/fuzzer/FuzzerMain.cpp:20:10
#15 0x7f96d0b000b2 in __libc_start_main /build/glibc-eX1tMB/glibc-2.31/csu/../csu/libc-start.c:308:16

==4025910==ABORTING

farindk commented 1 year ago

I was not able to reproduce this on Ubuntu 16.04 and 22.04. If anyone manages to reproduce this at any libde265 version, please let me know the exact setup.