Skip to content

Conversation

@oss-patch
Copy link

[Warning] This PR is generated by AI
Here is the structured pull request description:


  1. PR Title: Fix for Heap-Use-After-Free Vulnerability in QuickJS - crash-e12fe074e2b662d65aac5ebf6c5e0cfe3735ff62

  2. PR Description:

    • Bug Type: Heap-Use-After-Free
    • Summary: A vulnerability in QuickJS was identified where a heap-use-after-free occurred during the build_backtrace process. This issue arose because the current_exception object was accessed after being freed. This could lead to undefined behavior, crashes, or memory corruption.
    • Fix Summary: The patch resolves the issue by duplicating the current_exception object before it is passed to build_backtrace. This ensures that the original object is not prematurely freed during garbage collection processes. The duplicated object is properly freed after its use, preventing memory leaks. This fix improves the security and stability of QuickJS by ensuring safe memory management during exception handling.
  3. Sanitizer Report Summary: The sanitizer detected a heap-use-after-free error at /quickjs.c:5243:13 within the find_own_property function. The root cause was an attempt to access the current_exception object after it was freed during garbage collection. This issue propagated through multiple functions, resulting in undefined behavior.

  4. Full Sanitizer Report:

    ==47479==ERROR: AddressSanitizer: heap-use-after-free on address 0x50700035d1f8 at pc 0x55df7dd330c1 bp 0x7ffd6447c030 sp 0x7ffd6447c028
    READ of size 8 at 0x50700035d1f8 thread T0
        #0 0x55df7dd330c0 in find_own_property /root/quickjs.c:5243:13
        #1 0x55df7dd330c0 in JS_DefineProperty /root/quickjs.c:9078:11
        #2 0x55df7dd6aef4 in JS_DefinePropertyValue /root/quickjs.c:9369:11
        #3 0x55df7dd6aef4 in build_backtrace /root/quickjs.c:6612:5
        #4 0x55df7dd62f28 in JS_CallInternal /root/quickjs.c:18662:9
        #5 0x55df7ddd3608 in async_func_resume /root/quickjs.c:18959:15
        #6 0x55df7de1c06f in js_async_function_resume /root/quickjs.c:19232:16
        #7 0x55df7dd86f4b in js_async_function_call /root/quickjs.c:19326:5
        #8 0x55df7ddde250 in js_execute_sync_module /root/quickjs.c:28913:19
        #9 0x55df7dddd49d in js_inner_module_evaluation /root/quickjs.c:29025:13
        #10 0x55df7dd7101b in js_evaluate_module /root/quickjs.c:29072:9
        #11 0x55df7dd7101b in JS_EvalFunctionInternal /root/quickjs.c:34411:19
        #12 0x55df7dd7087a in JS_EvalFunction /root/quickjs.c:34425:12
        #13 0x55df7dcfaea7 in LLVMFuzzerTestOneInput /root/fuzz/fuzz_compile.c:81:11
        ...
    SUMMARY: AddressSanitizer
    
  5. Files Modified:

    • quickjs.c
    --- a/quickjs.c
    +++ b/quickjs.c
    @@ -18662,7 +18662,12 @@ exception:
        if (is_backtrace_needed(ctx, rt->current_exception)) {
            /* add the backtrace information now (it is not done
               before if the exception happens in a bytecode
               operation */
            sf->cur_pc = pc;
    -        build_backtrace(ctx, rt->current_exception, NULL, 0, 0);
    +        JSValue exception_dup = JS_DupValue(ctx, rt->current_exception);
    +        if (!JS_IsNull(exception_dup)) {
    +            build_backtrace(ctx, exception_dup, NULL, 0, 0);
    +            /* Free the duplicate to avoid leaks */
    +            JS_FreeValue(ctx, exception_dup);
    +        }
        }
        if (!JS_IsUncatchableError(ctx, rt->current_exception)) {
            while (sp > stack_buf) {
  6. Patch Validation: The patch has been validated using the provided PoC (crash-e12fe074e2b662d65aac5ebf6c5e0cfe3735ff62.bin). The heap-use-after-free issue is no longer occurring, and no new issues were introduced. The program remains stable and secure after applying the patch.

  7. Links:


This pull request addresses the identified vulnerability and enhances the reliability of the QuickJS program. Please review the patch for further steps.

@bellard
Copy link
Owner

bellard commented Mar 13, 2025

commited

@bellard bellard closed this Mar 13, 2025
zenHeart pushed a commit to zenHeart/quickjs that referenced this pull request Mar 25, 2025
* Fix member accesses for non-decimal numeric literals
    e.g. 0x0.a should return undefined, not SyntaxError.
* Remove ineffective non-decimal float parsing code and redundant checks on `is_float && radix != 10`
    (The code already wasn't doing anything because of the `is_float` check.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants