Skyfire: 一种用于Fuzzing的数据驱动的种子生成工具

2023-11-19

Skyfire: Data-Driven Seed Generation for Fuzzing

作者:杨鑫 (清华大学)

论文发表于 IEEE S&P 2017,原文作者:Junjie Wang, Bihuan Chen, Lei Wei, and Yang Liu

摘要

对于输入格式是高度结构化文件的程序来说,其处理流程一般是:语法解析–语义检查–程序执行。程序深层次的漏洞一般隐藏在程序执行阶段,而对于自动化的模糊测试(Fuzzing)来说很难触发该类漏洞。

 

该论文提出了一种数据驱动的种子生成方法,叫做Skyfire。Skyfire通过从大量的已知样本中学习而生成覆盖良好的种子作为Fuzzing的输入对处理高度结构化输入的程序进行测试。Skyfire接收输入样本集合和文法,通过自动化学习PCSG(Probabilistic context-sensitive grammar,一种带概率的上下文有关文法,包含语义规则和语法特征),并利用其生成种子文件。

本文利用收集的样本和Skyfire生成的种子作为AFL的seed对开源的XSLT、XML等引擎进行测试,证明skyfire生成的种子文件分布(提高了20%行覆 盖率和15的函数覆盖率)和发现漏洞能力。同时也对闭源的IE11的JavaScript引擎测试。其发现了19个新的内存破坏型bug(其中16个新的漏洞)和32个拒绝服务bug。

背景介绍

Fuzzing是一种自动化的随机测试技术,其通过变异或者生成的方法生成大量的测试样本,并利用生成的测试样本对目标程序进行测试和监控,以发现程序异常和缺陷。

模糊测试的输入种子文件的质量是对测试效果的重要影响因素。如图1所示,基于变异的方法是通过随机或者启发式的方法对合法的输入种子文件进行变异生成测试用例,大部分的生成用例在早期的语法检查阶段就被拒绝而导致程序退出。然而,基于生成的方法是利用格式描述或文法描述来生成测试用例,可以快速的通过语法检查阶段,但是大部分程序在语义检查阶段也难以通过,这都限制了这些方法难以挖掘程序的深层次漏洞。一个高效的Fuzzer需要实现大部分的生成样本可以到达处理执行阶段(execution stage)。

 

图1 处理高度结构化输入的步骤

基于生成的方法能够实现对语法规则的描述和生成,但是想要通过语义规则的检查却是非常困难的。一方面,对于不同的程序有不同的语义规则,编写的生成规则难以复用;另一方面,这样的手动描述方法是非常耗时费力的,而且有时候甚至是难以实现的。

本文使用一种扩展的上下文敏感的文法(包含语义信息和概率信息)来生成测试用例,并将其作为Fuzzer的输入进行测试。Skyfire面向的目标程序是接收高度结构化输入的程序,目的是生成覆盖良好的测试用例。

方法概述

2.1 生成目标

(1)生成正确的种子:能够通过程序的语法和语义检测;

(2)生成多样性种子:能够多样化地覆盖语法和语义规则;

(3)生成不常见种子:能够生成一般Fuzzer生成不了的种子。

2.2 处理过程

Skyfire通过学习PCSG,可以生成覆盖良好的种子,供后续fuzzing,总体架构如图2所示。

输入:爬取的样本集合+程序的语法规则(github上ANTLR社区开源);

输出:覆盖良好的种子。

包含以下主要步骤:

  (1) PCSG学习

根据输入自动化抽取带概率的上下文有关文法规则;

2)种子生成

初始种子生成:根据抽取的规则采用左推导方法进行初始种子生成;

种子选取:采用覆盖率作为衡量标准进行样本去重选取;

种子变异:利用随机替换原则对同种类型的叶子节点进行变异;

图2 Skyfire的总体架构

下面详细介绍下这些主要步骤:

2.2.1 PCSG学习

这里是Skyfire的很重要的一点,为了更好理解这个过程,先介绍下CFG(Context-free grammar,上下文无关文法)、CSG(Context-sensitive grammar,上下文有关文法)。CFG的定义如图3,它是一个四元组,由一组有限的α→β1β2…βn形式的产生式规则组成。其中α∈N是有限的非终端符号集,βi属于一组有限的非终端符号和终端符号的并集。这套文法可以用来表示一个语言的语法规则。图4是XSL语言的上下文无关文法部分内容。

图3 CFG的定义

图4 XSL语言的上下文无关文法部分内容

