Web应用和API接口由于存在动态的数据传递和状态依赖,构建自动化模糊测试存在难度。分享一篇发表于2019年ICSE会议的论文RESTler,它设计了一种测试生成算法,可以进行有状态的API模糊测试。
论文摘要
本文介绍了第一个有状态的 REST API 模糊测试工具RESTler,它能够分析云服务的 API 规范并生成请求序列,通过接口自动测试服务。该工具主要依靠两种方式生成测试用的请求序列:(1)推断规范中声明的请求类型之间,其生产与消费之间的依赖关系;(2)分析在测试执行中观察到的服务端响应的动态反馈,以此进行输入变异产生新的测试。
作者使用 RESTler 测试了开源的 GitLab 以及多项微软的云服务,在 GitLab 中发现了 28 个漏洞。实验结果表明上述两种技术对于彻底测试服务是有必要的,同时作用可以修剪请求序列的巨大搜索空间。
1 背景介绍
互联网服务在过于十年里发生了巨大的架构变化,软件即服务(SaaS)、平台即服务(PaaS)、基础设施即服务(IaaS)的方式成为更主流高效的服务构建模式。大多数云服务通过 REST API ,由第三方应用程序以程序接口进行访问,Swagger 是关于服务接口的描述语言,它描述了如何通过接口访问云服务可以处理的请求和返回的响应格式。
目前的 REST API 自动测试工具仍处于起步阶段,它们会实时捕获 API 流量,然后进行解析、模糊和重放,且许多工具都是插件的形式扩展产生。由于这些工具尚未被广泛使用,在检查漏洞的有效性,以及漏洞安全性究竟多重要,在很大程度上仍旧是未知的。
本文设计的 RESTler 工具,是第一个自动化有状态的 REST API 模糊测试工具。与其他工具不同,RESTler 对整个 Swagger 规范执行轻量级的静态分析,以有状态的方式生成和执行对应的云服务测试。所谓的有状态,是指 RESTler 会采用多个请求序列,尝试探索可访问的服务状态。实验证明 推断依赖关系 (例子:请求A响应中的资源对象是请求B的输入参数,因此请求A应当在请求B之前)和 分析动态反馈 (例子:在当前请求序列得到的响应里请求B会被拒绝,因此要避免产生这种测试)对于接口测试是很有必要的,同时设计了多种搜索策略来比较工具的有效性。
2 API 格式规范
本文所提服务接口 REST API 考虑 Swagger 规范,一个客户端程序发送的消息被称作 请求 ,服务端程序接收并返回的消息被称作 响应 ,消息通过 HTTP 协议传递。一个 Swagger 规范示例如图1所示,它描述了一个简单的博客文章服务,API 共包括了 5 种请求类型,且指定了入口、方法和所需参数。
该博客文章服务允许用户去创建、访问、更新和删除博客文章,以 POST 请求为例,以下文本使用 YAML 格式来描述请求和响应的具体语法规范。
basePath: '/api'
swagger: '2.0'
definitions:
"Blog Post":
properties:
body:
type: string
id:
type: integer
required:
− body
type: object
paths:
"/blog/posts/"
post:
parameters:
− in: body
name: payload
required: true
schema:
ref: "/definitions/Blog Post&#