Go Fuzzing:发现你未曾发现的漏洞

news/2024/4/20 0:48:48/文章来源:https://blog.csdn.net/hzb869168467/article/details/130350969

文章目录

  • Fuzzing(模糊测试)
  • 要求
  • 示例
    • 模拟crash
  • 总结
  • 参考资料

Fuzzing(模糊测试)

go fuzz文档

对于软件开发者而言,一项重要的任务就是确保程序的安全性。而其中一种风险就是软件中可能存在的漏洞。传统的测试方法往往需要耗费大量的时间和人力,而使用Fuzzing技术则可在短时间内大规模发现潜在的漏洞。

那什么是Fuzzing技术呢?简单说,它就是让程序自动生成大量随机的输入数据,然后运行被测试的程序,观察是否会出现异常行为。通过这种方式,Fuzzing技术可以快速发现和定位程序中的漏洞,帮助开发者提高程序的安全性。

那在Go语言中,如何使用Fuzzing技术呢?下面就让我们一起来了解一下。

Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。

在具体实现上,Fuzzing不需要像单元测试那样使用预先定义好的数据集作为程序输入,而是会通过数据构造引擎自行构造或基于开发人员提供的初始数据构造一些随机数据,并作为输入提供给我们的程序,然后监测程序是否出现panic、断言失败、无限循环等。这些构造出来的随机数据被称为语料(corpus)。另外Fuzz testing不是一次性执行的测试,如果不限制执行次数和执行时间,Fuzz testing会一直执行下去,因此它也是一种持续测试的技术。

Fuzzing是对其他形式的测试、代码审查和静态分析的补充,它通过生成一个有趣的输入语料库,而这些输入几乎不可能用手去想去写出来,因此极易被传统类型的测试所遗漏。Fuzzing可以帮助开发人员发现难以发现的稳定性、逻辑性甚至是安全性方面的错误,特别是当被测系统变得更加复杂时。

Go 1.18版本正式接受了原生支持Fuzzing这个特性,Fuzzing成为Go的“一等公民”。

要求

Go Fuzz结构如图:

image

模糊测试必须遵循下⾯的规则:

  1. 模糊测试函数名必须是 FuzzXxx ,参数是 *testing.F ,没返回值 ,如 func FuzzXxx(f
    *testing.F)

  2. 模糊测试必须放在以 *_test.go 后缀的⽂件中

  3. fuzz target 必须是调⽤ (*testing.F).Fuzz ,第⼀个参数 *testing.T , 后⾯是模糊测试的参数

  4. ⼀个模糊测试只能有⼀个fuzz target

  5. 种⼦语料(seed corpus )的数据类型必须和 fuzzing arguments⼀样,顺序⼀致。包括调⽤ (*testing.F).Add 增加种⼦语料,以及写在testdata/fuzz⽂件夹下语料
    fuzzing arguments 只能是下⾯的类型。如果你要测试复杂的struct,需要使⽤这些参数组装你的struct,然后进⼀步测试:

    • string , []byte
    • int , int8 , int16 , int32 / rune , int64
    • uint , uint8 / byte , uint16 , uint32 , uint64
    • float32 , float64
    • bool

示例

下面我们使用Fuzz对DNP3协议进行测试

func FuzzDnp3(f *testing.F) {f.Add([]byte{0x05, 0x64, 0x20, 0x44, 0x03, 0x00, 0x04, 0x00, 0x95, 0xe3, 0x85, 0x00, 0x01, 0x00, 0x00, 0x00,0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xef, 0xdc, 0x00, 0x01, 0x00, 0x00,0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x1f,})f.Fuzz(func(t *testing.T, data []byte) {Decode(data)})
}

可以使用命令运行

go test -v -fuzz  .

在Goland中也可以直接运行点击函数旁边的运行符号选择Fuzz进行运行,

D:\dev\Go\go1.20.1\bin\go.exe test -json app_go/pkg/dnp3 -fuzz ^\QFuzzDnp3\E$ -run ^$ #gosetup
kg/dnp3"}
=== RUN   FuzzDnp3
fuzz: elapsed: 0s, gathering baseline coverage: 0/23 completed
fuzz: elapsed: 0s, gathering baseline coverage: 23/23 completed, now fuzzing with 8 workers
fuzz: elapsed: 3s, execs: 99037 (32828/sec), new interesting: 1 (total: 24)
fuzz: elapsed: 6s, execs: 133383 (11479/sec), new interesting: 1 (total: 24)
fuzz: elapsed: 8s, execs: 133383 (0/sec), new interesting: 1 (total: 24)
--- PASS: FuzzDnp3 (8.02s)
PASS
ok  	app_go/pkg/dnp3	8.530s

fuzz testing默认会一直执行下去,直到遇到crash。如果要限制fuzz testing的执行时间,可以使用-fuzztime,比如下面的命令允许fuzz testing只执行10

go test -v  -fuzztime 10s -fuzz .

在上面fuzz执行过程中,Go fuzzing会将其缓存在cache路径下:

