有人可以通过设置x-Hasura-role来伪造对Hasura GraphQL引擎的请求吗



如果我理解正确,要使用JWT在hasura中授权查询或突变,需要在请求本身中满足一些要求,即:

  1. JWT本身,显示在请求标头中
    Authorization: Bearer <token here>
  2. x-hasura-role,显示在请求标头中(可选(
    x-hasura-role: user
  3. 请求正文中显示的实际查询或突变
myQuery {
id
name
another_field
}

当请求被发送到hasura端点时,hasura GraphQL引擎将尝试

  1. 验证JWT
  2. 检查在请求标头中设置的x-hasura-role的值是否存在于jwt的x-hasura-allowed-role声明中
  3. 如果满足所有条件,则GraphQL引擎将检查从x-hasura-role标头的值分配的角色是否具有从请求体执行查询的权限

据我所知,这意味着有人可以通过将x-hasura-role的值设置为JWT的x-hasura-allowed-roles声明中存在的其他值来"伪造"对hasura GraphQL引擎的请求。例如,如果x-hasura-allowed-roles索赔与类似

{
...
'x-hasura-allowed-roles': ['role1','role2'],
'x-hasura-default-role': 'role1',
'x-hasura-user-id': username
}
}

那么这意味着被认为只被分配给角色1的人只需将请求中的x-hasura-role头设置为x-hasura-role: role2,就可以执行被限制为角色2的查询

我的理解正确吗?如果是,避免这种情况的最佳方法是什么,因为它看起来像是一个安全漏洞?我是否只是将jwt的x-hasura-allowed-roles声明限制为仅分配给基于我的身份验证服务的每个用户的角色?

您的理解似乎是正确的,这不是一个安全漏洞。

我是否只是将jwt的x-hasura-allowed-roles声明限制为仅分配给基于我的身份验证服务的每个用户的角色?

没错。在本文档中(https://hasura.io/docs/1.0/graphql/manual/auth/authentication/jwt.html),关键信息在这里:

JWT被解码,签名被验证,然后断言用户的当前角色(如果在请求中指定(在允许的角色列表中。如果请求中未指定当前角色,则应用默认角色。

因此,身份验证服务器发布特定于该用户的允许角色(和默认角色(列表非常重要;看起来Hasura正在用这个功能支持多角色用户。例如,管理员可能能够使用用户角色"登录为",或者用户的角色在应用程序的不同上下文中可能不同。

对于这些字段的更具体的定义:

  1. x-hasura-default-role字段:指示该用户的默认角色,即在未传递x-hasura-role标头时将使用的角色
  2. x-hasura-allowed-roles字段:用户允许的角色列表,即x-hasura-role标头的可接受值

最新更新