Skip to content

fuzz_eval ASAN heap-buffer-overflow in bignum limb_to_a #412

@gal1ium

Description

@gal1ium

Hi! We found a crashing test case when running the fuzz_eval fuzzing driver.

JS input:

let x = BigInt("1234567890123456777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777776777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777890");
console.log(x|x);

ASAN output:

=================================================================
==3671288==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x618000001c7f at pc 0x0000005c7ca7 bp 0x7ffef5894550 sp 0x7ffef5894548
WRITE of size 1 at 0x618000001c7f thread T0
    #0 0x5c7ca6 in limb_to_a /src/quickjs/quickjs.c:11832:18
    #1 0x5c7ca6 in js_bigint_to_string1 /src/quickjs/quickjs.c:11944:25
    #2 0x5c802d in js_bigint_to_string /src/quickjs/quickjs.c:12815:12
    #3 0x5c802d in js_print_value /src/quickjs/quickjs.c:13518:27
    #4 0x52e714 in JS_PrintValueInternal /src/quickjs/quickjs.c:13634:5
    #5 0x52e714 in JS_PrintValue /src/quickjs/quickjs.c:13646:5
    #6 0x7aa38b in js_print /src/quickjs/quickjs-libc.c:4031:13                                                                                                                                                                                                                                                     
    #7 0x7a9e59 in js_console_log /src/quickjs/quickjs-libc.c:4042:11
    #8 0x4e211f in js_call_c_function /src/quickjs/quickjs.c:16570:19
    #9 0x5308a5 in JS_CallInternal /src/quickjs/quickjs.c:16765:16
    #10 0x53c8ac in JS_CallInternal /src/quickjs/quickjs.c:17177:27
    #11 0x56a261 in JS_CallFree /src/quickjs/quickjs.c:19349:19
    #12 0x56a261 in JS_EvalFunctionInternal /src/quickjs/quickjs.c:35629:19
    #13 0x59348b in __JS_EvalInternal /src/quickjs/quickjs.c:35762:19
    #14 0x56bf91 in JS_EvalInternal /src/quickjs/quickjs.c:35788:11
    #15 0x56c2da in JS_EvalThis /src/quickjs/quickjs.c:35822:11
    #16 0x56c2da in JS_Eval /src/quickjs/quickjs.c:35830:12
    #17 0x4df515 in LLVMFuzzerTestOneInput /src/quickjs/fuzz/fuzz_eval.c:38:19

0x618000001c7f is located 1 bytes to the left of 770-byte region [0x618000001c80,0x618000001f82)
allocated by thread T0 here:
    #0 0x4a1fa6 in __interceptor_malloc /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:69:3
    #1 0x5a5699 in js_def_malloc /src/quickjs/quickjs.c:1672:11
    #2 0x5c6c17 in js_malloc_rt /src/quickjs/quickjs.c:1332:12
    #3 0x5c6c17 in js_malloc /src/quickjs/quickjs.c:1363:11
    #4 0x5c6c17 in js_bigint_to_string1 /src/quickjs/quickjs.c:11919:15
    #5 0x5c802d in js_bigint_to_string /src/quickjs/quickjs.c:12815:12
    #6 0x5c802d in js_print_value /src/quickjs/quickjs.c:13518:27
    #7 0x52e714 in JS_PrintValueInternal /src/quickjs/quickjs.c:13634:5
    #8 0x52e714 in JS_PrintValue /src/quickjs/quickjs.c:13646:5
    #9 0x7aa38b in js_print /src/quickjs/quickjs-libc.c:4031:13
    #10 0x7a9e59 in js_console_log /src/quickjs/quickjs-libc.c:4042:11
    #11 0x4e211f in js_call_c_function /src/quickjs/quickjs.c:16570:19
    #12 0x5308a5 in JS_CallInternal /src/quickjs/quickjs.c:16765:16
    #13 0x53c8ac in JS_CallInternal /src/quickjs/quickjs.c:17177:27
    #14 0x56a261 in JS_CallFree /src/quickjs/quickjs.c:19349:19
    #15 0x56a261 in JS_EvalFunctionInternal /src/quickjs/quickjs.c:35629:19
    #16 0x59348b in __JS_EvalInternal /src/quickjs/quickjs.c:35762:19
    #17 0x56bf91 in JS_EvalInternal /src/quickjs/quickjs.c:35788:11
    #18 0x56c2da in JS_EvalThis /src/quickjs/quickjs.c:35822:11
    #19 0x56c2da in JS_Eval /src/quickjs/quickjs.c:35830:12
    #20 0x4df515 in LLVMFuzzerTestOneInput /src/quickjs/fuzz/fuzz_eval.c:38:19

SUMMARY: AddressSanitizer: heap-buffer-overflow /src/quickjs/quickjs.c:11832:18 in limb_to_a

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions