模糊测试的定义

维基百科的定义是:“模糊(fuzzing)或模糊测试(fuzzing testing)是一种自动化的软件测试技术,通过向计算机程序输入无效的、非期望的、随机的数据,来观察程序是否发生了崩溃、内部断言故障或潜在的内存泄漏等问题“。

演进到现在,模糊测试已经成为一种常用的应用程序安全测试,主要用来发现应用程序中的功能性缺陷、安全问题等。模糊测试已经被越来越的企业或组织所使用,CNCF 中的多个项目都在使用模糊测试,诸如 Argo,Envoy,Fluent-bit,Kubernetes 等,相应的模糊测试器也托管在 cncf-fuzzing Repo 中

模糊测试的历史

“模糊”(fuzz)这个术语最初是由 Barton Miller 教授在上世纪 80 年代创造的。Miller 教授在一次风暴中,通过拨号上网来远程登录了一个 Unix 系统,整个过程中在拨号链路上有大量的干扰噪音,导致使用外部数据的应用程序发生了崩溃。Miller 教授顺势给他在威斯康星大学的学生设置了一个项目,题目叫做操作系统实用程序的可靠性(Operating System Utility Program Reliability)。在 Fuzz Generator 中,学生要开发一个命令行 fuzzer,通过用随机数据轰炸 Unix 程序并监测任何异常或崩溃,从而来测试 Unix 程序的可靠性。

在模糊一词被创造之前,最早使用类似概念的是 1983 年 Steve Capps, 他开发了一个叫做“猴子”的应用程序。Steve 一直在编写一个工具,利用所谓的“Journaling Hook”方式,可以让电脑通过回放以前记录的动作来演示自己。这个软件被 Steve 重新利用来创造随机的鼠标点击和键盘输入,以测试 MacWrite 和 MacPaint 应用程序,在任何观察者看来,这就像一只看不见的猴子在无规律的使用电脑一样(这也是应用程序由此得名的原因)。

从 Miller 教授的偶然发现到现在,模糊测试已经发展成为了一种备受推崇的技术,用于测试软件在收到意外或无效输入时的可靠性。模糊测试现在主要被用来进行软件的安全性测试,众多供应商都在宣传自己广泛的模糊测试工作,旨在提高软件的健壮性。

模糊测试的好处

极狐GitLab模糊测试

模糊测试是极狐GitLabDevSecOps 功能中的其中一个安全功能,其他的安全功能有SAST、SCA、License 合规检测、密钥检测、容器镜像安全扫描、DAST、IAST。这些安全防护与保障能力能够覆盖软件生产全生命周期,助力用户快速打造高效、安全的 DevSecOps 体系。

极狐GitLab模糊测试支持对 C/C++、Golang、Rust、Java、Python 等语言的应用程序进行模糊测试。下面演示用极狐GitLab模糊测试来发现 golang 代码中的 index out of range 问题。Demo 仓库地址为:https://jihulab.com/fuzzing-testing/fuzzing-testing-demo 能够导致程序崩溃的代码示例如下:

package parser

func ParseComplex(data [] byte) bool {
	if len(data) == 6 {
		if data[0] == 'F' && data[1] == 'U' && data[2] == 'Z' && data[3] == 'Z' && data[4] == 'I' && data[5] == 'N' && data[6] == 'G' {
			return true
		}
	}
	return false
}

实际的 len(data) 是 7,而不是 6,在实际运行过程中会导致程序崩溃(crash)。而极狐GitLab的模糊测试是能够检测出这个问题的,并且可以将检测集成到 CI/CD 中:

image: golang:1.18

stages:
  - test
  - fuzz

format:
  stage: test
  tags:
    - fuzzing
  script:
    - go fmt
    - go vet
    - go test -race ./...

include:
  - template: Coverage-Fuzzing.gitlab-ci.yml
  - template: SAST.gitlab-ci.yml

my_fuzz_target:
    extends: .fuzz_base
    image: golang:latest
    tags:
      - fuzzing
    variables:
      COVFUZZ_SEED_CORPUS: './seed_corpus'
    script:
        - apt update && apt install -y clang
        - go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build
        - go install -v github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build
        - go-fuzz-build -libfuzzer -o my_fuzz_target.a .
        - clang -fsanitize=fuzzer my_fuzz_target.a -o my_fuzz_target
        - ./gitlab-cov-fuzz run --regression=$REGRESSION -- ./my_fuzz_target || true

当通过 MR 的方式提交代码的时候,会自动触发模糊测试,测试结果会在 MR 中展示:

fuzzing-report

可以看到在 Coverage Fuzzing 检测中有一个潜在的漏洞,级别是,原因是 index-out-of-range。可以通过点击漏洞来查看详情:

fuzzing-issue-creation

并通过新建 issue 的方式来对安全漏洞进行管理。在安全问题修复以后(例如将 len(data) == 6 改成 len(data) == 7),会再次触发模糊测试,在确认没有问题之后,就可以让 approver 进行代码合并了:

fuzzing-fix

当然,对于极狐GitLab来讲,所有的安全漏洞都会在同一个的面板上进行展示(可以通过安全与合规——漏洞报告来查看):

security-dashboard

在面板上通过工具选项,就能够找到用模糊测试(Coverage fuzzing)扫描出的安全漏洞,并且在下面会呈现详细信息。统一的面板展示能够做到安全信息的公开和透明,有助于不同团队通过协作来一起完成安全问题的修复。

以上整个流程演示了利用极狐GitLab模糊测试来完成基于代码覆盖率(Coverage)的模糊测试,并且利用极狐GitLab的代码审核、CI/CD、Issue 等功能完成了代码安全扫描——漏洞追踪管理——漏洞修复的安全漏洞闭环管理。

60天免费试用极狐GitLab专业版

极狐GitLab不仅是源代码管理或CI/CD工具,它是一个覆盖完整软件开发生命周期和DevOps的开放式一体化平台。

企业版试用
售前咨询
联系电话
在线支持
预约演示