V8缺陷回看

星期六, 9月 28, 2024 | 3分钟阅读 | 更新于 星期日, 12月 8, 2024

YuanFeng Xie

本文针对在V8 JavaScript引擎中发现的一个缺陷进行说明。

缺陷通过使用Superion工具进行模糊测试(fuzzing)而发现的。Superion是一个专门用于JavaScript引擎模糊测试的工具,它能够生成大量的JavaScript测试样例,这些样例旨在探测引擎中可能存在的漏洞或异常行为。

在使用Superion工具收集的JavaScript测试样例中,有一些特定的代码片段在V8引擎上运行时触发了这个缺陷。V8是Google开发的开源JavaScript引擎,广泛应用于Chrome浏览器和Node.js运行时环境中。

该缺陷的详细内容可在Chromium项目的缺陷追踪系统中查看,具体链接为

缺陷报告

漏洞成因解析

  • 原文:The else branch of of BuildPrivateBrandCheck is missing a RegisterAllocationScope, so calls of optional-chained private methods with arguments is violating the bytecode generator’s regalloc invariants.
  • 问题所在: 在处理带参数的可选链私有方法调用时,引擎的某个分支(else分支)缺少了正确的寄存器分配作用域。
    • 私有品牌检查(Private Brand Check):在JavaScript中,私有方法(如我们之前例子中的 #控制中心)需要进行一种特殊的检查,称为"私有品牌检查"。这就像确认某人是否有权限进入一个私人俱乐部。
    • 可选链(Optional Chaining):可选链(?.)允许我们安全地访问可能不存在的属性或方法。这就像在敲门之前先确认房子里有人。
    • 寄存器分配作用域(Register Allocation Scope):这是V8引擎内部用于管理资源(寄存器)的机制。可以将其想象为临时工作区,引擎在这里处理和储存计算过程中的中间结果。

漏洞形象化说明

  • 想象一个高级餐厅的厨房:
    • 私有方法就像特殊的秘方菜品。
    • 可选链就像顾客可能会点,也可能不会点的菜。
    • 寄存器分配作用域就像厨师的工作台。
    • 参数就像菜品的配料。

问题出在:当厨房准备可能不会被点的秘方菜(可选链私有方法)时,他们忘记为某些情况准备专门的工作台(寄存器分配作用域)。结果就是,当这道菜真的被点了,而且需要特殊配料(参数)时,厨房乱了套,因为没有适当的工作区域来处理这种情况。

漏洞实际影响

  • 不一致性:这导致字节码生成器(就像厨房的操作流程)在处理资源时出现不一致。
  • 崩溃风险:在特定情况下,这种不一致可能导致程序崩溃。
  • 特定场景:这个问题只在使用可选链调用带参数的私有方法时出现,这解释了为什么它在之前可能没被发现。
  • 难以调试:由于问题发生在引擎内部,对普通开发者来说很难发现和诊断。

解决方案:

修复这个问题需要在处理可选链私有方法调用的代码中正确添加寄存器分配作用域。这就像确保厨房在处理每种可能的菜品组合时都有适当的工作区域。

class C {
  static #c = C;
  static #m() { return this; }
  static test(C) {
    assertEquals(C?.#m(), C);
    assertEquals((C?.#m)(), C);
    assertEquals(C?.#c?.#m(), C);
    assertEquals((C?.#c?.#m)(), C);

    // assertEquals(C?.#m(42), C);
    // assertEquals((C?.#m)(42), C);
    // assertEquals(C?.#c?.#m(42), C);
    // assertEquals((C?.#c?.#m)(42), C);
  }
}
C.test(C);

© 2024 小谢同学的修行小屋

🌱 Powered by Hugo with theme Dream.

关于我

一名喜欢RUST的菜鸟程序员

教育背景(研二在读)

  • 2019.09 - 2023.06 天津大学 · 智能与计算学部 · 网络安全专业 · 全日制 · 本科
  • 2023.09 - 2026.06 天津大学 · 智能与计算学部 · 电子信息专业 · 全日制 · 硕士研究生
浏览器漏洞挖掘项目

V8引擎的模糊测试工具改进

时间:2021.09-2022.04

内容:聚焦于优化JavaScript引擎的测试方法。研究团队基于SOAT改进部署了V8引擎测试环境,并通过分析测例覆盖率和已知CVE,优化了测试流程。

成果:成功捕获了一个谷歌引擎的逻辑漏洞,获得了修复反馈

JS引擎WASM模块漏洞挖掘研究

时间:2023.11-2024.4

内容:阅读标准手动编写了WASM语法规则,调研了主流JS引擎的WASM支持情况,并基于V8构建了WASM二进制框架。

成果:语法规则、调研报告和二进制构建框架,成功捕获特性缺陷并得到修复

数据库缺陷研究项目

关系型数据库缺陷的实证研究

时间:2022.12-2023.11

内容:通过构建统一的数据库逻辑框架,系统收集并分析了大量数据库缺陷。对777个缺陷进行了深入分析,特别聚焦SQL数据类型问题,并据此改进了模糊测试方法。

成果:构建缺陷数据集, 开发SQLT测试框架

网络协议漏洞挖掘项目

基于 RFC的 SSL/TLS模糊测试

时间:2024.4 – today

内容:梳理TLS协议模糊测试的相关工作,关注基于状态机的网络协议模糊测试方法。复现历史漏洞,了解TLS报文结构,追溯相关漏洞代码。分析RFC文档,提取字段约束,构建状态转移范式,并据此完善了TLS协议的有限状态机模型。

成果:完成相关工作调研, 漏洞复现报告, 状态范式数据集