模糊测试
本文约需 2 分钟阅读
模糊测试 (Fuzzing) 是一种安全测试方法,通过向软件自动输入大量随机或半随机数据,发现引发崩溃或异常行为的输入模式。在 Google 的 OSS-Fuzz 项目中,通过对开源软件进行持续模糊测试已发现 10,000 多个漏洞,截至 2025 年已有 1,000 多个项目参与其中。
发布前模糊测试所起的作用
模糊测试发挥威力的场合,是在库或应用程序发布之前的验证阶段。人工编写的测试主要围绕预期的输入构建,开发者想象不到的异常输入模式容易从验证中漏掉。模糊测试通过机械地生成并灌入大量随机、半随机的输入来弥补这一遗漏,让解析器中的缓冲区溢出这类引发崩溃或异常行为的输入,连同具体的复现步骤一起浮出水面。如果能在发布前发现这些缺陷,就可以在被攻击者于生产环境中利用之前,由开发方从容地进行修复。发现的输入模式还可以直接加入回归测试,防止同类缺陷再次出现。
模糊测试流程
准备种子输入 (正常的测试数据)
模糊器随机变异输入 (位翻转、插入、删除)
将变异后的输入投入目标程序
反馈覆盖率信息 (发现新的代码路径)
记录并分类崩溃、挂起和异常行为
模糊测试的种类
模糊测试大致分为三种。黑盒模糊测试是在不了解程序内部结构的情况下生成随机输入的最简单方法。白盒模糊测试通过分析源代码来生成使代码覆盖率最大化的输入。灰盒模糊测试通过反馈运行时的覆盖率信息来演化输入,AFL (American Fuzzy Lop) 和 libFuzzer 为代表。与渗透测试相结合,可以实现更全面的漏洞发现。
实务中的应用
模糊测试对处理外部输入的代码尤为有效,例如解析器 (JSON、XML、图像格式)、网络协议处理、文件输入输出等。将模糊测试集成到 CI/CD 流水线中持续执行的做法称为「持续模糊测试 (Continuous Fuzzing)」,与安全编码相结合,可以把避免引入漏洞的工序与找出已引入漏洞的工序放进同一个开发周期。请用强随机密码保护模糊测试环境和 CI/CD 系统的访问权限,防止测试结果被篡改。
这篇文章对您有帮助吗?