image

go fuzzing会为每个FuzzXxx函数建立对应的语料缓存。目前fuzz cache的默认路径为$GOCACHE/fuzz/包路径/FuzzXxx,后续可能会提供环境变量或cmd option,以允许开发人员自定义fuzzing语料的缓存路径。

fuzzing test默认会一直执行下去,如果不限制执行次数和执行时间,执行Fuzzing test的机器要有足够的存储才行。而要想清理过多的fuzz缓存,用gotip clean -cache是不行的,需要为clean加上**-fuzzcache**才可以清除fuzz的cache。

模拟crash

当我们在代码中模拟一个crash的产生来看看:fuzzing test过程中发现代码bug时

我们看到go fuzzing在执行测试时就发生crash,fuzzing将crash输出了crash报告,并将引发这一crash的语料放入了testdata/fuzz/FuzzSubmit目录下:

image

=== RUN   FuzzDnp3
fuzz: elapsed: 0s, gathering baseline coverage: 0/24 completed
failure while testing seed corpus entry: FuzzDnp3/seed#13
fuzz: elapsed: 0s, gathering baseline coverage: 12/24 completed
--- FAIL: FuzzDnp3 (0.22s)--- FAIL: FuzzDnp3 (0.00s)testing.go:1485: panic: interface conversion: cache.Value is nil, not *dnp3.DNP3goroutine 28 [running]:runtime/debug.Stack()D:/dev/Go/go1.20.1/src/runtime/debug/stack.go:24 +0x9etesting.tRunner.func1()D:/dev/Go/go1.20.1/src/testing/testing.go:1485 +0x1f6panic({0xec5240, 0xc0001149c0})D:/dev/Go/go1.20.1/src/runtime/panic.go:884 +0x213app_go/pkg/dnp3.Decode({0xc00017e140, 0x124, 0x140})D:/workspace/project/**/pkg/dnp3/dnp3.go:137 +0xf49app_go/pkg/dnp3.FuzzDnp3.func1(0x0?, {0xc00017e140?, 0x0?, 0xc182f9?})D:/workspace/project/**/pkg/dnp3/dnp3_test.go:254 +0x45reflect.Value.call({0xeba2c0?, 0xf2f248?, 0xbff076?}, {0xf00b82, 0x4}, {0xc000114960, 0x2, 0x2?})D:/dev/Go/go1.20.1/src/reflect/value.go:586 +0xb07reflect.Value.Call({0xeba2c0?, 0xf2f248?, 0x107dd00?}, {0xc000114960?, 0xf00080?, 0xc000112678?})D:/dev/Go/go1.20.1/src/reflect/value.go:370 +0xbctesting.(*F).Fuzz.func1.1(0x0?)D:/dev/Go/go1.20.1/src/testing/fuzz.go:335 +0x3f3testing.tRunner(0xc0001249c0, 0xc00012a630)D:/dev/Go/go1.20.1/src/testing/testing.go:1576 +0x10bcreated by testing.(*F).Fuzz.func1D:/dev/Go/go1.20.1/src/testing/fuzz.go:322 +0x5b9FAIL
exit status 1
FAIL	**/dnp3	0.597s进程 已完成,退出代码为 1

如果是真实的fuzz测试引发了crash,我们可以将该语料提取出来,建立针对它的TestXxx或为现有TestXxx添加一条测试数据来验证目标方法是否真实存在缺陷,如果的确存在缺陷,我们就需要修复它,并在修复后再次运行TestXxx,以保证我们的修复是有效的。

总结

Go fuzzing正式成为Go的“一等公民”,Go原生支持Fuzzing。我们可以利用fuzzing发现bug和安全问题。

参考资料

  1. fuzz-beta
  2. go.dev/doc/tutorial/fuzz
  3. fuzz

推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103116.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4月21号软件更新资讯合集.....

PlayEdu v1.0-beta.3 发布,视频培训解决方案 PlayEdu 是基于 SpringBoot3 Java17 React18 开发的企业内部培训系统。它专注于提供私有化部署方案,包括视频,图片等资源的内网部署。目前主要支持有本地视频上传播放、学员邮箱登录、无限级部门…

多数据源 使用 mybatis-plus-generator 3.5.1版本进行代码生成

文章目录 前言多数据源 使用 mybatis-plus-generator 3.5.1版本进行代码生成1. 说明2. 添加依赖2.1. mybatis-plus-generator 自动生成依赖2.2. 多数据源依赖2.3. 建立新项目的完全pom.xml 3. application.yml 多数据源配置 mybatis-plus-generator配置4. 创建一个MybatisPlus…

多通道振弦传感器无线采集仪 数字传感器起始通道分配

多通道振弦传感器无线采集仪 数字传感器起始通道分配 寄存器 DS_CHNUM(299)用于设置读取到的数字传感器数据从哪个通道开始占用,默认为 1。 单个数字传感器占用的通道数量与具体的传感器类型有关,例如:每个激光测距仪会占用 1 个通道&#xf…

