当前位置:首页 > 科技  > 软件

一文掌握 Golang 模糊测试(Fuzz Testing)

来源: 责编: 时间:2023-08-05 11:46:02 5599观看
导读模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或错误,特别是容易被忽视的边界情况。模糊测试

wZF28资讯网——每日最新资讯28at.com

模糊测试(Fuzz Testing)

模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或错误,特别是容易被忽视的边界情况。模糊测试的基本思路是在测试过程中生成大量的随机数,然后将这些数据输入到被测试的程序中,监测程序的异常运行结果来分析程序中的缺陷和漏洞。wZF28资讯网——每日最新资讯28at.com

Golang 中的模糊测试

Golang 从 1.18 版本开始将模糊测试整合进了标准库,通过标准库 testing/fuzz 来实现模糊测试,Golang 引入模糊测试可以帮助开发者进一步保障和提高应用程序的安全性。wZF28资讯网——每日最新资讯28at.com

Golang 中的模糊测试是通过数据构造引擎自动构造出(也可以借助开发者提供的初始数据)大量随机数据,作为程序的输入来进行测试的一种方式。模糊测试会监测程序运行过程中是否出现 panic、断言失败、无限循环等异常情况。这些通过数据构造引擎生成的数据被称为语料(corpus) 。模糊测试是一种持续测试的手段,如果不限制执行的次数或者执行时间,就会一直执行下去。wZF28资讯网——每日最新资讯28at.com

模糊测试和单元测试类似的地方是测试文件也是以 _test.go 为后缀名,不同的是模式测试函数需要以 Fuzz 为前缀,后面跟上一个或多个字符或字符组合来标识测试用例的名称(一般使用被测的函数名称),参数必须是 f *testing.F。wZF28资讯网——每日最新资讯28at.com

看个例子

以 json 格式校验工具https://github.com/luduoxin/json-validator-go 为例,在 validator 包中的 scanner.go 文件中新增一个除法函数,代码如下:wZF28资讯网——每日最新资讯28at.com

func Div(a, b int) int {	return a / b}

这个函数显然没有考虑除数为 0 的情况,如果使用单元测试,使用的测试数据没有考虑除数为 0 的情况的话,这个问题就不会被发现,但是使用模糊测试就可以测出这种问题。然后在 validator 包中的 scanner_test.go 文件中添加模糊测试用例,代码如下:wZF28资讯网——每日最新资讯28at.com

func FuzzDiv(f *testing.F) {    f.Fuzz(func(t *testing.T, a, b int) {        Div(a, b)    })}

然后运行模糊测试用例,如下命令是运行所有模糊测试用例:wZF28资讯网——每日最新资讯28at.com

$ go test -fuzz .fuzz: elapsed: 0s, gathering baseline coverage: 0/2 completedfailure while testing seed corpus entry: FuzzDiv/120fad832ddff45a1b2b70e7a31805a5c8d84f773566e0d19799aeda53b3f9c0fuzz: elapsed: 0s, gathering baseline coverage: 0/2 completed--- FAIL: FuzzDiv (0.02s)    --- FAIL: FuzzDiv (0.00s)        testing.go:1349: panic: runtime error: integer divide by zero            goroutine 55 [running]:            runtime/debug.Stack()                /usr/local/Cellar/go/1.18.3/libexec/src/runtime/debug/stack.go:24 +0x90            testing.tRunner.func1()                /usr/local/Cellar/go/1.18.3/libexec/src/testing/testing.go:1349 +0x1f2            panic({0x119ccc0, 0x12ed080})                /usr/local/Cellar/go/1.18.3/libexec/src/runtime/panic.go:838 +0x207            github.com/luduoxin/json-validator-go/validator.Div(...)                /Users/ning/projects/go/json-validator-go/validator/scanner.go:634            github.com/luduoxin/json-validator-go/validator.FuzzDiv.func1(0x0?, 0x0?, 0x0?)                /Users/ning/projects/go/json-validator-go/validator/scanner_test.go:71 +0x33            reflect.Value.call({0x1199380?, 0x11d2428?, 0x13?}, {0x11c45aa, 0x4}, {0xc000188360, 0x3, 0x4?})                /usr/local/Cellar/go/1.18.3/libexec/src/reflect/value.go:556 +0x845            reflect.Value.Call({0x1199380?, 0x11d2428?, 0x514?}, {0xc000188360, 0x3, 0x4})                /usr/local/Cellar/go/1.18.3/libexec/src/reflect/value.go:339 +0xbf            testing.(*F).Fuzz.func1.1(0x0?)                /usr/local/Cellar/go/1.18.3/libexec/src/testing/fuzz.go:337 +0x231            testing.tRunner(0xc000180820, 0xc0001a83f0)                /usr/local/Cellar/go/1.18.3/libexec/src/testing/testing.go:1439 +0x102            created by testing.(*F).Fuzz.func1                /usr/local/Cellar/go/1.18.3/libexec/src/testing/fuzz.go:324 +0x5b8                FAILexit status 1FAIL    github.com/luduoxin/json-validator-go/validator 0.527s

