恶意|API查询语言GraphQL的优秀安全实践( 二 )


REST代理充当API攻击媒介 在调整现有的API以供GraphQL客户端调用时 , 开发人员通常会将GraphQL实现为 , 在内部REST框架之上的一个瘦代理层 。 如果在没有充分考虑到安全因素的情况下实施此类转换 , 那么恶意用户就可以任意修改API请求中所指定的路径或参数 。 而修改后的请求在解析到后端API时 , 攻击者便可以实施跨站请求伪造( cross-site request forgery , CSRF)了 。
授权缺陷 GraphQL将配置授权和身份验证的检查责任 , 留给了最终实现者 。 即 , GraphQL API在查询级别的解析器、以及加载附加数据的解析器中 , 需要包含多项授权检查 。 而当授权由查询级解析器直接处理时 , 任何未经检查的API实例都会暴露受攻击面 。 而且 , 随着API模式复杂性的增加 , 此类被攻击者利用的漏洞风险也会随之增加 。
自省查询(Introspection Queries)可能会暴露敏感数据 开发人员为了去实现那些无法公开访问的“隐藏”API端点 , 会启用GraphQL服务器之间的API端点通信 , 或通过隐藏的管理功能来实现 。 其中 , GraphQL包含了一个自省功能 , 可以在没有适当授权的情况下 , 轻松地访问各个端点 。 由于自省功能允许客户端访问有关GraphQL架构的信息 , 因此一旦有攻击发生 , 自省查询就可以被用于访问API的相关配置、以及其他客户端的私有信息 。
速率限制难以实施 从本质上说 , GraphQL API是比较复杂的 。 它的每一个查询都会涉及到多项操作 , 并且会消耗大量的服务器资源 。 因此 , 光靠限制接收到的HTTP请求数量 , 并使用默认的速率限制策略是不够的 。 如果两种对象类型之间存在着某种循环关系 , 那么攻击者就可以通过创建各种滥用查询(abusive queries) , 从而让查询本身变得异常复杂 。 以此产生的编排 , 能够对GraphQL应用发起拒绝服务式(DoS)的攻击 。
常见的GraphQL漏洞 下面 , 我们来进一步讨论GraphQL有哪些常见的漏洞 , 可被恶意攻击者在API层面利用 。
GraphQL批处理攻击
GraphQL框架能够支持自省查询的批处理 , 即:能够在一次性调用中 , 向后端API发送多个请求 。 由于减少了请求与服务器之间的往返次数 , 因此这对于减少API请求的开销非常实用 。 不过 , 攻击者也可以使用查询的批处理功能 , 通过反复从API服务器、或数据库处加载数据 , 来编排各种快速且难以被检测到的暴力攻击 。
以下典型示例展示了 , 在搜索数字记录对象标识(Digital Record Object Identification , DROID)对象的不同实例时 , 进行GraphQL批处理查询的代码:

  1. query {
  2. droid(id: "2000"){
  3. name
  4. }
  5. second:droid(id: "2001"){
  6. name
  7. }
  8. third:droid(id: "2002"){

    推荐阅读