warmcat / libwebsockets

canonical libwebsockets.org networking library

Home Page:https://libwebsockets.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OOB (buffer overflow or buffer underflow) is found in lecp.c

iwashiira opened this issue · comments

Our fuzzer found buffer overflow or buffer underflow in lecp.c in the current main(1e0953f).

The location of the buffer where OOB occurs depends on the memory area where the lecp_ctx structure is stored.
Whether overflow or underflow occurs depends on the endian.

Following is an output of ASAN.
vuln34 is in vuln34.zip

$ cat vuln34 | libwebsockets-test-lecp
[2024/05/29 09:56:54:1159] N: libwebsockets-test-lecp  (C) 2017 - 2021 andy@warmcat.com
[2024/05/29 09:56:54:1161] N:   usage: cat my.cbor | libwebsockets-test-lecp

[2024/05/29 09:56:54:1161] N: LECPCB_CONSTRUCTED: path  match 0 statckp 0
[2024/05/29 09:56:54:1161] N: LECPCB_VAL_NUM_UINT: path  match 0 statckp 0
[2024/05/29 09:56:54:1162] N:    value 0
[2024/05/29 09:56:54:1162] N: LECPCB_VAL_NUM_UINT: path  match 0 statckp 0
[2024/05/29 09:56:54:1162] N:    value 0
[2024/05/29 09:56:54:1162] N: LECPCB_ARRAY_START: path [] match 0 statckp 2
[2024/05/29 09:56:54:1162] N: LECPCB_ARRAY_END: path [] match 0 statckp 2
[2024/05/29 09:56:54:1162] N: LECPCB_VAL_NUM_UINT: path  match 0 statckp 0
[2024/05/29 09:56:54:1163] N:    value 0
[2024/05/29 09:56:54:1163] N: LECPCB_VAL_NUM_INT: path  match 0 statckp 0
[2024/05/29 09:56:54:1163] N:    value -10
[2024/05/29 09:56:54:1163] N: LECPCB_VAL_NUM_UINT: path  match 0 statckp 0
[2024/05/29 09:56:54:1163] N:    value 0
[2024/05/29 09:56:54:1163] N: LECPCB_OBJECT_START: path . match 0 statckp 1
[2024/05/29 09:56:54:1163] N:  LECPCB_OBJECT_START: path .. match 0 statckp 2
[2024/05/29 09:56:54:1163] N:   LECPCB_OBJECT_START: path ... match 0 statckp 3
[2024/05/29 09:56:54:1164] N:    LECPCB_OBJECT_START: path .... match 0 statckp 4
[2024/05/29 09:56:54:1164] N:     LECPCB_OBJECT_START: path ..... match 0 statckp 5
[2024/05/29 09:56:54:1164] N:      LECPCB_OBJECT_START: path ...... match 0 statckp 6
[2024/05/29 09:56:54:1164] N:       LECPCB_OBJECT_START: path ....... match 0 statckp 7
[2024/05/29 09:56:54:1164] N:        LECPCB_OBJECT_START: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1164] N:         LECPCB_OBJECT_START: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1165] N:          LECPCB_OBJECT_START: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1165] N:           LECPCB_OBJECT_START: path ........... match 0 statckp 11
[2024/05/29 09:56:54:1165] N:            LECPCB_OBJECT_START: path ............ match 0 statckp 12
[2024/05/29 09:56:54:1167] N:            LECPCB_OBJECT_START: path ............. match 0 statckp 13
[2024/05/29 09:56:54:1167] N:            LECPCB_OBJECT_START: path .............. match 0 statckp 14
[2024/05/29 09:56:54:1167] N:            LECPCB_OBJECT_START: path ............... match 0 statckp 15
[2024/05/29 09:56:54:1167] N:            LECPCB_OBJECT_START: path ................ match 0 statckp 16
[2024/05/29 09:56:54:1167] N:            LECPCB_OBJECT_START: path ................. match 0 statckp 17
[2024/05/29 09:56:54:1168] N:            LECPCB_OBJECT_START: path .................. match 0 statckp 18
[2024/05/29 09:56:54:1168] N:            LECPCB_OBJECT_START: path ................... match 0 statckp 19
[2024/05/29 09:56:54:1168] N:            LECPCB_OBJECT_START: path .................... match 0 statckp 20
[2024/05/29 09:56:54:1168] N:            LECPCB_VAL_NUM_INT: path .................... match 0 statckp 20
[2024/05/29 09:56:54:1168] N:               value -13
[2024/05/29 09:56:54:1169] N:            LECPCB_VAL_NUM_UINT: path .................... match 0 statckp 20
[2024/05/29 09:56:54:1169] N:               value 437918269
[2024/05/29 09:56:54:1169] N:            LECPCB_VAL_NUM_UINT: path .................... match 0 statckp 20
[2024/05/29 09:56:54:1169] N:               value 454709612
[2024/05/29 09:56:54:1169] N:            LECPCB_VAL_NUM_UINT: path .................... match 0 statckp 20
[2024/05/29 09:56:54:1170] N:               value 1
[2024/05/29 09:56:54:1171] N:           LECPCB_OBJECT_END: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1171] N:           LECPCB_VAL_NUM_UINT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1171] N:              value 1
[2024/05/29 09:56:54:1172] N:           LECPCB_VAL_NUM_UINT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1172] N:              value 446865952
[2024/05/29 09:56:54:1174] N:           LECPCB_VAL_NUM_INT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1175] N:              value -1
[2024/05/29 09:56:54:1175] N:          LECPCB_OBJECT_END: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1175] N:          LECPCB_VAL_NUM_INT: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1175] N:             value -1
[2024/05/29 09:56:54:1175] N:          LECPCB_VAL_NUM_INT: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1175] N:             value -1
[2024/05/29 09:56:54:1176] N:          LECPCB_VAL_NUM_INT: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1176] N:             value -1
[2024/05/29 09:56:54:1176] N:         LECPCB_OBJECT_END: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1176] N:         LECPCB_VAL_NUM_INT: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1177] N:            value -1
[2024/05/29 09:56:54:1177] N:         LECPCB_VAL_NUM_INT: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1177] N:            value -1
[2024/05/29 09:56:54:1177] N:         LECPCB_VAL_NUM_INT: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1177] N:            value -1
[2024/05/29 09:56:54:1177] N:        LECPCB_OBJECT_END: path ....... match 0 statckp 7
[2024/05/29 09:56:54:1178] N:        LECPCB_VAL_NUM_INT: path ....... match 0 statckp 7
[2024/05/29 09:56:54:1178] N:           value -1
[2024/05/29 09:56:54:1178] N:        LECPCB_VAL_NUM_INT: path ....... match 0 statckp 7
[2024/05/29 09:56:54:1178] N:           value -1
[2024/05/29 09:56:54:1179] N:        LECPCB_VAL_NUM_INT: path ....... match 0 statckp 7
[2024/05/29 09:56:54:1179] N:           value -1
[2024/05/29 09:56:54:1179] N:       LECPCB_OBJECT_END: path ...... match 0 statckp 6
[2024/05/29 09:56:54:1179] N:       LECPCB_VAL_NUM_INT: path ...... match 0 statckp 6
[2024/05/29 09:56:54:1179] N:          value -1
[2024/05/29 09:56:54:1180] N:       LECPCB_VAL_NUM_INT: path ...... match 0 statckp 6
[2024/05/29 09:56:54:1180] N:          value -1
[2024/05/29 09:56:54:1180] N:       LECPCB_VAL_NUM_INT: path ...... match 0 statckp 6
[2024/05/29 09:56:54:1180] N:          value -1
[2024/05/29 09:56:54:1181] N:      LECPCB_OBJECT_END: path ..... match 0 statckp 5
[2024/05/29 09:56:54:1181] N:      LECPCB_VAL_NUM_INT: path ..... match 0 statckp 5
[2024/05/29 09:56:54:1181] N:         value -1
[2024/05/29 09:56:54:1181] N:      LECPCB_VAL_NUM_INT: path ..... match 0 statckp 5
[2024/05/29 09:56:54:1181] N:         value -1
[2024/05/29 09:56:54:1182] N:      LECPCB_VAL_NUM_INT: path ..... match 0 statckp 5
[2024/05/29 09:56:54:1182] N:         value -1
[2024/05/29 09:56:54:1182] N:     LECPCB_OBJECT_END: path .... match 0 statckp 4
[2024/05/29 09:56:54:1182] N:     LECPCB_VAL_NUM_INT: path .... match 0 statckp 4
[2024/05/29 09:56:54:1182] N:        value -1
[2024/05/29 09:56:54:1183] N:     LECPCB_VAL_NUM_INT: path .... match 0 statckp 4
[2024/05/29 09:56:54:1183] N:        value -1
[2024/05/29 09:56:54:1183] N:     LECPCB_VAL_NUM_INT: path .... match 0 statckp 4
[2024/05/29 09:56:54:1183] N:        value -1
[2024/05/29 09:56:54:1183] N:    LECPCB_OBJECT_END: path ... match 0 statckp 3
[2024/05/29 09:56:54:1183] N:    LECPCB_VAL_NUM_INT: path ... match 0 statckp 3
[2024/05/29 09:56:54:1184] N:       value -1
[2024/05/29 09:56:54:1184] N:    LECPCB_VAL_NUM_INT: path ... match 0 statckp 3
[2024/05/29 09:56:54:1184] N:       value -1
[2024/05/29 09:56:54:1184] N:    LECPCB_VAL_NUM_INT: path ... match 0 statckp 3
[2024/05/29 09:56:54:1185] N:       value -1
[2024/05/29 09:56:54:1185] N:   LECPCB_OBJECT_END: path .. match 0 statckp 2
[2024/05/29 09:56:54:1185] N:   LECPCB_VAL_NUM_INT: path .. match 0 statckp 2
[2024/05/29 09:56:54:1185] N:      value -1
[2024/05/29 09:56:54:1186] N:   LECPCB_VAL_NUM_INT: path .. match 0 statckp 2
[2024/05/29 09:56:54:1186] N:      value -1
[2024/05/29 09:56:54:1186] N:   LECPCB_VAL_NUM_INT: path .. match 0 statckp 2
[2024/05/29 09:56:54:1186] N:      value -1
[2024/05/29 09:56:54:1186] N:  LECPCB_OBJECT_END: path . match 0 statckp 1
[2024/05/29 09:56:54:1187] N:  LECPCB_VAL_NUM_INT: path . match 0 statckp 1
[2024/05/29 09:56:54:1187] N:     value -1
[2024/05/29 09:56:54:1187] N:  LECPCB_VAL_NUM_INT: path . match 0 statckp 1
[2024/05/29 09:56:54:1187] N:     value -1
[2024/05/29 09:56:54:1187] N:  LECPCB_VAL_NUM_INT: path . match 0 statckp 1
[2024/05/29 09:56:54:1188] N:     value -1
[2024/05/29 09:56:54:1188] N: LECPCB_OBJECT_END: path  match 0 statckp 0
[2024/05/29 09:56:54:1188] N: LECPCB_VAL_NUM_INT: path  match 0 statckp 0
[2024/05/29 09:56:54:1188] N:    value -1
[2024/05/29 09:56:54:1188] N: LECPCB_VAL_NUM_INT: path  match 0 statckp 0
[2024/05/29 09:56:54:1189] N:    value -1
[2024/05/29 09:56:54:1189] N: LECPCB_OBJECT_START: path . match 0 statckp 1
[2024/05/29 09:56:54:1189] N:  LECPCB_OBJECT_START: path .. match 0 statckp 2
[2024/05/29 09:56:54:1189] N:   LECPCB_OBJECT_START: path ... match 0 statckp 3
[2024/05/29 09:56:54:1189] N:    LECPCB_OBJECT_START: path .... match 0 statckp 4
[2024/05/29 09:56:54:1190] N:     LECPCB_OBJECT_START: path ..... match 0 statckp 5
[2024/05/29 09:56:54:1190] N:      LECPCB_OBJECT_START: path ...... match 0 statckp 6
[2024/05/29 09:56:54:1190] N:       LECPCB_OBJECT_START: path ....... match 0 statckp 7
[2024/05/29 09:56:54:1190] N:        LECPCB_OBJECT_START: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1191] N:         LECPCB_OBJECT_START: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1191] N:          LECPCB_OBJECT_START: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1191] N:           LECPCB_VAL_NUM_INT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1191] N:              value -17
[2024/05/29 09:56:54:1191] N:           LECPCB_VAL_BLOB_START: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1192] N:           LECPCB_VAL_BLOB_END: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1192] N:
[2024/05/29 09:56:54:1192] N: 0000: 48 A2 A2 02 A2 A2 A2 6A                            H......j
[2024/05/29 09:56:54:1192] N:
[2024/05/29 09:56:54:1193] N:
[2024/05/29 09:56:54:1193] N:           LECPCB_VAL_STR_START: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1193] N:           LECPCB_VAL_STR_END: path .........jjjjjjjjjj match 0 statckp 19
[2024/05/29 09:56:54:1193] N:              value 'jjjjjjjjjj'
[2024/05/29 09:56:54:1194] N:           LECPCB_VAL_STR_START: path .........jjjjjjjjjj match 0 statckp 19
[2024/05/29 09:56:54:1194] N:           LECPCB_VAL_STR_END: path .........jjjjjjjjjj match 0 statckp 19
[2024/05/29 09:56:54:1194] N:              value 'jjjjjjj�'
[2024/05/29 09:56:54:1194] N:          LECPCB_OBJECT_END: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1194] N:          LECPCB_OBJECT_START: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1195] N:           LECPCB_VAL_NUM_INT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1195] N:              value -17
[2024/05/29 09:56:54:1195] N:           LECPCB_VAL_NUM_INT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1195] N:              value -17
[2024/05/29 09:56:54:1195] N:           LECPCB_VAL_NUM_UINT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1196] N:              value 2
[2024/05/29 09:56:54:1196] N:           LECPCB_VAL_NUM_UINT: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1196] N:              value 2
[2024/05/29 09:56:54:1196] N:          LECPCB_OBJECT_END: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1196] N:          LECPCB_VAL_NUM_UINT: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1196] N:             value 2
[2024/05/29 09:56:54:1197] N:          LECPCB_VAL_NUM_UINT: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1197] N:             value 2
[2024/05/29 09:56:54:1197] N:         LECPCB_OBJECT_END: path ........ match 0 statckp 8
[2024/05/29 09:56:54:1197] N:         LECPCB_OBJECT_START: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1197] N:          LECPCB_TAG_START: path ......... match 0 statckp 9
[2024/05/29 09:56:54:1198] N: LECPCB_TAG_START: 1
[2024/05/29 09:56:54:1198] N:           LECPCB_OBJECT_START: path .......... match 0 statckp 10
[2024/05/29 09:56:54:1198] N:            LECPCB_OBJECT_START: path ........... match 0 statckp 11
[2024/05/29 09:56:54:1198] N:            LECPCB_OBJECT_START: path ............ match 0 statckp 12
[2024/05/29 09:56:54:1199] N:            LECPCB_OBJECT_START: path ............. match 0 statckp 13
[2024/05/29 09:56:54:1199] N: okay (-1)
AddressSanitizer:DEADLYSIGNAL
=================================================================
==31073==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x563814de8543 bp 0x7ffe4c04df70 sp 0x7ffe4c04df60 T0)
==31073==The signal is caused by a READ memory access.
==31073==Hint: this fault was caused by a dereference of a high value address (see register values below).  Dissassemble the provided pc to learn which register was used.
    #0 0x563814de8543 in lecp_destruct /home/vagrant/resear/for_build/lib/misc/lecp.c:78
    #1 0x563814de2e5a in main test-apps/test-lecp.c:167
    #2 0x7f246f948d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #3 0x7f246f948e3f in __libc_start_main_impl ../csu/libc-start.c:392
    #4 0x563814de2224 in _start (/home/vagrant/resear/for_build/libwebsockets-test-lecp+0xc224)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /home/vagrant/resear/for_build/lib/misc/lecp.c:78 in lecp_destruct
==31073==ABORTING

It is caused by these line.

if (ctx->be)
*ctx->collect_tgt++ = c;
else
*ctx->collect_tgt-- = c;

There is no check on the range of *ctx->collect_tgt, so it goes beyond the lecp_item structure and destroys the lecp_ctx structure.
In the case of little endian, buffer underflow occurs and the pointer to the cb callback function in _lecp_parsing_stack is overwritten. This is the cause of the PoC crash,
Also, if lecp_ctx is taken to the stack as in this case, there is a danger of bypassing stack canary and executing ROP.

In the case of big endian, buffer overflow will occur, and by overwriting ctx->be in this BOF, it can be changed to cause buffer underflow as in the case of little endian.

Ricerca Security, Inc.