Fuzzing相关论文笔记

JS和Fuzz相关知识

JS程序可以在运行时动态修改类型系统,并动态生成代码。
JS是一种面向原型的语言,这意味着只需将对象实例B设置为对象实例A的原型,A可以在运行时继承B的属性。
JS runtime errors
SyntaxError:由于js是动态的,看起来语法正确的代码也可能触发syntaxerror。比如万恶的eval函数,eval(‘break’)
RangeError:越界
ReferenceError:访问为定义变量
TypeError:
URIError:
还可能有程序员自己定义的错误类型。
Fuzz可分为静态和动态,后者可能有异常事件不容易重现的问题。

CodeAlchemist

为JS engine fuzzing生成测例。

Problem

1.目前生成的主要是语法正确的test case,基于预定义的上下文无关文法或训练的概率语言模型。但是语法正确的程序,运行时可能出现语义问题。
2.Javascript是动态类型的语言,使用静态分析很难触发正确bug。

Related work

LangFuzz

解析sample JS文件,将其作为种子文件,并分解为代码片段,重新组合这些片段生成test case。

jsfunfuzz

基于手工编写的js语法,随机生成语法正确的JS语句。为了减少生成无效js测例的数量,用try-catch包装代码片段,但是可能会改变js code(没有try-catch时才触发漏洞),仍未解决runtime的问题。

Skyfire/TreeFuzz

用JS种子文件构建概率语言模型,从模型中部分学习js 语义,用模型生成test case。但准确率依赖于语言模型,如果遇到类型系统复杂的js语言,很可能生成语义不正确的js测例。(比如object类型不是string,调用toUpperCase()函数时会出现type error,但现在的模型很难识别)

Observation

执行jsfunfuzz来运行四个主流JS引擎。观察到最主要的runtime error是reference error 和syntax error。观察报syntax error的测例,发现实际上并不主要是动态修改带来的,应该是jsfunfuzz本身手动编写的语法有不正确的生成规则。所以本文的fuzzer应该自动生成test case,避免手动编写语法。同时可以发现jsfunfuzz生成测例中只有少数top-level statements是运行时有效的。

Solution

本文的核心技术是semantics-aware assembly,可以自动生成语法语义正确的js代码片段。
将JS种子文件划分成code brick,一个brick表示一个有效的JS AST。每个brick会标识什么条件(assembly constraint)下可以和其他brick组合,分为precondition和postcondition,前者是一组为保证没有runtime error所需定义的变量符号和类型,后者描述了此brick之后什么样的变量是可以使用的。用data-flow分析计算brick中定义和使用了哪些变量,动态计算出变量的类型。只在两变量类型一致、定义变量的块在使用变量的块之前时合并code brick。但是还是会生成runtime error的测例,可能是过于接近assembly constraint。
(但还是没法解决上文提到的某变量类型特有的函数调用的问题??)

CodeAIchemist

  1. seed parser:
    Parser:根据某语言规范将种子文件解析成AST
    Split:将ASTs分解成code bricks,每个brick都是合法的AST,规范处理其中的符号(变量重命名等)。
  2. constraint analyzer:为每个code bricks找到assembly constraint。
    Analyze:u-d chain确定需要定义的变量和新定义的变量。
    Instrument:通过动态插装来跟踪变量类型。
  3. engine fuzzer
    Generate:从pool中选择brick进行组合
    Execute:JS引擎执行生成的测例

Discussion

  1. 效果依赖于种子文件的选择。
  2. 效果依赖于brick之后的brick块选择,本文中是随机的
  3. 动态获得变量类型可以通过动态插装(本文所选),也可以通过静态的type system。

FreeDOM

Problem

1.现有的Fuzzer中生成test case时依赖于上下文无关文法,只保证语法正确,没有考虑数据依赖(语义正确)。
2.生成测例时,只能用“基于生成”,不能用“基于覆盖率的变异”,即使支持后者,变异操作也很单调,只能append new data(Domato)。这是因为现有的fuzzer进行测试时以明文输出最终文档。
3.由于执行过程是动态的,所以不知道input什么时候执行结束,故人为设定一个停止时间。通常基于生成的fuzzer产生的test case比较复杂,运行时间更久。

Solution

为解决Problem2,使用“基于变异”时,FreeDOM①采用FD-IR(intermediate representation),包含详细的上下文信息,便于保证变异后的语义正确性,丰富了变异时的操作。②动态停止测例的执行提高了吞吐量。实际上是浏览器完成加载整个文档时就退出,并安装一个on-demand timeout。

Favocado

binding layer:把javascript翻译成c++/c。特点:不同DOM对象之间是相对隔离的;
IDL定义了可以被js访问的接口。
现有的对binding layer的fuzzing存在的两个问题:①如何产生语法正确、语义正确的test case ②减小输入空间大小
要想触发binding code,至少需要两个步骤,即创建对象,设置对象属性或调用对象的函数。

减小输入空间大小——embedded awareness是怎么build in这个fuzzer的?

通过“DOM objects relation”,将输入空间划分为不同的等价类。基于此实现的fuzzer只改变每个等价类中的DOM对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值