Jiri Danek created PROTON-1359:
----------------------------------

             Summary: heap-buffer-overflow in pn_decoder_readf32 when invoking 
pn_message_decode
                 Key: PROTON-1359
                 URL: https://issues.apache.org/jira/browse/PROTON-1359
             Project: Qpid Proton
          Issue Type: Bug
          Components: proton-c
    Affects Versions: 0.16.0
            Reporter: Jiri Danek


{noformat}
$ nc -l 5672 < 
crafted_from_minimized-from-ac1dd1edf2357b0e4782088fa2bf80fdde832a43
$ ./libuv_receive -a 127.0.0.1:5672/jms.queue.example 
Segmentation fault (core dumped)

(gdb) thread apply all bt
<snip>
#5209 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5210 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972817 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5211 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5212 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972897 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5213 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5214 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972917 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5215 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5216 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972997 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5217 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5218 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972a17 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5219 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5220 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972a97 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5221 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5222 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972b17 "\377\200\304\t\002")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5223 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5224 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972b97 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5225 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5226 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972c17 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5227 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5228 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972c97 "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5229 0x00007f36d947a651 in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:474
#5230 0x00007f36d947a786 in pni_decoder_decode_type (decoder=0x209c970, 
data=0x209c480, code=0x7ffd99972e0d "")
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:458
#5231 0x00007f36d947b2ac in pni_decoder_decode_value (decoder=0x209c970, 
data=0x209c480, code=240 '\360') at 
/home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:395
#5232 0x00007f36d947a67a in pni_decoder_single (decoder=0x209c970, 
data=0x209c480) at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:476
#5233 0x00007f36d947a5b8 in pn_decoder_decode (decoder=0x209c970, src=0x6095c0 
<decode_message.buffer> "\360\001", size=2, dst=0x209c480)
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/decoder.c:490
#5234 0x00007f36d947956d in pn_data_decode (data=0x209c480, bytes=0x6095c0 
<decode_message.buffer> "\360\001", size=2)
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/codec.c:1437
#5235 0x00007f36d94925fb in pn_message_decode (msg=0x209bc80, bytes=0x6095c0 
<decode_message.buffer> "\360\001", size=2)
        at /home/jdanek/Bin/qpid-proton/proton-c/src/core/message.c:635
#5236 0x0000000000404742 in decode_message (dlv=0x208a9b0) at 
/home/jdanek/Bin/qpid-proton/examples/c/proactor/receive.c:73
#5237 0x00000000004044c6 in handle (app=0x7ffd99973288, event=0x20968e0) at 
/home/jdanek/Bin/qpid-proton/examples/c/proactor/receive.c:106
#5238 0x00000000004042e3 in main (argc=3, argv=0x7ffd99973ba8) at 
/home/jdanek/Bin/qpid-proton/examples/c/proactor/receive.c:197
{noformat}

I created the input file used in Steps to Reproduce by first finding an input 
that causes memory error when given to {{pn_message_decode}} and then putting 
it as a payload of AMQP frame. The memory issue in {{pn_message decode}} when 
decoding data in {{minimized-from-ac1dd1edf2357b0e4782088fa2bf80fdde832a43}} is

{noformat}
==31043==ERROR: AddressSanitizer: heap-buffer-overflow on address 
0x602000000035 at pc 0x7ff26f426ba1 bp 0x7fff7d5fcf30 sp 0x7fff7d5fcf28
READ of size 1 at 0x602000000035 thread T0
        #0 0x7ff26f426ba0 in pn_decoder_readf32 
/home/jdanek/Work/qpid-proton/proton-c/src/core/decoder.c:80:26
        #1 0x7ff26f426ba0 in pni_decoder_decode_value 
/home/jdanek/Work/qpid-proton/proton-c/src/core/decoder.c:377
        #2 0x7ff26f423369 in pni_decoder_single 
/home/jdanek/Work/qpid-proton/proton-c/src/core/decoder.c:476:9
        #3 0x7ff26f423369 in pn_decoder_decode 
/home/jdanek/Work/qpid-proton/proton-c/src/core/decoder.c:490
        #4 0x7ff26f41fde2 in pn_data_decode 
/home/jdanek/Work/qpid-proton/proton-c/src/core/codec.c:1437:10
        #5 0x7ff26f468f3c in pn_message_decode 
/home/jdanek/Work/qpid-proton/proton-c/src/core/message.c:635:20
        #6 0x4f5abf in LLVMFuzzerTestOneInput 
/home/jdanek/Work/qpid-proton/proton-c/src/tests/fuzz_message_decode.c:8:15
        #7 0x4fdd97 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, 
unsigned long) /home/jdanek/Work/./Fuzzer/FuzzerLoop.cpp:515:13
        #8 0x4fdf85 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned 
long) /home/jdanek/Work/./Fuzzer/FuzzerLoop.cpp:469:3
        #9 0x4f5c7c in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, 
unsigned long) /home/jdanek/Work/./Fuzzer/FuzzerDriver.cpp:272:6
        #10 0x4f7a1c in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned 
char const*, unsigned long)) /home/jdanek/Work/./Fuzzer/FuzzerDriver.cpp:482:9
        #11 0x4f5b70 in main /home/jdanek/Work/./Fuzzer/FuzzerMain.cpp:20:10
        #12 0x7ff26d875290 in __libc_start_main (/usr/lib/libc.so.6+0x20290)
        #13 0x4234a9 in _start 
(/home/jdanek/Work/qpid-proton/build/proton-c/src/tests/fuzz_message_decode+0x4234a9)

0x602000000035 is located 3 bytes to the right of 2-byte region 
[0x602000000030,0x602000000032)
allocated by thread T0 here:
        #0 0x4c9cac in __interceptor_malloc 
(/home/jdanek/Work/qpid-proton/build/proton-c/src/tests/fuzz_message_decode+0x4c9cac)
        #1 0x7ff26edc8a47 in operator new(unsigned long) 
/build/gcc/src/gcc/libstdc++-v3/libsupc++/new_op.cc:50
        #2 0x4fdf85 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned 
long) /home/jdanek/Work/./Fuzzer/FuzzerLoop.cpp:469:3
        #3 0x4f5c7c in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, 
unsigned long) /home/jdanek/Work/./Fuzzer/FuzzerDriver.cpp:272:6
        #4 0x4f7a1c in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned 
char const*, unsigned long)) /home/jdanek/Work/./Fuzzer/FuzzerDriver.cpp:482:9
        #5 0x4f5b70 in main /home/jdanek/Work/./Fuzzer/FuzzerMain.cpp:20:10
        #6 0x7ff26d875290 in __libc_start_main (/usr/lib/libc.so.6+0x20290)

SUMMARY: AddressSanitizer: heap-buffer-overflow 
/home/jdanek/Work/qpid-proton/proton-c/src/core/decoder.c:80:26 in 
pn_decoder_readf32
Shadow bytes around the buggy address:
  0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa 02 fa fa fa[02]fa fa fa 00 00 fa fa 00 00
  0x0c047fff8010: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
  0x0c047fff8020: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
  0x0c047fff8030: fa fa 00 00 fa fa 00 00 fa fa 00 00 fa fa 00 00
  0x0c047fff8040: fa fa 00 00 fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: 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
==31043==ABORTING
{noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to