根据上下文无关文法,可以将一个XSL文件解析为抽象语法树,图5就是一个XSL文件及其抽象语法树。上下文无关文法能很好地表达语法信息,但因为上下文无关,不能表达上下文相关的语义信息。

图5 一个XSL示例文件及其抽象语法树

因此,可以用上下文有关文法来加入语义信息。图6是作者定义的一种上下文有关文法,给产生式中增加了上下文信息。上下文包含四项信息,顺序依次为α的曾祖父母类型、祖父母类型、父类类型、第一兄弟姐妹的值或第一兄弟姐妹的类型(如果值为空的话)。

图6 CSG的定义

为了生成分布良好的种子,作者还将概率附加到每个产生规则的上下文中,来定义在一个上下文下,每种产生式规则的概率。这样,就有了本文的核心和一大创新点:带概率的上下文有关文法PCSG,可以将CFG、CSG和PCSG结合起来看,如图7所示。

图7 从CFG、CSG到PCSG的演进

PCSG的学习过程分为以下几步:

(1)自动从样本解析出AST;

(2)计算每种parent-children对(即产生式规则)在相应上下文下的次数;

(3)计算在一种上下文下的每种产生式规则的概率,等于在上下文c下这个产生式规则“α→β1β2…βn”的次数除以所有树中“α”的次数,公式如下:

q([c]α→β1β2…βn) = count([c]α→β1β2…βn)/count(α)

例如图8所示,绿色的节点5和节点14是父子对,对应的是上下文<null, document, prolog, <?xml>下的产生规则attribute Version=“1.0”,它对应的上下文为曾祖父为空,祖父母为文档,父为PROLOG,第一个兄弟为<?xml。图9是XSL语言学习的产生规则的一部分,在上下文<NULL、NULL、NULL、NULL>下只有两个产生规则的左边是document,这与document是XSL语言的开始符号这一事实是一致的。

图8 PCSG学习过程示例

图9 XSL语言学习的产生规则的一部分

2.2.2 种子生成

整个种子生成过程可以分为三步:初始种子生成、种子选择、种子变异。

1)初始种子生成

初始种子生成的算法

初始种子是根据学习出的PCGS,利用左推导方法生成种子输入产生的,算法也很清晰易懂,如图10所示。首先设置语法的起始符号t0,然后从t中获取最左边的非终结符l和上下文信息c,再从Rl中随机选取产生式规则r,再在t中对l进行r推导替换,重复这个过程直到没有剩余的非终端符号。

这里使用了四个启发式规则来生成分布良好的样本,我用不同颜色在算法中标示了出来。第一条红色代表优先选取低概率的产生规则,这样可以生成网上爬取的样本很难覆盖的功能;第二条是限制相同一产生规则的使用次数,优先应用频率低的规则;第三条是优先使用低复杂度的产生规则;第四条是限制所有规则的应用次数。

图10 从PCSG中产生初始种子的算法

2)种子选取

上面的步骤可以生成很多的初始种子,但并不是所有种子都是唯一和重要的,作者以覆盖率作为标准进行种子去冗余筛选,对于开源程序使用gcov获取代码和函数覆盖率,对于闭源程序使用PIN获取基本块覆盖率。

3)种子变异

上面的步骤可以产生语法结构多样的种子,为了进一步确保语义的多样性,SkyFire会对生成的种子进行Big-Step变异。这种Big-step的变异可以产生一般Fuzzer的small-step变异难以生成的种子。方法是从AST中选取叶子节点,并利用同种类型的叶子节点对其进行随机替换,只用右边是终结符的推导规则。

实验

实验利用爬取的种子文件对libxslt、libxml2、Sabotron进行测试,测试能够有效发现漏洞,并且漏洞持续发现能力比直接用爬取的种子文件进行测试效果更好。

此外,测试的覆盖率等得到明显的提升效果。目前该方法对JavaScript语言的测试效果不是特别理想,需要进一步的改进。

总结

本文实现的数据驱动的种子生成方法利用文法和样本自动抽取语义信息,并利用语义信息和语法规则进行种子生成,能够保证生成种子文件通过语法解析和语义检查,能够执行到目标程序的更深的路径,从而更有效的发现深层次的漏洞。

Skyfire目前对于XML、XSL语言的应用效果很好,能够保证漏洞发现能力和覆盖率,但是对于JS这种较为复杂的语言应用不够理想。

未来工作

作者将继续应用和扩展这种种子生成方法,以便更好地支持更多不同的语言,如javascript、SQL、C和java。除了查找安全漏洞之外,作者还希望使用生成的种子输入来查找编译器错误。

