【问题标题】:Can someone forge a request to Hasura GraphQL Engine by setting x-hasura-role?有人可以通过设置 x-hasura-role 来伪造对 Hasura GraphQL Engine 的请求吗?
【发布时间】:2020-07-12 18:35:06
【问题描述】:

如果我理解正确,要使用 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 header 的值分配的角色是否有权限从请求体执行查询

据我了解,这意味着某人可以通过将 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 声明限制为仅根据我的身份验证服务分配给每个用户的角色?

【问题讨论】:

    标签: security hasura


    【解决方案1】:

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

    我是否仅将 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 标头的可接受值。

    【讨论】:

    • 非常感谢您为我解释清楚。 x-hasura-allowed 规则定义起初让我感到困惑。我将去填充 x-hasura-allowed-roles 声明,然后只允许每个用户使用角色。再次,非常感谢!
    猜你喜欢
    • 2021-04-10
    • 2020-11-17
    • 2020-11-05
    • 2021-04-11
    • 2020-01-12
    • 1970-01-01
    • 2021-12-28
    • 2020-12-10
    • 2022-06-10
    相关资源
    最近更新 更多