Skip to content

XSS → JIT → 沙箱逃逸

浏览器安全最极端的攻击链(架构级解析)

  • 这是 国家级漏洞 / Pwn2Own / Chrome 0day 的典型路线
  • 不是普通黑客、也不是业务安全能做到的

一、先给你一张「攻击高度图」

Web 页面(JS / XSS)
 ├─ JS 执行权限(最低)

 ↓ 利用引擎 Bug

V8 JIT(内存破坏)
 ├─ 读写 Renderer 内存

 ↓ 逃逸 JS 沙箱

Renderer 进程
 ├─ OS 沙箱限制

 ↓ 利用系统 / IPC Bug

Browser / OS(完全失陷)

👉 Chrome 的目标不是“绝对安全”,而是:

  • 让每一层都极难、极不稳定、极不通用

二、第一步:XSS —— 为什么它只是“起点”

1️⃣ XSS 到底给了攻击者什么?

只有这一点:

  • 👉 在某个站点的 Renderer 进程里执行 JS

XSS 后你“仍然不能”:

  • 访问其他站点
  • 读浏览器内存
  • 调系统 API
  • 突破同源
  • 访问 OS

👉 XSS 本身 ≠ 沙箱逃逸

2️⃣ 那为什么 XSS 仍然危险?

因为:

  • JS 是 JIT 编译的
  • JIT = 复杂 + 高权限 + 历史漏洞多

三、第二步:JIT —— 真正的“突破点”

  • 所有现代浏览器高危漏洞的 80% 在 JIT

1️⃣ JIT 在干什么?

V8 为了性能,会做激进假设:

js
function add(a, b) {
  return a + b
}

JIT 可能假设:

  • a 永远是 number
  • b 永远是 number
  • 不需要类型检查

2️⃣ JIT 漏洞的本质(非常重要)

核心问题只有一个:

  • “引擎的假设 ≠ 实际运行情况”

典型漏洞类型:

  • Type Confusion(类型混淆)
  • Out-of-Bounds(越界)
  • Use-after-free

3️⃣ 一旦 JIT 被击穿,会发生什么?

⚠️ 这是质变点

JS 从:

text
受限语言

变成:

text
可控内存读写

攻击者能做到:

  • 读任意 Renderer 内存
  • 写任意 Renderer 内存
  • 构造假对象
  • 劫持执行流

👉 JS 安全模型到此为止

4️⃣ 为什么这是“最难的一步”?

因为:

  • JIT 非常复杂
  • 漏洞版本强相关
  • 利用极不稳定
  • Chrome 经常修

所以:

  • 这一步通常是 0day

四、第三步:Renderer 沙箱 —— 最后的“铁门”

即使你:

  • 能读写内存
  • 能执行任意代码

你仍然在:

Renderer Process(OS Sandbox)

1️⃣ Renderer 沙箱限制了什么?

即使是 native code:

  • ❌ 文件系统
  • ❌ 网络 socket
  • ❌ 系统调用
  • ❌ 进程操作

👉 你是“被关在监狱里的 root”

2️⃣ 那沙箱怎么逃?

只能通过:

  • Chrome IPC 接口
  • 内核漏洞
  • GPU / 驱动漏洞
  • Browser Process 逻辑漏洞
Renderer → Browser(IPC)

⚠️ Browser 进程是:

  • 高权限
  • 少量入口
  • 严格校验

3️⃣ 为什么这一步更难?

因为:

  • IPC 接口很少
  • 参数校验严格
  • 攻击面被极度压缩
  • OS 沙箱是系统级

👉 这一步通常是“内核级漏洞”

五、为什么 Chrome 的防御是“分层失败安全”

Chrome 并不假设:

  • XSS 不会发生
  • JIT 没漏洞
  • OS 没 bug

而是假设:

  • 每一层都会被突破,但不能一次全破

Chrome 的真实防御策略

防御目标
XSSCSP / 框架转义
JS语言限制
JITDeopt / 审计
RendererOS 沙箱
Site Isolation进程隔离
OS权限隔离

六、为什么“前端工程师”也必须懂这条链?

因为你在增加或减少攻击面

行为影响
eval扩大 JIT 攻击面
动态 script扩大执行面
第三方 SDK引入未知 JS
关闭 CSP拆第一道墙
Wasm触及 JIT 边界

👉 安全不是“有没有漏洞”,而是“攻击面有多大”

七、真实世界的结论(非常重要)

  • ❌ XSS ≠ 浏览器被攻破

  • ❌ JS ≠ 本地代码

  • ❌ Wasm ≠ 高权限

  • ✅ Chrome 假设“攻击一定会发生”,并通过架构把影响压到最小

八、面试 / 架构级总结

XSS 只能获得站点内的 JavaScript 执行权限;真正的浏览器逃逸通常需要利用 JIT 编译器漏洞实现内存破坏,突破语言沙箱;即便如此仍需进一步绕过 Renderer 的操作系统级沙箱,才能影响浏览器或系统,这种多层防御使完整攻击链极其困难。