用例执行了一会后就报出了除数不能为 0 的 panic。执行模糊测试的过程中会在当前文件夹生成 testdata 目录,导致用例没有通过的数据会保存在这个目录下,下次再次执行用例的时候会再次使用这些数据作为语料。wZF28资讯网——每日最新资讯28at.com

$ tree.├── scanner.go├── scanner_test.go└── testdata    └── fuzz        └── FuzzDiv            └── 120fad832ddff45a1b2b70e7a31805a5c8d84f773566e0d19799aeda53b3f9c0

打开未通过的语料内容,本机的数据如下(每个人执行的用例未通过的语料会有差异):wZF28资讯网——每日最新资讯28at.com

go test fuzz v1int(-89)int(0)

可以看出被除数是 -89,除数是 0,因为 0 不能作为除数,所以会报错。wZF28资讯网——每日最新资讯28at.com

提供自定义语料

Golang 的模糊测试允许开发者提供初始语料,初始语料可以通过 f.Add 方法添加,也可以将语料按照要求的格式写入 testdata/fuzz/FuzzXXX/ 中的语料文件中。重写 FuzzDiv 方法,添加一些语料,代码如下:wZF28资讯网——每日最新资讯28at.com

func FuzzDiv(f *testing.F) {	testcases := []struct {		a, b int	}{		{10, 2},		{5, 3},		{-6, 3},		{-6, -3},	}	for _, v := range testcases {		// 根据提供的语料,反射获得参数类型并穷举可能的值		f.Add(v.a, v.b)	}	f.Fuzz(func(t *testing.T, a, b int) {		Div(a, b)	})}

执行模糊测试用例的其他参数

可以使用 -fuzztime 参数来控制模糊测试的执行时间:wZF28资讯网——每日最新资讯28at.com

go test -fuzz . -fuzztime 5s

可以指定要执行的模糊测试用例:wZF28资讯网——每日最新资讯28at.com

go test -fuzz=FuzzDiv -fuzztime 5s

使用指定的未测试通过的数据做测试,使用 -run=file 指定数据文件:wZF28资讯网——每日最新资讯28at.com

go test -fuzz=FuzzDiv -run=FuzzDiv/378303d09d9499e4e6c708a92079f30db6f554529fd9eb86ac9a9639481fb23d

目前 Golang 的模糊测试支持被测函数使用的参数类型如下:wZF28资讯网——每日最新资讯28at.com

[]byte, string, bool, byte, rune, float32, float64, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64wZF28资讯网——每日最新资讯28at.com

模糊测试和单元测试的区别

单元测试需要开发者根据函数逻辑,给定一组或几组输入和输出数据,然后调用被测试函数执行,若返回值与输出数据一致,则说明函数测试通过。因为用于测试的数据是开发者提供的,难免会有遗漏的测试场景,因此即使单元测试通过,并不能说明程序是健壮的。而模糊测试是通过数据构造引擎自动构造出大量随机数据作为函数的输入参数,可以充分测试函数的健壮性。wZF28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-142-0.html一文掌握 Golang 模糊测试(Fuzz Testing)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 虚拟键盘 API 的妙用

下一篇: 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,“7
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top