乐趣区

关于devops:模糊测试不模糊高效发掘未知漏洞与-0day-攻击

近日,在「DevSecOps 软件平安开发实际」课程上,极狐(GitLab) 高级测试工程师衡韬、极狐(GitLab) 高级后端开发工程师田鲁,分享了含糊测试的概念、必要性和在极狐 GitLab 上的实际。

以下内容整顿自本次直播,你也能够点击👉观看视频回放。Enjoy~

随着网络应用的遍及,人们越来越关注软件安全性、稳定性和软件品质问题。而软件系统也越来越简单,即便通过认真测试的软件也时有 Bug 逃逸。为了解决这一问题,含糊测试作为一种高效测试方法,被宽泛关注和钻研。

什么是含糊测试?

概念

含糊测试(Fuzzing Test)一种黑盒 / 灰盒软件测试技术,通过提供 随机输出 来检测程序中的谬误、破绽等,帮忙发现程序中的边界条件谬误、内存透露、缓冲区溢出等潜在问题,验证软件性能的正确性、稳定性与健壮性,进而进步零碎安全性。

API 含糊测试是含糊测试的典型利用。在 API 成为古代软件架构的根底与要害的背景下,作为评估 API 安全性无力伎俩的 API 含糊测试的重要性显而易见。

常见测试方法论

这里延展分享软件测试中罕用的测试方法论:个别分为有黑盒测试、白盒测试和灰盒测试。它们的区别在于测试人员对系统内部结构的理解水平:

  • 黑盒测试:只根据需要与性能进行测试,测试人员不须要理解内部结构与实现;
  • 白盒测试:根据构造与代码进行测试,测试人员须要齐全理解或管制内部结构;
  • 灰盒测试:介于黑白盒测试之间,测试人员对局部内部结构有所理解,测试既思考输入与性能,也关注测试覆盖率。

而含糊测试的测试用例与数据是随机生成的,不依赖于软件内部结构与实现,测试人员无需齐全理解软件外部逻辑。因而,含糊测试属于黑盒或者灰盒测试,且即便不相熟代码自身的测试人员也能够承当相应工作。

不同角色的人进行含糊测试时有何不同?

不同角色的人进行含糊测试时,视角和关注点也不同,举个例子:

开发同学更关注代码逻辑,通常依据软件外部的实现逻辑及其可能的破绽与问题点来设计含糊测试计划。如下图,开发同学有可能间接针对代码或接口进行测试,而疏忽内部依赖或上下文。

测试同学更关注业务逻辑,通常依据软件的业务逻辑、内部接口与用户场景来设计含糊测试计划。如下图,测试同学会生成实在仓库,设置多个参数值,提交蕴含文件变更的 commit 等,尽量更贴近理论用户操作。

平安工程师则更关注危险,通常会设计含糊测试计划来发现各种潜在的安全漏洞,更关注危害重大的问题。

了解各个测试角色的劣势与局限,通过沟通合作来补救各自的有余,精心设计全面而有针对性的测试计划,是施展含糊测试甚至任何测试技术最大效用的因素之一。

含糊测试 VS 传统测试

含糊测试次要能够分为以下 6 个步骤:

  1. 辨认指标零碎;
  2. 辨认输出;
  3. 生成含糊数据;
  4. 应用含糊数据执行测试;
  5. 监控零碎行为;
  6. 后果记录与剖析。

其中 1-5 步与传统测试工作流程高度类似度,在步骤 6:后果记录与剖析上,传统测试和含糊测试是齐全不同的:

  • 传统测试的后果剖析,关注预期后果,确认是否实现需求。例如测试是否失常登录零碎,失去的后果是失常登录或不能失常登录。
  • 含糊测试的后果剖析,更关注意外后果与异样行为,偏重发现未知破绽。在上述例子中,含糊测试则是寻找和剖析让登录零碎解体的起因。换句话说,含糊测试更关注被测系统的稳定性和健壮性,不在意零碎的业务行为正确性。

另外一个不同之处在于,含糊测试难以用人工染指。次要因为:

  • 含糊测试产生海量随机测试用例,使得人工判断与染指每个用例变得不事实;
  • 含糊测试产生的大量测试后果须要判断预期与异样,人工难以完成,须要依附高度自动化的算法来剖析分类。

为什么要做 API 含糊测试?

API 已成为基础架构

古代软件系统基于微服务架构,大量应用 API 进行服务调用与集成。API 的安全性间接决定整体零碎的安全性,所以 API 含糊测试是评估零碎安全性的要害一环。

疾速公布需要进步

很多企业都在应用麻利开发,要求更短的更新周期和更高的公布频率。这减少了因为忽略或考虑不周导致安全漏洞的概率。

而麻利规范下,每一个迭代都是一个可用的产品,必须关注安全性;同时,无论是安全性缺点抑或可用性缺点,越早修复,老本越低。

因而,利用 API 含糊测试进行继续监测是一个很好的抉择,确保疾速迭代不会引入高危破绽。

人工不可能齐全笼罩 API 输出

如前文所言,含糊测试通过提供随机输出来检测程序中的谬误、破绽等。而 API 输出域往往过于宏大,人工很难思考每一种输出的安全性。

API 含糊测试能够随机产生海量测试数据来尽可能笼罩所有输出场景,测验 API 的健壮性。

API 含糊测试在极狐 GitLab 上的实际

