0

American Fuzzy Lop和概念上相关的 LLVM libfuzzer不仅生成随机模糊字符串,而且还观察被测代码的分支覆盖率,并使用遗传算法尝试覆盖尽可能多的分支。这会增加下游更有趣代码的命中频率,否则大多数生成的输入将在某些反序列化或验证中提前停止。

但是这些工具在本机代码级别工作,这对 JavaScript 应用程序没有用,因为它会试图覆盖解释器,而不是真正的解释代码。

那么有没有办法通过覆盖率指导来模糊 JavaScript(最好在浏览器中,但在 node.js 中运行的测试也会有所帮助)?

我查看了这个老问题中提到的工具,但是那些做 javascript 的工具似乎没有提到任何关于覆盖率分析的内容。虽然radamsa提到可选择将其与覆盖分析配对,但我还没有找到任何有关如何实际执行此操作的文档。

一个带有覆盖指导的模糊测试java脚本(在浏览器中)应用程序如何?

4

1 回答 1

0

由于浏览器用户数量约为 40 亿,因此对 JavaScript 引擎进行模糊测试引起了很多关注。已经做了几项工作来查找 JS 引擎中的错误,包括流行的大型引擎,例如 v8、webkit、chakracore、gecko,或一些小型嵌入式引擎,如 jerryscript、QuickJS、jsish、mjs、mujs。

使用 AFL 确实很难找到错误,因为 AFL 提供的突变机制对于 JS 文件不实用,例如,bitflip 几乎不可能是有效的突变。由于 JS 是一种结构化语言,因此有几项工作使用 ECMAScript 语法来变异/生成 JS 文件(种子):

LangFuzz解析示例 JS 文件并将它们拆分为代码片段。然后它重新组合这些片段以生成测试用例。

jsfunfuzz从手动编写的用于模糊测试的 JS 语法中随机生成语法上有效的 JS 语句。

Dharma是一个基于生成的、上下文无关的语法模糊器,根据给定的语法生成文件。

Superion使用由 JS 语法引导的基于树的变异扩展 AFL。

上述作品可以轻松通过语法检查,但在语义检查中失败。很多生成的 JS 种子在语义上是无效的。

CodeAlchemist使用语义感知方法来生成基于静态类型分析的代码段。

与 JS 引擎相关的错误有两个级别:简单的解析器/解释器错误和深层逻辑错误。最近有一种趋势,简单的bug越来越少,而深层的bug越来越多。

DIE使用保留方面的突变来保留 CVE 的理想属性。它还使用类型分析来生成语义有效的错误。

一些工作专注于变异中间表示。

Fuzzilli是一种基于 IR 级别突变的覆盖引导模糊器。IR 上的突变可以保证语义的有效性,并且可以转移到 JS。

Fuzzing JS 是近年来安全/SE 顶级会议的一个有趣且热门的话题。希望这些信息对您有所帮助。

于 2020-08-29T08:01:36.420 回答