参考文献

  1. IEEE Symposium on Security and Privacy. “Skyfire: Data-Driven Seed Generation for Fuzzing”. 2017. https://www.youtube.com/watch?v=3_xOXFyDIuI&t=143s
  2. http://www.edu.cn/xxh/spkt/aq/201707/t20170706_1538333.shtml
  3. G1-2讨论班 2017. Skyfire-Data-Driven Seed Generation for Fuzzing. https://taolunban.github.io/2017-06-21-Skyfire-%20Data-Driven%20Seed%20Generation%20for%20Fuzzin

本文转自https://www.inforsec.org/wp/?p=2678

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Skyfire: 一种用于Fuzzing的数据驱动的种子生成工具 的相关文章

  • AFL测试网络协议

    关于AFL测试网络协议 xff0c 这篇文章写的很好 https www cnblogs com hac425 p 9416917 html
  • 漏洞挖掘-从任意文件读取漏洞到获取账户利用

    开篇 大家好 xff0c 我是承影战队的v1ct0ry xff0c 这次我为大家分享一次比较有趣的漏洞挖掘经历 这次挖掘过程是以灰盒挖掘为主要思想进行展开 xff0c 不熟悉的读者可以阅读上篇文章熟悉一下 一 任意文件读取 开局我们通过扫描
  • 物联网固件逆向分析记录(初步概念记录)

    20201206 1 引言 机缘巧合 自己居然有生之年又接触到了这个东西 但是多学点东西也没什么坏处 就当扩宽视野了 不过 以前这种事情 都没有记录 挺可惜的 所以这次记录一下 关于物联网固件的分析 涉及的东西还是很多的 可能某个领域的小伙
  • MIPI D-PHY的校准测试

    MIPI的校准环节类似于DDR中的读写训练 其目的都是为了满足最佳的眼图采样时刻 因此 在系统的传输速率很高 通道之间存在延时 设计中有外部干扰等等影响因素的时候 信号抖动将会被增强 此时 校准将对长时间的稳定运行起到关键的补偿作用 在MI
  • 从2023蓝帽杯0解题heapSpary入门堆喷

    从2023蓝帽杯0解题heapSpary入门堆喷 关于堆喷 堆喷射 Heap Spraying 是一种计算机安全攻击技术 它旨在在进程的堆中创建多个包含恶意负载的内存块 这种技术允许攻击者避免需要知道负载确切的内存地址 因为通过广泛地 喷射
  • Smartbi 修改用户密码漏洞

    漏洞简介 通过查看 Smartbi 的补丁包信息 发现存在漏洞在某种特定情况下修改用户的密码 进行简单的复现和分析 漏洞复现 在页面上修改密码时 需要知道原本的用户对应的密码 直接构造这样的数据包 就不需要知道原本的密码 知道用户名就可以修
  • 如何做一个人工智能聊天机器人的毕业设计

    毕业设计是大学生的必修课程之一 许多学生在毕业设计中选择了人工智能方向的课题 人工智能聊天机器人是一个很好的毕业设计课题 它涉及到自然语言处理 机器学习 深度学习等人工智能的核心技术 做好一个聊天机器人的毕业设计需要考虑好聊天机器人的功能
  • MIPI D-PHY的校准测试

    MIPI的校准环节类似于DDR中的读写训练 其目的都是为了满足最佳的眼图采样时刻 因此 在系统的传输速率很高 通道之间存在延时 设计中有外部干扰等等影响因素的时候 信号抖动将会被增强 此时 校准将对长时间的稳定运行起到关键的补偿作用 在MI
  • 栈溢出基本原理的简单讲解

    栈溢出基本原理的简单讲解 新手上路 大牛还请自行跳过 不足之处 欢迎批评指正 一 预备知识 缓冲区溢出简单介绍 缓冲区溢出 简单的说 缓冲区溢出就是超长的数据向小缓冲区复制 导致数据超出了小缓冲区 导致缓冲区其他的数据遭到破坏 这就是缓冲区
  • jmeter性能测试输出html报告

    前言 jmeter在界面模式下执行性能测试会占用大量的系统资源 导致测试数据不准确 为了减少系统资源的占用 我们建议在cmd 即非GUI模式 模式输入命令 进行性能测试 jmeter自带输出html测试报告功能 1 准备 写好脚本 2 在j
  • JMeter使用命令行模式生成HTML测试报告

    自动生成html图形化报告 win r 输入 cmd 说明 jmeter n t Jmx脚本位置 l 结果文件result jtl存放的位置 e o 生成HTML报告指定文件夹 n 表示non gui mode 就是非图形化模式 t 指定J
  • MIPS 指令

    MIPS 指令 指令 功能 应用实例 LB 从存储器中读取一个字节的数据到寄存器中 LB R1 0 R2 LH 从存储器中读取半个字的数据到寄存器中 LH R1 0 R2 LW 从存储器中读取一个字的数据到寄存器中 LW R1 0 R2 L
  • 如何正确使用示波器的温度延长线扩展功能

    电子产品的信号测试验证过程中 不可避免地 需要进行高低温工况下的信号完整性测试 但是 目前的高速有源探头的工作温度范围有限不足以直接使用 为此 诸如泰克 是德科技等仪器公司 都有相对应的测试解决方案 基本采用的是 焊接前端 温度延长线 有源
  • 黑盒测试方法:边界值分析具体步骤及实例

    边界值分析法也是黑盒测试方法之一 强调测试边界条件 而非等量类划分 其过程是确定输入值的最大值和最小值 然后将测试点置于这些极端值以及它们之间 使用边界值分析法可以揭示程序在处于边界条件时的bug 并能够更有效地完成测试工作 以下是该方法的
  • 立创开源

    一 项目说明 我们在使用单片机设计项目时经常需要用到ADC功能 但是众所周知 单片机是很脆弱的东西 一旦采样 分压后 的电压超过3 3v就会瞬间罢工 在烧毁4 5个单价不菲的单片机后我认为使用外部ADC很有必要 由此本项目诞生 二 原理图
  • 漏洞挖掘之乱拳打死老师傅——Fuzzer

    背景 Fuzzer是一种通过产生一系列非法的 非预期的或者随机的输入向量给目标程序 从而完成自动化的触发和挖掘目标程序中的安全漏洞的软件测试技术 相比于形式化的软件漏洞测试技术 比如 符号执行技术 Fuzzer往往能够在实际的应用中挖掘更多
  • Apache RocketMQ 远程代码执行漏洞(CVE-2023-33246)

    漏洞简介 RocketMQ 5 1 0及以下版本 在一定条件下 存在远程命令执行风险 RocketMQ的NameServer Broker Controller等多个组件外网泄露 缺乏权限验证 攻击者可以利用该漏洞利用更新配置功能以Rock
  • Skyfire: 一种用于Fuzzing的数据驱动的种子生成工具

    Skyfire Data Driven Seed Generation for Fuzzing 作者 杨鑫 清华大学 论文发表于 IEEE S P 2017 原文作者 Junjie Wang Bihuan Chen Lei Wei and
  • python---collections模块

    目录 namedtuple 具名元组 deque 双端队列 OrderedDict 有序字典 defaultdict 默认值字典 Counter 计数 在内置数据类型 dict list set tuple 的基础上 collections
  • 北京大学漏洞报送证书

    获取来源 edusrc 教育漏洞报告平台 url 教育漏洞报告平台 EDUSRC 兑换价格 30金币 获取条件 北京大学任意中危或以上级别漏洞

