【问题标题】:Coverage-based fuzzing of JavaScript applicationsJavaScript 应用程序的基于覆盖的模糊测试
【发布时间】:2020-08-24 12:15:01
【问题描述】:

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

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

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

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

如何使用覆盖率指导对 Java 脚本(在浏览器中)应用程序进行模糊测试?

【问题讨论】:

    标签: javascript fuzzing


    【解决方案1】:

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

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

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

    jsfunfuzz 从为 fuzzing 手动编写的 JS 语法中随机生成语法上有效的 JS 语句。

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 我不想模糊引擎本身,我想模糊 in javscript(或 typescript)编写的应用程序。应用程序将数据渲染到 DOM 中,这需要转义、清理和模糊测试,这对于在其中找到有问题的极端情况很有用。
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2012-02-09
    • 1970-01-01
    • 2019-06-04
    • 2011-05-12
    相关资源
    最近更新 更多