Python爬虫之MongoDB

目录 一、Mongo概述 二、安装&下载 1.下载: 2.安装 三、基本命令 插⼊数据 查询数据 修改数据 删除数据 索引 四、Python与MongoDB交互 1.安装pymongo 2.使⽤ 一、Mongo概述 MongoDB是什么? MongoDB是⾮关系型数据库(No sql) 为啥需要…

基于C#asp.net心里咨询服务网站系统

功能模块: 主要分为管理员和注册用户,注册用户可以查看所有人发布的心里文章,情感在线问答,查询相似问题,以及进入论坛进行交流(发帖跟帖评论收藏等)后台管理主要是针对个人信息修改 管理员对注…

商品价格监控业务场景,API数据分析

商品价格监控指的是对特定商品价格进行实时监控和跟踪,及时更新最新价格并分析价格变化的行为。这种监控可以帮助企业及时了解市场行情,并根据价格变化情况做出相应的调整,以更好地应对市场变化。 一般来说,商品价格监控需要以下…

KVM虚拟机的磁盘无损扩容方法-qcow2格式的

起因:我的KVM主机上安装了基于Debian11的 虚拟机母鸡,其他虚拟机都由此克隆而来。因为最初只配置了8G的虚拟硬盘,因此在需要占用比较大的空间的应用时,就比较麻烦。度娘等中文搜索结果没找到答案,只能google了。 这里…

JavaScript概述四(DOM文档对象模型)

1.DOM(Document Object Model) 会把网页里面的元素当成对象去操作,包含对象的属性,属性值,方便我们去 操作网页。 整个页面最终会形成一个对象 :document ,页面里面的所有的元素(如 标签 ) 最终都会转换成 js 里面的对象。 1.1 获取页面的元素(通过选择器&#xff0…

JS-11A/224时间继电器 JOSEF约瑟 板前、板后接线

系列型号: JS-11A/11集成电路时间继电器;JS-11A/12集成电路时间继电器; JS-11A/13集成电路时间继电器;JS-11A/136集成电路时间继电器; JS-11A/137集成电路时间继电器;JS-11A/22集成电路时间继电器&#…

数据结构与算法(三):数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、B+Tree、赫夫曼树、堆树)

数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树) 树形结构概念 在树形结构里面重要的术语: 结点:树里面的元素。 父子关系:结点之间相连的边 子树:当结点大于1时&#xff0…

华为OD机试真题(Java),数字涂色(100%通过+复盘思路)

一、题目描述 疫情过后,希望小学终于又重新开学了,三年二班开学第一天的任务是将后面的黑板报重新制作。 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色。 为了让黑板报既美观又有学习意义,老师要求同种颜色的…

LoadRunner参数化最佳实践:让你的性能测试更加出色!

距离上次使用loadrunnr 已经有一年多的时间了。初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作。这算…

QMS-云质说质量 - 1 张小泉的质量危机

云质QMS原创 转载请注明来源 作者:王洪石 引言 百年老店的拍蒜质量门 最近张小泉拍蒜断刀事件,吸引了全民关注,虽然随后发布了“断刀召集令”,但从事件发生到后续拖沓且不专业的应对,张小泉肯定是“失蒜”了。 张小泉…

Spring Security实战(六)—— 跨域与CORS

跨域是一种浏览器同源安全策略,即浏览器单方面限制脚本的跨域访问。 一、认识跨域 跨域(Cross-Origin)指的是在Web开发中,当一个网页的内容要从不同源(即不同的域名、协议或端口)获取时,就会发…

ajax的介绍及使用

ajax的介绍 开发流程 前端 ajax:前后端沟通的桥梁 后端 ajax介绍 ajax叫做异步的Javascript和xml ajax通过浏览器与服务器(后端)进行少量数据交互,进行页面异步更新(网页不会重新加载) 优点: 减轻服务器负…

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页---前后端分离)、axios加载失败)

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页—前后端分离)、axios加载失败) Vue cli CLI是Commond-Line Interface,翻译为命令界面,又称脚手架。VueCLI是一个官方发布vue.js项目脚手架。使用VueCLI可以快速搭建vue开发…

v-for比v-if优先级更高?面试官:回去等通知吧

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 v-if和v-for哪个优先级更高呢?这是面试官常常问到的一个问题,…

算法训练 Day41 | 动态规划

343. 整数拆分 思路: 确定dp数组(dp table)以及下标的含义:dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。 确定递推公式:dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

3.Spring Security实现JWT token验证

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT(JSON Web Token,JSON令牌) 5. Spring Security安全注解 Spring Security实现JWT token验证 Spring Security是Spring提供的一…

【Spring篇】DI相关内容

🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、setter注入 1.环境准备 2.注入引用数据类型 3.注入简单数据类型 二、构造器注入 1.环境准备 2.构造器注入引用数据类型 3.构造器注入多个引用数据类型 4.构造器注入多个简单数据类型 …