随机推荐

  • python 赋值/浅拷贝/深拷贝的区别

    在了解赋值 浅拷贝 深拷贝之前 需要预热一下python对象知识点 一 变量名字和对象 a 123 b 1 2 3 代码中 a和b是变量名称 123和 1 2 3 是对象 对象包括值和类型 python中 一切皆对象 对象占内存 内存中存放
  • 5、DML语句(数据操纵语言-增删改查)

    文章目录 一 DML语句介绍 二 insert 增加 插入数据 1 基本语法 2 示例 三 delete 删除表中的某行或者某些行数据 1 基本语法 2 示例 四 update 更新 修改 1 基本语法 2 示例 五 select 查询 1
  • 软件和建筑的结构

    一般都倾向于将软件比作建筑 因为建筑的架构和软件框架类似 好的建筑需要好的框架 但是大家忽略了另外一个情况 一个建筑要能居住 不但要好的建 筑风格和框架 更需要有好的家居和内部装修 建筑居住的舒适度很大程度上由内部装修细节决定的 装修时家居
  • 程序员,职场上请远离这种人!

    对有些职场人来讲 甩锅就是一种生存手段 01 从大学打篮球说起 上大学的时候喜欢打篮球 然后我又特别喜欢抢篮板 经常是跳起来的时候没事 落下来的时候偶尔会踩到别人的脚上 于是左脚经常性崴脚 这是背景 我们班上有一个同学也喜欢打篮球 我俩水平
  • 多媒体透明屏,在户外广告领域中,有哪些应用展示?

    多媒体透明屏是一种新型的显示技术 它能够将图像和视频直接投射到透明的屏幕上 使得观众可以同时看到屏幕后面的实物 这种技术在广告 展览 商场等场合有着广泛的应用前景 多媒体透明屏的原理是利用透明显示技术 将图像和视频通过光学投射技术投射到透明
  • 【C语言初学】作业:计算在贷款第一个月、第二个月、第三个月后需要还款金额

    贷款金额 20000 00元 年贷款利率 6 0 每个月还款金额 386 66 第一个月剩余的需还款金额 19713 34元 第二个月剩余的需还款金额 19425 25元 第三个月剩余的需还款金额 19135 71元 提示 每个月剩余的贷款
  • 深入浅出 sideEffects

    前言 最近在给团队对 webpack 中的 sideEffects 字段用途进行微分享 于是乎 我最后就整理成一篇文章 希望帮助更多的人理解 sideEffects 的作用 sideEffects 是什么呢 我用一句话来概括就是 让 web
  • redis 安装配置

    原文链接 https www cpweb top 1266 一 介绍 Redis 是一个开源的 基于内存的数据结构存储系统 它可以用作数据库 缓存和消息中间件 它是一个键值 Key Value 存储数据库 为非关系型数据库 它支持多种类型的
  • 在el-table的功能,并且在单元格里面加入输入框

    在我们的前端拿到后端返回的数据的时候 需要在el table的功能 并且在单元格里面加入输入框 为了让输入框的输入时候不会影响到其他的输入框 可以使用 input来获取输入框内容的值
  • python 多个logger对象使用,输出到多个文件

    就不介绍logger基础配置了 如何创建多个logger对象 输出到多个文件 import logging from datetime import datetime def get logger name logger logging g
  • 解决BookxNotePro在linux下无法启动或GLIBC_2.29‘ not found的问题

    问题描述如题 命令行启动出现如下报错 usr local BookxNotePro BookxNotePro usr local BookxNotePro BookxNotePro lib x86 64 linux gnu libm so
  • JS声明二维数组常见办法

    JS声明二维数组常见办法 目录 文章目录 前言 new Array 和 fill fill 灵活插入 for 笨办法 Array from 前言 目前论坛常见的办法代码质量奇差 因此针对这个问题进行整理 new Array和fill con
  • 使用机器学习算法打造一个简单的“微博指数”

    欢迎大家前往腾讯云技术社区 获取更多腾讯海量技术实践干货哦 作者 林浩威 前言 随着人工智能的大热 越来越多的小伙伴们开始投身到机器学习的大潮中 作为其中的一员 我对此也是极有兴趣的 当然我更感兴趣的 是怎么利用这些有趣的算法 来实现脑海里
  • element样式无法修改

    在使用el form组件时 组件中的字体是黑色的 需要显示白色字体就加了个color fff 结果发现修改并没有什么效果 还是原来的黑色 打开F12发现属于 el form item label选择器下面的 我就在css下面修改了该选择器
  • 端口占用查询

    我们做WEB开发 本地调试时 有时出现 Caused by java net BindException Address already in use bind at sun nio ch Net bind0 Native Method a
  • 机械孔与盲孔

    过孔是什么 过孔 Via 电路板上的孔 连接不同层之间的线路 把电路板从平面结构变成立体结构 单层线路想不交叉太难了 双层或更多层线路 必须通过过孔来连接 通过孔壁上的铜 连通上下层的电路铜线 单层PCB 有些时候无法布线 必须通过过孔换层
  • Chisel手册之Types

    本文是Chisel手册第二篇Types Types 表示硬件设计的Chisel图包含原始节点和类型节点 Chisel类型系统与底层Scala类型系统分开维护 因此类型节点散布在原始节点之间 以允许Chisel检查并响应Chisel类型 Ch
  • 微信小程序 实现底部导航栏tabbar

    参考链接 1 微信小程序底部导航Tabbar https www cnblogs com huangjialin p 6278429 html 2 小程序自定义tabbar实现中间图标突出效果 附带wx hideTabBar不生效的bug解
  • Spring Boot 启动报错解决:No active profile set, falling back to default profiles: default

    在SpringBoot启动时 控制台打印出来的信息有这么一条 No active profile set falling back to default profiles default 如下图 这句话的意思是 没有指定项目的配置文件 使用
  • Skyfire: 一种用于Fuzzing的数据驱动的种子生成工具

    Skyfire Data Driven Seed Generation for Fuzzing 作者 杨鑫 清华大学 论文发表于 IEEE S P 2017 原文作者 Junjie Wang Bihuan Chen Lei Wei and