vlambda博客
学习文章列表

为何要慎用GraphQL的模式生成器





为何要慎用GraphQL的模式生成器


Facebook推出GraphQL以来已经有一段时间了,现在已经出现大量的工具和框架并被广泛地使用。2017年,我在“ Looting GraphQL for Fun and Profit ”一文中从安全角度概述了这项技术,到现在,我曾做的一些预测变成了现实。例如:“解析器可能包含与ACL相关的缺陷”。在这篇文章中,我将在一个GraphQL后端 graphcool 中展示这种缺陷的一个例子。


Graphcool是一种提供GraphQL数据库映射、订阅和权限系统设置等功能的框架。下面让我们来快速的部署一个新的GraphQL服务,这个过程非常简单:

npm install -g graphcool

graphcool init hello-world

cd hello-world

为何要慎用GraphQL的模式生成器


接下来,让我们来看一下 types.graphql 文件:

为何要慎用GraphQL的模式生成器


根据官方文档:

(https://www.graph.cool/docs/reference/database/data-modelling-eiroozae8u#overview)


Graphcool使用GraphQL模式定义语言(的一个子集)进行数据建模。数据模型是在服务对应的 .graphql 文件中定义的,通常称为 types.graphql ,它是Graphcool为生成实际数据库模式(Schema)的基础。


这意味着Graphcool会根据types.graphql件生成一个实际的GraphQL 模式(Schema),所以该Schema(types.graphql)不是最终的Schema。假如我们想要保护一些私有数据不被访问,为此我们将dateOfBirth:DateTime修改成password:String。要知道,Schema本身是无法为特定字段定义安全策略的,而是在 graphcool.yml 文件中定义。在说明文档中提到:


通常,权限遵循白名单方法:

  • 除非明确允许,否则不允许任何操作。

  • 权限之间不能使对方无效化。


为了限制密码字段被直接访问,我们必须通过以下方式更改graphcool.yml 中的权限策略:

为何要慎用GraphQL的模式生成器


好了,现在我们可以部署GraphQL 服务了:

为何要慎用GraphQL的模式生成器


默认的Web-API是GraphQL Playground。该API允许查看Schema并且对后端执行查询。现在让我们创建一个新用户Alice:

为何要慎用GraphQL的模式生成器


可以看到,我们自定义的权限策略生效了,password 字段不能被读取(尝试读取password会导致“Insufficient Permissions”错误)。

为何要慎用GraphQL的模式生成器


如此看来,授权看起来很靠谱,但你是否还记得从SDL模型 生成的实际Schema吗?让我们来看看:


为何要慎用GraphQL的模式生成器

在右边的面板上可以看到,Graphcool用选择器自动创建了一些其他的字段,比如:password_contains, password_not_contains, password_starts_with 等。显然这些字段是不可或缺的,因为GraphQL不支持使用任何未定义的字段。


如果我们尝试对Alice密码的第一位进行枚举呢?情况应该不会那么糟糕吧?


先试一下Alice密码的第一个字符是不是字符“a”:

为何要慎用GraphQL的模式生成器

运气不佳,我们的查询没有返回结果。然而为什么没有权限错误的提示呢?


经过提交Alice正确密码的第一位(“$”),可以看到这时出现了权限错误的提示。这就意味着通过基于报错的方法来获取password 的值是可行的,很多种注入都是利用这种报错提示,特别是SQL注入。让我们用Poc Burp intruder 来试一下:

为何要慎用GraphQL的模式生成器

从返回的结果来看,密码的第二位字符正确的时候,响应包比其他响应包大。因此Alice密码的所有字符可以被逐一破解。Shodan显示有许多受此类攻击影响的Graphcool后端。


总的来讲,开发人员应该手动去检查GraphQL生成的Scheme,因为框架可能会加入开发者意料之外的字段却不能正确的对这些字段进行授权。从积极的方面来说,Graphcool最近推出了一个新的项目prisma,它有一种新的认证和授权方法。

https://www.prisma.io/docs/1.20/maintain/graphcool-to-prisma/authentication-and-authorization-gcf3/


译文申明:

译文仅供参考,具体内容表达以及含义原文为准,转载请注明来自“苏州极光无限信息技术有限公司”。


为何要慎用GraphQL的模式生成器

极光无限安全研究中心 —— 由数位国内高级安全专家、俄罗斯资深安全专家及从事AI、信息安全领域研究的教授、博士领携,致力于组建一支顶级的红蓝对抗及漏洞挖掘研究团队,以安全技术为核心、AI技术为驱动,深入研究国内外网络安全技术,密切跟踪国内外最新产业动态,分析提出国内外产业发展趋势和技术方向。


为何要慎用GraphQL的模式生成器

极光无限安全岗位热招中

(点击“”,查看岗位详情)

为何要慎用GraphQL的模式生成器


为何要慎用GraphQL的模式生成器


投递邮箱:[email protected]

  扫描关注一下

  查看往期文章

点一下你会更好看耶