在「DevSecOps 软件安全开发实践」课程上,极狐(GitLab) 高级测试工程师衡韬、极狐(GitLab) 高级后端开发工程师田鲁,分享了模糊测试的概念、必要性和在极狐 GitLab 上的实践。
以下内容整理自本次直播,你也可以点击👉观看视频回放。Enjoy~
随着网络应用的普及,人们越来越关注软件安全性、稳定性和软件质量问题。而软件系统也越来越复杂,即使经过仔细测试的软件也时有 Bug 逃逸。为了解决这一问题,模糊测试作为一种高效测试方法,被广泛关注和研究。
模糊测试(Fuzzing Test)一种黑盒/灰盒软件测试技术,通过提供随机输入来检测程序中的错误、漏洞等,帮助发现程序中的边界条件错误、内存泄漏、缓冲区溢出等潜在问题,验证软件功能的正确性、稳定性与健壮性,进而提高系统安全性。
API 模糊测试是模糊测试的典型应用。在 API 成为现代软件架构的基础与关键的背景下,作为评估 API 安全性有力手段的 API 模糊测试的重要性不言而喻。
这里延展分享软件测试中常用的测试方法论:一般分为有黑盒测试、白盒测试和灰盒测试。它们的区别在于测试人员对系统内部结构的了解程度:
而模糊测试的测试用例与数据是随机生成的,不依赖于软件内部结构与实现,测试人员无需完全了解软件内部逻辑。因此,模糊测试属于黑盒或者灰盒测试,且即使不熟悉代码本身的测试人员也可以承担相应工作。
不同角色的人进行模糊测试时,视角和关注点也不同,举个例子:
开发同学更关注代码逻辑,通常根据软件内部的实现逻辑及其可能的漏洞与问题点来设计模糊测试方案。如下图,开发同学有可能直接针对代码或接口进行测试,而忽略外部依赖或上下文。
测试同学更关注业务逻辑,通常根据软件的业务逻辑、外部接口与用户场景来设计模糊测试方案。如下图,测试同学会生成真实仓库,设置多个参数值,提交包含文件变更的 commit 等,尽量更贴近实际用户操作。
安全工程师则更关注风险,通常会设计模糊测试方案来发现各种潜在的安全漏洞,更关注危害严重的问题。
理解各个测试角色的优势与局限,通过沟通协作来弥补各自的不足,精心设计全面而有针对性的测试方案,是发挥模糊测试甚至任何测试技术最大效用的要素之一。
模糊测试主要可以分为以下 6 个步骤:
其中 1-5 步与传统测试工作流程高度相似度,在步骤 6:结果记录与分析上,传统测试和模糊测试是完全不同的:
另外一个不同之处在于,模糊测试难以用人工介入。主要因为:
现代软件系统基于微服务架构,大量使用 API 进行服务调用与集成。API 的安全性直接决定整体系统的安全性,所以 API 模糊测试是评估系统安全性的关键一环。
很多企业都在使用敏捷开发,要求更短的更新周期和更高的发布频率。这增加了由于疏忽或考虑不周导致安全漏洞的概率。
而敏捷标准下,每一个迭代都是一个可用的产品,必须关注安全性;同时,无论是安全性缺陷抑或可用性缺陷,越早修复,成本越低。
因此,应用 API 模糊测试进行持续监测是一个很好的选择,确保快速迭代不会引入高危漏洞。
如前文所言,模糊测试通过提供随机输入来检测程序中的错误、漏洞等。而 API 输入域往往过于庞大,人工很难考虑每一种输入的安全性。
API 模糊测试可以随机产生海量测试数据来尽可能覆盖所有输入场景,检验 API 的健壮性。
在开发过程中应用模糊测试的益处显而易见,可以在 QA 同学进行测试之前,极早发现问题并解决问题,减少双方沟通成本和时间。
在极狐 GitLab 上,API 模糊测试目前支持以下几种格式:
接下来,以 OpenAPI 为例,分享 API 模糊测试在极狐 GitLab 上的实践,主要有以下 6 个步骤:
模糊测试属于安全测试的一部分。
如下图,在极狐 GitLab 新建项目 → 安全与合规→ 安全配置 → API 模糊测试 → 填写目标地址 + 选择扫描模式 + OpenAPI 规范文件路径 + 是否身份验证 + 扫描轮廓(例如,有一个接口,三个参数,示例中每个参数生成 20 个不同类型参数内容,来请求该接口,测试该接口是否稳定健壮。)→ 生成代码片段,即可放入 CI 运行测试。
如下图所示,极狐 GitLab 项目中自带模板:API-Fuzzing·gitlab-ci.yml ,其主要作用是:
Build 阶段构建测试环境与准备测试数据;
Fuzz 阶段则专门执行模糊测试。
如下图展示了一个很典型的 CRUD(增删改查) 接口组合,包含 GET 和 PUT 两个接口:
下图是极狐 GitLab API 模糊测试基于接口的定义自动生成相应的测试内容,主要包括:
如下图,极狐 GitLab API 模糊测试的执行流程大致如下:
最终总共是执行 259 个 API 请求。
如下图,示例一共是写 4 个接口,最终总共是执行 259 个 API 请求,平均每个接口大超过 60 个请求。可见模糊测试可以通过大量自动化测试来检测 API 接口健壮性,大幅提升测试效率,尽早解决问题。
以上就是关于 API 模糊测试的内容与实践,希望今天的分享对大家有帮助!