作者:Adam Korczynski、David Korczynski、Sahdev Zala
在过去的几个月里,Ada Logics[1]的团队致力于将连续模糊测试(fuzzing)集成到 etcd 项目中。这一努力的重点是改善 etcd 的安全状况,并确保 etcd 用户持续获得良好的体验。fuzzing 集成包括将 etcd 加入 OSS-Fuzz 项目,并编写一套 fuzzer,将 etcd 的测试覆盖提升到一个成熟的水平。总共编写了 18 个 fuzzer,并发现了 8 个 bug,这证明了该工作对 etcd 的短期和长期价值。所有的 fuzzer 都是通过 go-fuzz 实现的,当运行在 OSS-Fuzz 时,通过 libFuzzer 进行仪器化,因此,etcd 使用了最先进的开源 fuzzer 功能。完整报告可以在这里[2]找到。
etcd 项目于 2013 年在 CoreOS 创立,随后于 2018 年加入 CNCF,并于 2020 年毕业[3]。它是一种开源的、强一致性的分布式键值存储,用于可靠地存储分布式系统或机器集群需要访问的数据。它还提供了非常理想的功能,比如 Watches 监视键的变化。etcd 是 Kubernetes 的一个关键组件,用作集群数据的主要数据存储,例如集群状态数据以及与其所需状态相关的数据。etcd 除了是 Kubernetes 的关键组件外,还在许多其他分布式系统所使用[4]。由于 etcd 的广泛使用,它是解决可靠性 bug 和安全漏洞的开源生态系统的关键部分。CNCF 2021 年的年度调查[5]发现,96%的公司正在使用或评估 Kubernetes,etcd 的性能和安全性对这些用户的持续业务运营非常重要。
Fuzzing(模糊测试)是一种通过压力测试的形式来自动化软件测试过程的技术。关键思想是编写一个类似于单元测试或集成测试的 fuzzing 工具,它将使用一些任意的输入来执行被测试的应用程序。fuzzing 引擎将运行 fuzzing harness,然后使用遗传算法来推断将导致测试中的代码执行唯一的输入,即生成触发新的代码执行路径的输入。目标是观察在任何生成的输入事件中,测试下的代码是否有错误行为。二十多年来,Fuzzing 在发现软件的可靠性缺陷和漏洞方面一直很有效,开源软件也越来越多地采用了这种技术。
在这个项目中,我们的目标是编写一套涵盖 etcd 大量代码库的 fuzzer,并将其集成到开源 fuzzing 服务 OSS-Fuzz 中。OSS-Fuzz 是谷歌为关键的开源项目提供的一项免费服务,用于持续运行它们的 fuzzing 并报告任何崩溃。连续分析是重要的,因为模糊测试依赖于遗传算法,这有效地意味着模糊器将随着时间的推移而改进,OSS-Fuzz 将不断地每天运行模糊器。除此之外,持续的分析对于捕获任何回归(regression)都是至关重要的。
Etcd 是用 Go 编程语言编写的,这使得它不受内存损坏的影响。Fuzzing Go 会发现一些恐慌,如切片/索引超出范围、空指针解引用、无效类型断言、超时、内存不足。在这次接触结束时,发现了 8 个问题,所有这些问题都得到了解决。它们是这样分类的:
在这个项目的最后,fuzzer 提供 etcd 项目的重要覆盖,包括关键部分,如 etcd 服务器、WAL、认证存储、和 raft 包。在参与过程中,Ada Logics 发现 etcd 中只有少数关键部分可以用字节片或字符串访问,但可以接受复杂类型,如结构体。这方面的一个例子是etcd 服务器的 fuzzer[6],它配置和设置 etcd 服务器,然后创建一系列伪随机结构,表示发送到服务器的不同请求。为了编写这些 fuzzer,Ada logic 使用go-fuzz-headers[7]来确定地从 libFuzzer 提供的数据创建伪随机结构。
etcd 团队非常感谢 CNCF 和 Chris Aniszczyk 为 etcd 提供了与 Ada logic 合作开发新的 fuzzer 的机会。CNCF 对软件安全问题非常重视,并在早期资助 etcd 项目进行第三方安全审计[8]。我们还要感谢所有 etcd 维护人员和评审员,特别是 Marek Siarkowicz、Piotr Tabor 和 Benjamin Wang,感谢他们对修复的快速评审。这些模糊测试的发现和修复是对之前安全审计结论的有价值的补充。Etcd 项目有有效的测试套件,并且代码更改由测试支持,但是新开发的模糊器和发现为项目提供了重要的价值。在 fuzzing 过程中,仅发现了 8 个问题,再次验证了 etcd 代码的高质量。etcd 团队会维护新开发的 fuzzer,并在其基础上继续开发代码质量和安全性。
[1]Ada Logics: https://adalogics.com/
[2]完整报告: https://github.com/etcd-io/etcd/blob/main/security/FUZZING_AUDIT_2022.PDF
[3]毕业: https://www.cncf.io/announcements/2020/11/24/cloud-native-computing-foundation-announces-etcd-graduation/
[4]许多其他分布式系统所使用: https://etcd.io/docs/v3.5/integrations/#projects-using-etcd
[5]CNCF 2021 年的年度调查: https://www.cncf.io/reports/cncf-annual-survey-2021
[6]etcd 服务器的 fuzzer: https://github.com/cncf/cncf-fuzzing/blob/main/projects/etcd/etcdserver_fuzzer.go
[7]go-fuzz-headers: https://github.com/AdaLogics/go-fuzz-headers
[8]第三方安全审计: https://www.cncf.io/blog/2020/08/05/etcd-security-audit/