在开发过程中利用含糊测试的好处不言而喻,能够在 QA 同学进行测试之前,极早发现问题并解决问题,缩小单方沟通老本和工夫。

反对格局

在极狐 GitLab 上,API 含糊测试目前反对以下几种格局:

  1. OpenAPI 标准(版本 2 和 3):这是 API 文档行业标准,极狐 GitLab 能够间接导入 OpenAPI 文件并主动生成含糊测试计划。
  2. GraphQL Schema:图查询语言,近年风行的一种查问语句。极狐 GitLab 反对导入 GraphQL Schema 来定义 API 接口,并基于此生成含糊测试计划与用例。
  3. HTTP 存档(HAR):通 HAR 文件格式用来存储 HTTP 交易的定期快照,蕴含残缺申请和响应数据。极狐 GitLab 能够导入 HAR 文件,解析其中的申请与响应详情,并主动生成相应的 API 测试用例与含糊测试计划。
  4. Postman 汇合:出名 API 测试工具,其反对以合集格局导出 API 申请与环境等信息,文件能够间接在极狐 GitLab 上导入,极狐 GitLab 可主动解析其中的 API 申请与环境参数详情。

接下来,以 OpenAPI 为例,分享 API 含糊测试在极狐 GitLab 上的实际,次要有以下 6 个步骤:

  1. 在极狐 GitLab 新建我的项目,把相干 API 代码和文档填入我的项目;
  2. 装置极狐 GitLab 含糊测试工具,与相应依赖项和内容;
  3. 编写相应测试用例,极狐 GitLab 提供现成接口和内容来进行测试;
  4. 运行测试;
  5. 查看后果,如有问题,则及时定位和修复;
  6. 集成到 CI/CD 中,后续每次提交新代码后,主动运行流水线,及时返回测试后果,从而尽早发现问题和解决问题。

在极狐 GitLab 页面启用 API 含糊测试

含糊测试属于平安测试的一部分。

如下图,在极狐 GitLab 新建我的项目 → 平安与合规→ 平安配置 → API 含糊测试 → 填写指标地址 + 抉择扫描模式 + OpenAPI 标准文件门路 + 是否身份验证 + 扫描轮廓(例如,有一个接口,三个参数,示例中每个参数生成 20 个不同类型参数内容,来申请该接口,测试该接口是否稳固强壮。)→ 生成代码片段,即可放入 CI 运行测试。

API 含糊测试配置示例

如下图所示,极狐 GitLab 我的项目中自带模板:API-Fuzzing·gitlab-ci.yml,其次要作用是:

  1. 配置含糊测试的环境变量;
  2. 读取 OpenAPI. json 文件,抓取相应参数;
  3. 依据 OpenAPI.json 中的接口定义,主动生成大量测试用例组合。如果每个申请有 3 个参数,每个参数有 20 种取值,则实践上能够生成 20 的 3 次方,即 8000 个测试用例进行组合。

Build 阶段构建测试环境与筹备测试数据;

Fuzz 阶段则专门执行含糊测试。

API 含糊测试配置内容

如下图展现了一个很典型的 CRUD(增删改查)接口组合,蕴含 GET 和 PUT 两个接口:

  • GET 接口:用于获取用户信息,返回 UserID、名字、明码等多个字段;
  • PUT 接口:用于更新用户信息,能够更新名称、明码等字段。

下图是极狐 GitLab API 含糊测试基于接口的定义主动生成相应的测试内容,次要包含:

  • 接口 URL 与申请办法;
  • 接口所需的参数、申请体与认证信息;
  • 接口响应的验证断言或脚本;
  • 接口的含糊测试计划与大量随机测试用例;
  • 其余相干测试数据如 headers、cookies、身份信息等。

API 含糊测试执行过程

如下图,极狐 GitLab API 含糊测试的执行流程大抵如下:

  1. 构建测试镜像:编排 API 含糊测试所须要的环境容器,构建测试执行的 Docker 镜像;
  2. 部署被测试零碎:将须要测试的零碎或服务部署到环境中,运行并监听在配置的端口(如下图是 777 端口)上;
  3. 认证信息配置:如果被测试零碎须要认证,则需在环境中配置相应的认证信息,以拜访零碎接口;
  4. 检出测试代码:从代码仓库中检出 API 含糊测试所要脚本、工具与用例等相干代码;
  5. 运行被测试零碎:使其失常启动并监听在配置的端口上;
  6. 解析 OpenAPI 文件:应用 Pitchalizer 工具解析传入的 OpenAPI 文件,抓取其中的接口定义信息,包含 URL、办法、申请参数、headers 等内容;
  7. 生成测试用例:依据解析出的接口信息,主动生成大量的随机测试用例,蕴含各接口的测试数据;
  8. 执行接口申请:应用生成的测试用例对被测试零碎的接口进行大规模的随机申请,同时监控零碎响应与运行状况;
  9. 查看接口响应:查看后果是否合乎预期,判断接口性能是否正确以及零碎稳定性等。

API 含糊测试执行后果

最终总共是执行 259 个 API 申请。

如下图,示例一共是写 4 个接口,最终总共是执行 259 个 API 申请,均匀每个接口大超过 60 个申请。可见含糊测试能够通过大量自动化测试来检测 API 接口健壮性,大幅晋升测试效率,尽早解决问题。

以上就是对于 API 含糊测试的内容与实际,心愿明天的分享对大家有帮忙!

退出移动版