# QuickJS Atomics Ops 使用后释放漏洞
## 概述
quickjs-ng的quickjs在版本0.11.0及之前存在一个Use-After-Free漏洞,位于`quickjs.c`文件的Atomics Ops Handler组件中,具体函数未知。该漏洞可被远程利用,目前已有公开的exploit。
## 影响版本
quickjs-ng quickjs ≤ 0.11.0
## 细节
漏洞存在于`quickjs.c`文件中Atomics Ops Handler的某个未知函数内。攻击者通过特定操作可触发Use-After-Free,进而可能导致任意代码执行或其他内存破坏行为。攻击向量为远程。
## 影响
可导致远程代码执行或拒绝服务。该漏洞已有公开利用代码(exploit已公开),存在较高安全风险。建议尽快应用补丁(提交号:ea3e9d77454e8fc9cb3ef3c504e9c16af5a80141)进行修复。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: Heap use after free in js_atomics_op · Issue #1302 · quickjs-ng/quickjs -- 🔗来源链接
标签:exploitissue-tracking
神龙速读:
### 关键信息摘要
**漏洞描述:**
- **问题:** 堆引用后释放 (Heap use after free) 在 `jsAtomicsop` 中。
- **影响:** 任意的 JavaScript 代码可以触发数组缓冲区调整大小,这会导致缓存的指针失效并触发在执行特定原子操作时的释放后使用 (Use-after-Free, UAF)。
- **触发条件:** 通过对 `jsAtomicsop` 的任意调用触发,如 `Atomicsadd`、`Atomicsub`、`Atomicsand`、`Atomicisor`、`Atomicsxor`、`Atomsexchange`、`AtomicscompareExchange`。
**证明概念 (PoC):**
```javascript
const rab = new ArrayBuffer(1024, { maxByteLength: 1024 * 1024 });
const i32 = new Int32Array(rab);
const evil = {
valueOf: () => {
consolelog("resize buffer");
rabresize(0);
return 123;
}
};
Atomicsadd(i32, 0, evil);
```
**asan 输出:**
- 描述了堆引用后释放的问题细节,包括地址、线程、函数调用堆栈等。
- 涉及的具体地址和调用堆栈说明了问题出现的上下文和根因。
**解决状态:**
- 已关闭此问题,标记为已完成。
- 提交了修复用 initiatives 并且添加了相关测试用例。
标题: Fix OOB access in atomic ops by saghul · Pull Request #1303 · quickjs-ng/quickjs · GitHub -- 🔗来源链接
标签:issue-tracking
神龙速读:
- **漏洞描述**: OOB (Out-of-Bounds)访问问题在原子操作中被修复,相关问题编号为#1301和#1302。
- **受影响组件**: 原子操作(atomic ops)在tcc编译器中可能因编译错误而被禁用,具体参考#4871290。
- **解决方案**:
- 在tests.conf中添加特定配置以跳过tcc编译器问题。
- 在测试文件中添加魔法注释以避免tcc引起的误编译。
- **相关讨论**: 提到理想情况下,该修复应提交至https://github.com/tc39/test262,确保所有JavaScript引擎能同步受益。
- **参与者与状态**: 由saghul提交修复,bnoordhuis审查并通过。问题已在两周前解决,相关分支已合并至master。
标题: Fix OOB access in atomic ops · quickjs-ng/quickjs@ea3e9d7 · GitHub -- 🔗来源链接
标签:patch
神龙速读:
- **漏洞类型**: Out-of-Bounds (OOB) access in atomic operations
- **修复提交**: ea3e9d7
- **相关问题**: #1301, #1302
- **影响文件**:
- quickjs.c
- tests.conf
- tests/bug1301.js
- tests/bug1302.js
- **主要变更**:
- 修改了原子操作的边界检查逻辑
- 增加了对恶意`valueOf`方法调整数组大小或脱离数组功能的检测
- **测试用例**:
- bug1301.js 和 bug1302.js 用于验证修复是否有效
标题: Heap use after free in js_atomics_store · Issue #1301 · quickjs-ng/quickjs -- 🔗来源链接
标签:issue-tracking
神龙速读:
```md
### 关键信息概览
**漏洞类型**: Heap use after free (UAF)
**受影响函数**: `js_atomics_store`
**漏洞描述**:
- `js_atomics_store` 调用 `js_atomics_get_ptr`,后者在堆上缓存一个指针。
- 当调用 `JS_ToIntegerFree(...)` 时,其副作用和任意的 JS 代码可以触发数组缓冲区重新调整大小。这会移动缓冲区并释放旧内存,使缓存的指针无效,并在 `atomic_store((__Atomic(uint32_t) *)ptr, v);` 处触发堆使用后释放(UAF)。
**PoC**:
```javascript
const rab = new ArrayBuffer(1024, { maxByteLength: 1024 * 1024 });
const i32 = new Int32Array(rab);
const evil = {
valueOf: () => {
console.log("resize buffer");
rab.resize(0);
return 123;
}
};
Atomics.store(i32, 0, evil);
```
**地址随机化器(ASAN)输出**:
- 内存地址: `0x519000002880`
- 错误类型: `ERROR: AddressSanitizer: heap-use-after-free`
- 函数调用栈:
- `js_atomics_store`
- `JS_CallFunctionValue`
- `JS_ToPrimitiveFree`
- `JS_ToNumberHintFree`
- 更多...
**修复行动**:
- 提交: `94fa71f`
- 修复说明: 修复 `js_atomics_op` 中的 OOB 访问问题
**参与者**:
- mcsky23(报告者)
- saghul(提交修复)
- hramrach(提交测试)
**报告人信用**: mcsky23 (Vlad Ionut Seba)
```
标题: Submit #735538: quickjs-ng quickjs v0.11.0 Use After Free -- 🔗来源链接
标签:third-party-advisory
神龙速读:
### 关键漏洞信息
- **Title**: quickjs-ng quickjs v0.11.0 Use After Free
- **Description**:
- A heap Use-After-Free (UAF) can be triggered in QuickJS-NG in js_atomics_op when converting the user-supplied operand runs arbitrary JS that resizes the underlying Resizable ArrayBuffer, invalidating a cached element pointer before the atomic operation executes. This impacts all APIs implemented via js_atomics_op, including Atomics.add, Atomics.sub, Atomics.and, Atomics.or, Atomics.xor, Atomics.exchange, and Atomics.compareExchange.
- Root cause: js_atomics_op calls js_atomics_get_ptr, which caches a heap pointer (ptr) to the typed array element storage. During JS_ToUint32(ctx, &v32, argv[2]), side effects from arbitrary JS can resize the ArrayBuffer, moving/freeing the old backing store. The cached ptr becomes stale, and the subsequent atomic operation performed through ptr triggers a UAF.
- Affected version: quickjs-ng/quickjs commit 537d004cd22b86373c262528c7e8076ea676996d (tested on 2026-01-05).
- Reproduction and ASAN crash details are documented in: https://github.com/quickjs-ng/quickjs/issues/1302
- Reporter credit: mcsky23 (Vlad Ionut Seba)
- **Source**: https://github.com/quickjs-ng/quickjs/issues/1302
- **User**: mcsky23 (UID 94179)
- **Submission**: 01/09/2026 08:01 PM (10 days ago)
- **Moderation**: 01/18/2026 02:43 PM (9 days later)
- **Status**: Duplicate
- **VulDB entry**: 341737 [quickjs-ng quickjs up to 0.11.0 Atomics Ops quickjs.c use after free]
- **Points**: 0
暂无评论