googleprojectzero/fuzzilli
GitHub: googleprojectzero/fuzzilli
Google Project Zero 推出的 JavaScript 引擎 Fuzzer,通过自定义中间语言 FuzzIL 和变异策略挖掘深层 JIT 编译器漏洞。
Stars: 2161 | Forks: 359
# Fuzzilli
一个基于自定义中间语言 的(覆盖率)引导式 Fuzzer,该语言可以被变异并翻译为 JavaScript。
## 使用方法
使用此 fuzzer 的基本步骤如下:
1. 下载受支持的 JavaScript 引擎之一的源代码。请参阅 [Targets/](Targets/) 目录以获取支持的 JavaScript 引擎列表。
2. 应用目标目录中相应的补丁。也可参阅该目录下的 README.md。
3. 按照 README 中的说明,编译带有覆盖率插桩的引擎(要求 clang >= 4.0)。
4. 编译 fuzzer:`swift build [-c release]`。
5. 运行 fuzzer:`swift run [-c release] FuzzilliCli --profile= [其他 cli 选项] /path/to/jsshell`。另请参阅 `swift run FuzzilliCli --help`。
在 Docker 和 Google Compute Engine 中构建和运行 Fuzzilli 以及受支持的 JavaScript 引擎 [也是受支持的](./Cloud)。
### 开发指南
查看 [main.swift](Sources/FuzzilliCli/main.swift) 以了解 Fuzzilli 库的使用示例,并尝试各种配置选项。接下来,查看 [Fuzzer.swift](Sources/Fuzzilli/Fuzzer.swift) 了解高层 fuzzing 逻辑。从这里可以深入探究任何看起来有趣的部分。
我们非常欢迎对此项目提供补丁、增补或其他贡献!但是,请务必快速查阅 [贡献者须知](CONTRIBUTING.md)。Fuzzilli 大致遵循 [Google 的 Swift 代码风格指南](https://google.github.io/swift/)。
如果您在使用本项目发现任何漏洞后,能发送简短的通知(可能包含 CVE 编号)至 或提交 pull request,以便将其包含在 [漏洞展示](#bug-showcase) 部分,我们将不胜感激。除此之外,您当然可以为这些漏洞申请任何漏洞赏金、CVE 功劳等 :)
## 概念
在针对核心解释器漏洞(例如 JIT 编译器中的漏洞)进行 fuzzing 时,生成程序的语义正确性成为了一个关注点。这与大多数其他场景(例如运行时 API 的 fuzzing)形成对比,在后一种情况下,通过将生成的代码包装在 try-catch 结构中可以轻松解决语义正确性问题。为了达到可接受的语义正确样本率,有不同的实现途径,其中之一是采用变异方法,即语料库中的所有样本在语义上也是有效的。在这种情况下,每次变异将有效样本转变为无效样本的几率很小。
为了实现基于变异的 JavaScript fuzzer,必须定义对 JavaScript 代码的变异。与其变异 AST 或程序的其他语法元素,不如定义一种自定义中间语言 (IL),在其上可以更直接地对程序的控制流和数据流执行变异。该 IL 随后被翻译为 JavaScript 以供执行。中间语言大致如下所示:
```
v0 <− LoadInteger '0'
v1 <− LoadInteger '10'
v2 <− LoadInteger '1'
v3 <− LoadInteger '0'
BeginFor v0, '<', v1, '+', v2 −> v4
v6 <− BinaryOperation v3, '+', v4
Reassign v3, v6
EndFor
v7 <− LoadString 'Result: '
v8 <− BinaryOperation v7, '+', v3
v9 <− LoadGlobal 'console'
v10 <− CallMethod v9, 'log', [v8]
```
例如,这可以简单地翻译为以下 JavaScript 代码:
```
const v0 = 0;
const v1 = 10;
const v2 = 1;
let v3 = 0;
for (let v4 = v0; v4 < v1; v4 = v4 + v2) {
const v6 = v3 + v4;
v3 = v6;
}
const v7 = "Result: ";
const v8 = v7 + v3;
const v9 = console;
const v10 = v9.log(v8);
```
或者通过内联中间表达式翻译为以下 JavaScript 代码:
```
let v3 = 0;
for (let v4 = 0; v4 < 10; v4++) {
v3 = v3 + v4;
}
console.log("Result: " + v3);
```
FuzzIL 具有以下属性:
* FuzzIL 程序 simply 是一个指令列表。
* FuzzIL 指令是一个操作,连同输入和输出变量以及可能的一个或多个参数(在上面的表示中用单引号括起来)。
* 指令的输入始终是变量,没有立即数。
* 指令的每个输出都是一个新变量,现有变量只能通过专用操作(如 `Reassign` 指令)重新赋值。
* 每个变量在使用前都已定义。
随后可以对这些程序执行多种变异:
* [InputMutator](Sources/Fuzzilli/Mutators/InputMutator.swift):用不同的变量替换指令的输入变量,以变异程序的数据流。
* [CodeGenMutator](Sources/Fuzzilli/Mutators/CodeGenMutator.swift):生成代码并将其插入到被变异程序的某处。代码通过运行 [代码生成器](Sources/Fuzzilli/CodeGen/CodeGenerators.swift) 或从语料库中的另一个程序复制某些指令(拼接)来生成。
* [CombineMutator](Sources/Fuzzilli/Mutators/CombineMutator.swift):将语料库中的程序插入到被变异程序的随机位置。
* [OperationMutator](Sources/Fuzzilli/Mutators/OperationMutator.swift):变异操作的参数,例如用不同的整数常量替换现有常量。
* 以及更多...
关于 Fuzzilli 工作原理的更详尽讨论可以在 [这里](Docs/HowFuzzilliWorks.md) 找到。
## 实现
该 fuzzer 使用 [Swift](https://swift.org/) 实现,部分部分(例如覆盖率测量、套接字交互等)使用 C 实现。
### 架构
一个 fuzzer 实例(在 [Fuzzer.swift](Sources/Fuzzilli/Fuzzer.swift) 中实现)由以下核心组件组成:
* [MutationFuzzer](Sources/Fuzzilli/Engines/MutationEngine.swift):通过应用 [变异](Sources/Fuzzilli/Mutators) 从现有程序生成新程序。之后执行生成的样本并对其进行评估。
* [ScriptRunner](Sources/Fuzzilli/Execution):执行目标语言的程序。
* [Corpus](Sources/Fuzzilli/Corpus/Corpus.swift):存储有趣的样本并将其提供给核心 fuzzer。
* [Environment](Sources/Fuzzilli/Environment/JavaScriptEnvironment.swift):了解运行时环境,例如可用的内置函数、属性名和方法。
* [Minimizer](Sources/Fuzzilli/Minimization/Minimizer.swift):最小化崩溃和有趣的程序。
* [Evaluator](Sources/Fuzzilli/Evaluation):根据某些指标(例如代码覆盖率)评估样本是否有趣。
* [Lifter](Sources/Fuzzilli/Lifting):将 FuzzIL 程序翻译为目标语言。
此外,还有一些可选模块:
* [Statistics](Sources/Fuzzilli/Modules/Statistics.swift):收集各种统计信息。
* [NetworkSync](Sources/Fuzzilli/Modules/NetworkSync.swift):通过网络同步多个实例。
* [ThreadSync](Sources/Fuzzilli/Modules/ThreadSync.swift):在同一进程内同步多个实例。
* [Storage](Sources/Fuzzilli/Modules/Storage.swift):将崩溃程序存储到磁盘。
Fuzzer 是事件驱动的,不同类之间的大多数交互都是通过事件发生的。事件被分发,例如作为发现崩溃或有趣程序、执行新程序、生成日志消息等的结果。有关事件的完整列表,请参阅 [Events.swift](Sources/Fuzzilli/Base/Events.swift)。事件机制有效地解耦了 fuzzer 的各个组件,并使得实现额外模块变得容易。
可以使用 [ProgramBuilder](Sources/Fuzzilli/Base/ProgramBuilder.swift) 实例构建 FuzzIL 程序。ProgramBuilder 提供了创建和追加新指令、追加来自另一个程序的指令、检索现有变量、查询当前位置的执行上下文(例如,是否在循环内)等方法。
### 执行
Fuzzilli 使用一种称为 [REPRL (read-eval-print-reset-loop)](Sources/Fuzzilli/Execution/REPRL.swift) 的自定义执行模式。为此,目标引擎被修改为通过管道和/或共享内存接受脚本输入,执行它,然后重置其内部状态并等待下一个脚本。这消除了进程创建的开销,并在很大程度上消除了引擎初始化的开销。
### 可扩展性
每个目标进程有一个 [Fuzzer](Sources/Fuzzilli/Fuzzer.swift) 实例。这使得能够同步执行程序,从而简化了各种算法的实现,例如连续变异和最小化。此外,它避免了实现线程安全访问内部状态(例如语料库)的需要。每个 fuzzer 实例都有自己的 [DispatchQueue](https://developer.apple.com/documentation/dispatch/dispatchqueue),在概念上对应于单个线程。根据经验,与 Fuzzer 实例的每次交互都必须在该实例的 dispatch queue 上进行。这保证了线程安全,因为队列是串行的。有关更多详细信息,请参阅 [文档](Docs/ProcessingModel.md)。
为了扩展,fuzzer 实例可以形成树状层次结构,在这种情况下,它们将新发现的有趣样本和崩溃报告给其父节点。反过来,父节点将其语料库与其子节点同步。树中节点之间的通信可以以不同方式发生,每种方式都作为一个模块实现:
* [线程间通信](Sources/Fuzzilli/Modules/ThreadSync.swift):通过将任务入队到另一个 fuzzer 的 DispatchQueue 来同步同一进程中的实例。
* [机器间通信](Sources/Fuzzilli/Modules/NetworkSync.swift):通过简单的基于 TCP 的协议同步实例。
这种设计允许 fuzzer 扩展到单台机器上的许多核心以及许多不同的机器。由于如果有太多实例向其发送程序,一个父节点可能很快就会过载,因此可以配置多级实例,例如一个根实例,16 个连接到根的中间节点,以及 256 个连接到中间节点的“叶子”。有关分布式 fuzzing 的更多信息,请参阅 [Cloud/](Cloud/) 目录。
## 资源
关于此 fuzzer 的更多资源:
* 在 Offensive Con 2019 上发表的关于 Fuzzilli 的 [演示文稿](https://saelo.github.io/presentations/offensivecon_19_fuzzilli.pdf)。
* 完成初始实现的 [硕士论文](https://saelo.github.io/papers/thesis.pdf)。
* Sensepost 关于使用 Fuzzilli 在 v8 中发现错误的 [博文](https://sensepost.com/blog/2020/the-hunt-for-chromium-issue-1072171/)。
* Doyensec 关于使用 Fuzzilli fuzzing JerryScript 引擎的 [博文](https://blog.doyensec.com/2020/09/09/fuzzilli-jerryscript.html)。
* 来自 NDSS Symposium 2023 的关于 Fuzzilli 及其与其他 fuzzer 比较的 [论文](https://www.ndss-symposium.org/ndss-paper/fuzzilli-fuzzing-for-javascript-jit-compiler-vulnerabilities/)。
## 漏洞展示
以下是借助 Fuzzilli 发现的一些漏洞列表。此列表应仅包含具有安全影响且至少存在于受影响软件的 Beta 版本中的漏洞。由于 Fuzzilli 经常用于开发期间的持续 fuzz 测试,因此它发现的许多问题未包含在此列表中,因为它们通常是在易受攻击的代码到达 Beta 版本之前被发现的。然而,可以在 [这里](https://issues.chromium.org/issues?q=hotlistid:5433121%20status:(fixed%20%7C%20verified) 找到 Fuzzilli 最近在 V8 中发现的所有问题的列表。
特别感谢所有报告了 Fuzzilli 发现的漏洞的用户!
#### WebKit/JavaScriptCore
* [Issue 185328](https://bugs.webkit.org/show_bug.cgi?id=185328):DFG Compiler 对 NumberIsInteger 操作使用了错误的输出寄存器
* [CVE-2018-4299](https://www.zerodayinitiative.com/advisories/ZDI-18-1081/):performProxyCall 将内部对象泄漏给脚本
* [CVE-2018-4359](https://bugs.webkit.org/show_bug.cgi?id=187451):compileMathIC 生成错误的机器码
* [CVE-2019-8518](https://bugs.chromium.org/p/project-zero/issues/detail?id=1775):FTL JIT 中的 OOB 访问,原因是 LICM 将数组访问移至边界检查之前
* [CVE-2019-8558](https://bugs.chromium.org/p/project-zero/issues/detail?id=1783):由于悬挂的 Watchpoints 导致 CodeBlock UaF (释放后使用)
* [CVE-2019-8611](https://bugs.chromium.org/p/project-zero/issues/detail?id=1788):AIR 优化错误地移除了对寄存器的赋值
* [CVE-2019-8623](https://bugs.chromium.org/p/project-zero/issues/detail?id=1789):DFG JIT 中的循环不变代码外提 (LICM) 导致栈变量未初始化
* [CVE-2019-8622](https://bugs.chromium.org/p/project-zero/issues/detail?id=1802):DFG 的 doesGC() 对 HasIndexedProperty 操作在 StringObjects 上的行为判断错误
* [CVE-2019-8671](https://bugs.chromium.org/p/project-zero/issues/detail?id=1822):DFG:循环不变代码外提 (LICM) 导致对象属性访问未被保护
* [CVE-2019-8672](https://bugs.chromium.org/p/project-zero/issues/detail?id=1825):ValueProfiles 中的 JSValue 释放后使用
* [CVE-2019-8678](https://bugs.webkit.org/show_bug.cgi?id=198259):当某些原型被修改时,JSC 未能运行 haveABadTime(),导致类型混淆
* [CVE-2019-8685](https://bugs.webkit.org/show_bug.cgi?id=197691):JSPropertyNameEnumerator 使用了错误的结构 ID
* [CVE-2019-8765](https://bugs.chromium.org/p/project-zero/issues/detail?id=1915):DFG 编译期间的 GetterSetter 类型混淆
* [CVE-2019-8820](https://bugs.chromium.org/p/project-zero/issues/detail?id=1924):重构参数对象时回退 (bailout) 期间发生类型混淆
* [CVE-2019-8844](https://bugs.webkit.org/show_bug.cgi?id=199361):ObjectAllocationSinkingPhase 不应为不再有效的分配插入提示
* [CVE-2020-3901](https://bugs.webkit.org/show_bug.cgi?id=206805):FTL JIT 代码中的 GetterSetter 类型混淆(由于 LICM 并不总是安全的)
* [CVE-2021-30851](https://bugs.webkit.org/show_bug.cgi?id=227988):并发 HashTable 查找期间缺少锁
* [CVE-2021-30818](https://bugs.webkit.org/show_bug.cgi?id=223278):DFG OSR Exit 上重构参数时的类型混淆
* [CVE-2022-46696](https://bugs.webkit.org/show_bug.cgi?id=246942):JIT 编译代码中缺少异常检查导致断言失败
* [CVE-2022-46699](https://bugs.webkit.org/show_bug.cgi?id=247420):IC 中错误缓存特殊属性导致断言失败
* [CVE-2022-46700](https://bugs.webkit.org/show_bug.cgi?id=247562):Intl.Locale.prototype.hourCycles 将空 JSValue 泄漏给脚本
* [CVE-2025-43214](https://bugs.webkit.org/show_bug.cgi?id=292621):遍历堆栈时 JSToWasmEntry 发生内存损坏
* [CVE-2025-43213](https://bugs.webkit.org/show_bug.cgi?id=292916):NewRegExpUntyped 操作的类型无效
#### Gecko/Spidermonkey
* [CVE-2018-12386](https://ssd-disclosure.com/archives/3765/ssd-advisory-firefox-javascript-type-confusion-rce):IonMonkey 寄存器分配错误导致类型混淆
* [CVE-2019-9791](https://bugs.chromium.org/p/project-zero/issues/detail?id=1791):IonMonkey 对通过 OSR 进入的构造函数的类型推断不正确
* [CVE-2019-9792](https://bugs.chromium.org/p/project-zero/issues/detail?id=1794):IonMonkey 将 JS\_OPTIMIZED\_OUT 魔术值泄漏给脚本
* [CVE2019-9816](https://bugs.chromium.org/p/project-zero/issues/detail?id=1808):ObjectGroupDispatch 操作中出现意外的 ObjectGroup
* [CVE-2019-9813](https://bugs.chromium.org/p/project-zero/issues/detail?id=1810):IonMonkey 编译的代码未能更新推断的属性类型,导致类型混淆
* [CVE-2019-11707](https://bugs.chromium.org/p/project-zero/issues/detail?id=1820):IonMonkey 错误预测 Array.prototype.pop 的返回类型,导致类型混淆
* [CVE-2020-15656](https://bugzilla.mozilla.org/show_bug.cgi?id=1647293):IonMonkey 中特殊参数的类型混淆
* [CVE-2021-29982](https://bugzilla.mozilla.org/show_bug.cgi?id=1715318):寄存器分配不正确(由 [JIT-Picker](https://github.com/RUB-SysSec/JIT-Picker) 发现)
* [CVE-2021-29984](https://bugzilla.mozilla.org/show_bug.cgi?id=1720031):指令重排序结合意外的 GC 可能导致内存损坏
* [CVE-2022-28285](https://bugzilla.mozilla.org/show_bug.cgi?id=1756957):MLoadTypedArrayElementHole 的 AliasSet 过于宽松
* [CVE-2022-31745](https://bugzilla.mozilla.org/show_bug.cgi?id=1760944):增量 GC 中的错误
* [CVE-2022-42928](https://bugzilla.mozilla.org/show_bug.cgi?id=1791520):某些 BigInt 操作缺少 KeepAlive 注解可能导致内存损坏
* [CVE-2022-45406](https://bugzilla.mozilla.org/show_bug.cgi?id=1791975):JavaScript Realm 的释放后使用
* [CVE-2023-4577](https://bugzilla.mozilla.org/show_bug.cgi?id=1847397):GC 和 RegEx 相互作用导致的内存损坏
* [CVE-2023-5171](https://bugzilla.mozilla.org/show_bug.cgi?id=1851599):编译期间 GC 导致释放后使用
* [CVE-2023-25735](https://bugzilla.mozilla.org/show_bug.cgi?id=1810711):Compartment 不匹配导致的潜在释放后使用
* [CVE-2023-25751](https://bugzilla.mozilla.org/show_bug.cgi?id=1814899):Jitted 代码损坏
* [CVE-2023-29535](https://bugzilla.mozilla.org/show_bug.cgi?id=1820543):弱映射 的 GC 期间的内存损坏
* [CVE-2023-29543](https://bugzilla.mozilla.org/show_bug.cgi?id=1816158):Debugger 内部的内存损坏
* [CVE-2023-29544](https://bugzilla.mozilla.org/show_bug.cgi?id=1818781):并行标记期间的内存损坏
* [CVE-2023-29549](https://bugzilla.mozilla.org/show_bug.cgi?id=1823042):在错误的 Realm 中分配对象
* [CVE-2024-0744](https://bugzilla.mozilla.org/show_bug.cgi?id=1871089):JIT 编译的代码可能解引用了野指针值
* [CVE-2024-3854](https://bugzilla.mozilla.org/show_bug.cgi?id=1884552):JIT 错误地优化 switch 语句并生成了带有越界读取的代码
* [CVE-2024-3855](https://bugzilla.mozilla.org/show_bug.cgi?id=1885828):JIT 错误地优化 MSubstr 操作,导致越界读取
* [CVE-2024-3857](https://bugzilla.mozilla.org/show_bug.cgi?id=1886683):JIT 生成的代码不正确,导致垃圾回收期间发生释放后使用
* [CVE-2024-3858](https://bugzilla.mozilla.org/show_bug.cgi?id=1888892):在 GC 追踪时改变 JavaScript 对象会导致 jitted 代码崩溃
* [CVE-2024-6613](https://bugzilla.mozilla.org/show_bug.cgi?id=1900523):WASM 堆栈帧列表不正确
* [CVE-2024-6614](https://bugzilla.mozilla.org/show_bug.cgi?id=1902983):WASM 堆栈帧列表不正确
* [CVE-2024-7521](https://bugzilla.mozilla.org/show_bug.cgi?id=1904644):WebAssembly 异常处理不完整
* [CVE-2024-7652](https://bugzilla.mozilla.org/show_bug.cgi?id=1901411):AsyncGeneratorPrototype 规范中的错误
* [CVE-2024-8381](https://bugzilla.mozilla.org/show_bug.cgi?id=1912715):在 "with" 块中查找属性名时的类型混淆
* [CVE-2024-9396](https://bugzilla.mozilla.org/show_bug.cgi?id=1912471):克隆某些对象时可能发生潜在的内存损坏
* [CVE-2025-0240](https://bugzilla.mozilla.org/show_bug.cgi?id=1929623):解析 JavaScript JSON 模块时 Compartment 不匹配
* [CVE-2025-0241](https://bugzilla.mozilla.org/show_bug.cgi?id=1933023):使用 JavaScript 文本分段 时内存损坏
* [CVE-2025-1012](https://bugzilla.mozilla.org/show_bug.cgi?id=1939710):并发延迟解析 期间的释放后使用
* [CVE-2025-1934](https://bugzilla.mozilla.org/show_bug.cgi?id=1942881):RegExp bailout 处理期间发生意外的 GC
#### Chromium/v8
* [Issue 939316](https://bugs.chromium.org/p/project-zero/issues/detail?id=1799):Turbofan 可能在优化 Reflect.construct 时越界读取 Map 指针
* [Issue 944062](https://bugs.chromium.org/p/project-zero/issues/detail?id=1809):JSCallReducer::ReduceArrayIndexOfIncludes 未能插入 Map 检查
* [CVE-2019-5831](https://bugs.chromium.org/p/chromium/issues/detail?id=950328):V8 中不正确的 Map 处理
* [Issue 944865](https://bugs.chromium.org/p/chromium/issues/detail?id=944865):V8 中的无效值表示
* [CVE-2019-5841](https://bugs.chromium.org/p/chromium/issues/detail?id=969588):内联启发式算法中的错误
* [CVE-2019-5847](https://bugs.chromium.org/p/chromium/issues/detail?id=972921):V8 sealed/frozen 元素导致崩溃
* [CVE-2019-5853](https://bugs.chromium.org/p/chromium/issues/detail?id=976627):正则表达式长度检查中的内存损坏
* [Issue 992914](https://bugs.chromium.org/p/project-zero/issues/detail?id=1923):Map 迁移不遵守元素类型,导致类型混淆
* [CVE-2020-6512](https://bugs.chromium.org/p/chromium/issues/detail?id=1084820):V8 中的类型混淆
* [CVE-2020-16006](https://bugs.chromium.org/p/chromium/issues/detail?id=1133527):DescriptorArray 中哈希冲突处理不当导致的内存损坏
* [CVE-2021-37991](https://bugs.chromium.org/p/chromium/issues/detail?id=1250660):并发 JIT 编译期间的竞争条件
* [Issue 1359937](https://bugs.chromium.org/p/chromium/issues/detail?id=1359937):BigInts 的反序列化可能产生无效的 -0n 值
* [Issue 1377775](https://bugs.chromium.org/p/chromium/issues/detail?id=1377775):Turbofan 中内联 Array.prototype.at 时类型检查不正确
#### [Duktape](https://github.com/svaarala/duktape)
* [Issue 2323](https://github.com/svaarala/duktape/pull/2323):putprop 中的 valstack 指针不稳定
* [Issue 2320](https://github.com/svaarala/duktape/pull/2320):字符串内置函数中的 Memcmp 指针溢出
#### [JerryScript](https://github.com/jerryscript-project/jerryscript)
- [CVE-2020-13991](https://github.com/jerryscript-project/jerryscript/issues/3858):展开参数 (spread arguments) 的释放不正确
- [Issue 3784](https://github.com/jerryscript-project/jerryscript/issues/3784):由于属性枚举不正确导致的内存损坏
- [CVE-2020-13623](https://github.com/jerryscript-project/jerryscript/issues/3785):通过 Proxy 对象的属性键导致栈溢出
- [CVE-2020-13649 (1)](https://github.com/jerryscript-project/jerryscript/issues/3786):OOM (内存不足) 情况下错误处理导致的内存损坏
- [CVE-2020-13649 (2)](https://github.com/jerryscript-project/jerryscript/issues/3788):OOM 情况下错误处理导致的内存损坏
- [CVE-2020-13622](https://github.com/jerryscript-project/jerryscript/issues/3787):由于处理 Proxy 对象属性键不正确导致的内存损坏
- [CVE-2020-14163](https://github.com/jerryscript-project/jerryscript/issues/3804):垃圾回收触发添加键/值对时的竞争条件导致的内存损坏
- [Issue 3813](https://github.com/jerryscript-project/jerryscript/issues/3813):SerializeJSONProperty 函数中的错误处理不正确
- [Issue 3814](https://github.com/jerryscript-project/jerryscript/issues/3814):ecma_op_function_has_instance 断言中出现意外的 Proxy 对象
- [Issue 3836](https://github.com/jerryscript-project/jerryscript/issues/3836):TypedArray 初始化不正确导致的内存损坏
- [Issue 3837](https://github.com/jerryscript-project/jerryscript/issues/3837):getOwnPropertyDescriptor 中内存处理不正确导致的内存损坏
#### [Hermes](https://github.com/facebook/hermes)
- [CVE-2020-1912](https://www.facebook.com/security/advisories/cve-2020-1912):执行延迟编译的内部生成器函数时发生内存损坏
- [CVE-2020-1914](https://www.facebook.com/security/advisories/cve-2020-1914):处理 SaveGeneratorLong 指令时发生字节码损坏
## 免责声明
这不是一个官方支持的 Google 产品。
标签:CVE, Fuzzer, Fuzzilli, Google, JavaScript 引擎, JIT 编译器, Nuclei, Swift, 中间语言, 代码覆盖, 动态语言, 安全测试, 开源, 攻击性安全, 数字签名, 测试工具, 编译器, 解释器