乐趣区

关于安全:能够发现零日漏洞模糊测试威力几何

含糊测试作为一种平安防护伎俩,被越来越多的企业或组织用来构建应用程序平安防护体系,诸如时下火爆的云原生中,泛滥开源我的项目就采纳了通过集成含糊测试的形式来发现安全漏洞(尤其是零日破绽),从而进步我的项目品质。

含糊测试的定义

维基百科的定义是:“含糊(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 传授的偶尔发现到当初,含糊测试曾经倒退成为了一种备受推崇的技术,用于测试软件在收到意外或有效输出时的可靠性。含糊测试当初次要被用来进行软件的安全性测试,泛滥供应商都在宣传本人宽泛的含糊测试工作,旨在进步软件的健壮性。

含糊测试的益处

  • 保障利用平安 :含糊测试是以“think like a hacker“的思路来实际的平安测试伎俩,可能发现惯例检测办法难以发现的问题,诸如难以发现的“零日破绽”(zero-day vulnerabilities)等,进一步保障了应用程序的平安。
  • 低成本高效率 :一旦含糊测试器(fuzzer)运行起来当前,就能够在无需人为干涉的状况下继续一直的对应用程序进行自动化的平安测试,而且可能尽早的发现平安问题,不便相干人员在软件开发的晚期尽快解决平安问题,整体的修复老本会大大降低。

极狐 GitLab 含糊测试

含糊测试是极狐 GitLab DevSecOps 性能中的其中一个平安性能,其余的平安性能有 SAST、SCA、License 合规检测、密钥检测、容器镜像平安扫描、DAST、IAST。这些平安防护与保障能力可能笼罩软件生产全生命周期,助力用户疾速打造高效、平安的 DevSecOps 体系。

极狐 GitLab 含糊测试反对对 C/C++、Golang、Rust、Java、Python 等语言的应用程序进行含糊测试。上面演示用极狐 GitLab 含糊测试来发现 golang 代码中的 index out of range 问题。Demo 仓库地址为:https://jihulab.com/fuzzing-t…。可能导致程序解体的代码示例如下:

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 中展现:

能够看到在 Coverage Fuzzing 检测中有一个潜在的破绽,级别是低,起因是 index-out-of-range。能够通过点击破绽来查看详情:

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

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

在面板上通过工具选项,就可能找到用含糊测试(Coverage fuzzing)扫描出的安全漏洞,并且在上面会出现详细信息。对立的面板展现可能做到平安信息的公开和通明,有助于不同团队通过合作来一起实现平安问题的修复。

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

退出移动版