
Educational lab demonstrating JavaScript expression sandbox escape techniques and patch evolution through multiple vulnerable sandbox versions, with payloads and AST analysis.
一个用于演示 JavaScript 表达式沙箱逃逸与补丁演进 的最小化实验环境。
通过多个版本的 sandbox,实现从:
完全可逃逸 → 修补 this → 再修补 destructuring
同时保留新的绕过方式,帮助理解真实世界中漏洞与补丁的博弈过程。
.
├── payload.js # 各类攻击 payload
├── sandbox_v0.js # 原始易受攻击版本
├── sandbox_v1.js # 修复 this 链
├── sandbox_v2.js # 再修复 destructuring
我们希望模拟这样的现实:
不断循环。
本项目不是为了做一个真正安全的 VM。 而是为了观察:
每一次“看似合理”的补丁,是如何被下一种技巧击穿的。
npm install vm2 acorn acorn-walk
node sandbox_vX.js
把 X 换成 0 / 1 / 2。
payload.js 内置四种访问方式:
| 名称 | 技术 |
|---|---|
| CVE-2025-68613 / this | 通过 this 获取 process |
| CVE-2026-25049 / destructuring | 通过对象解构拿 constructor |
| Reflect.get | 使用 Reflect API |
| Dynamic Reflect | 动态属性访问 |
特点:
结果: 全部 payload 都能通过。
攻击者快乐得像过年。
变化:
"use strict".call(undefined)因此:
this === undefined
攻击者点点头,换条路继续走。
新增:
ObjectPatternconstructor黑名单式修补通常具有:
✔ 修复明确路径 ✔ 成本低 ✔ 易上线
但同时:
❌ 防御面有限 ❌ 很容易被语义等价的其它访问方式绕过
这正是为什么类似 vm2 的沙箱,历史上会反复出现逃逸。