CodeAlchemist:用于在JavasScript引擎中查找漏洞的代码生成工具

作者:{fr4nk}@ArkTeam

原文作者:HyungSeok HanDongHyeon OhSang Kil Cha

原文标题:CodeAlchemist: Semantics-Aware Code Generation to Find Vulnerabilities in JavaScript Engines

原文会议:2019 NDSS

 JavaScript(JS)引擎已日益成为现代Web浏览器的核心组件,鉴于针对其构建漏洞利用的过程较为灵活,JS 引擎逐渐成为一个对攻击者有吸引力的目标。目前最先进的用于查找 JS 引擎漏洞的模糊器主要集中在基于预定义的上下文无关语法或训练的概率语言模型生成语法上正确的测试用例。然而,语法上正确的 JS 语句在运行时通常在语义上无效。

本文提出了一种新的测试用例生成算法,实现了模糊测试工具CodeAlchemist。该工具可以生成任意的JavaScript代码片段,这些代码片段在语义和语法上都是正确的,并且它有效地产生了可以导致 JS 引擎崩溃的测试用例。最后,作者基于该工具发现了数个最新版本 JS 引擎的漏洞,并向供应商报告了这些漏洞。

为了生成在语法和语义上都有效的 JS 代码片段,作者提出了基于语义感知的代码块组合技术(semantic-aware assembly),这是一种用于 JS 引擎模糊测试的新型测试用例生成算法。该方法最关键的部分是将 JS代码作为 seeds ,将其拆分成可组合的构建块(代码块),每个代码块都代表了一个有效的 JS 抽象语法树。同时也要为 每个代码块标记出一个组合约束条件,这是将代码块与其他代码块互连时要遵循的一组规则。具体而言,组合约束条件包含两种:先决条件和后置条件。先决条件是一组变量及其类型,需要预先定义这些符号从而可以在没有运行时错误的情况下执行代码块。后置条件描述了在代码块的末尾定义了哪种变量,并在后面可被其他代码块使用。从一个小代码块开始,语义感知组合技术通过反复合并不同代码块来进行扩展。

图 1 CodeAlchemist 架构图

文中提出了模糊测试工具 CodeAlchemist 的体系架构(如图 1),它将一组 JS seeds 文件、一组用户可配置的参数作为输入测试目标 JS 引擎,并输出在引擎中的一组错误。其主要包含三个部分:Seed Parser 模块将 JS seeds 分解为不同的代码块,Constraint analyzer 模块为每个代码块推断出其组合约束条件,Engine fuzzer 则根据组件约束条件池中的代码块,生成测试用例并针对目标 JS 引擎执行生成的测试用例。如果引擎崩溃,它会在文件系统上存储相应的测试用例。

算法1 代码生成算法

其中代码生成算法如算法 1,其中 imax 表示生成算法的最大迭代轮数,pblk代表重新生成代码块的概率,iblk表示生成块的最大迭代轮数,dmax则代表冲组合块的最大嵌套层数。

表 1 截至 2018 年 7 月 10 日最新 JS 引擎上发现的程序崩溃次数

作者对工具进行了实验评估,评估角度包含了可用的测试用例数量、造成程序崩溃的错误数量以及与 jsfunfuzz、IFuzzer 经典工具的效果对比。最终效果对比如表1所示。

表 2 CodeAlchemist 发现的 bug

最后,在证明了 CodeAlchemist 可以有效地在受控环境中查找JS引擎中的错误基础上,作者在使用的同一台服务器上针对最新的 JS 引擎也运行了 CodeAlchemist,并使用各种不同的参数测试大约一周,共发现 19 个程序错误,其中11个可被进一步利用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注