跳转至

Directive Overloading in GraphQL API

GraphQL API中的指令过载

描述

GraphQL中的指令过载(Directive Overloading)发生在攻击者在查询中利用大量指令来压垮服务器的处理能力时。

GraphQL中的指令用于修改查询的行为,但过度使用可能会通过耗尽服务器资源而导致拒绝服务(DoS)攻击。这种攻击可能会引起性能下降或完全的服务中断。

示例:

query oxo {
  __typename @aa @aa @aa @aa @aa @aa @aa @aa @aa @aa
}

指令过载的安全影响可能导致以下问题:

  • 拒绝服务(DoS):通过在单次查询中发送过量指令,攻击者可以使服务器过载,从而导致合法用户遇到响应缓慢或服务中断的问题。
  • 资源耗尽:服务器可能会消耗大量的计算资源来解析和验证指令,这可能导致内存耗尽或CPU使用率激增。
  • 系统不可用:如果不加限制,指令过载攻击可能使所有用户都无法使用GraphQL服务。

建议

为了缓解指令过载攻击的风险,您可以采取以下步骤:

  • 实施超时限制(timeouts):实施超时机制来“终止”(kill)解决时间过长的查询是非常有效的。通过设置最大执行时间,您可以自动终止超过此限制的查询,从而防止它们过度消耗服务器资源。

  • 限制指令:在服务器端实施限制,规定单次GraphQL查询中允许的指令数量。您可以配置像GraphQL Armor这样的工具来限制指令并防止过载。

// Configuring for GraphQL Armor
GraphQLArmorConfig({
  maxDirectives: {
    // Toggle the plugin | default: true
    enabled?: boolean,

    // Directives threshold | default: 50
    n?: int,

    // Callbacks that are ran whenever a Query is accepted
    onAccept?: GraphQLArmorAcceptCallback[],

    // Callbacks that are ran whenever a Query is rejected
    onReject?: GraphQLArmorRejectCallback[],

    // Do you want to propagate the rejection to the client? | default: true
    propagateOnRejection?: boolean,
  }
})
import graphql
from graphql.language import ast
from graphql.language import parser
from settings import api

def validate_directives(query: str) -> None:
    """
    This validation prevents the execution of queries containing an excessive
    amount of directives to prevent abuse.
    """

    class DirectivesParser(parser.Parser):
        def parse_directives(self, is_const: bool) -> list[ast.DirectiveNode]:
            directives = 0
            while self.peek(graphql.TokenKind.AT):
                directives += 1
                if directives > api.API_MAX_DIRECTIVES:
                    raise graphql.GraphQLError("Exception - Max directives exceeded")
                self.parse_directive(is_const)
            return []

    ast_parser = DirectivesParser(query)
    ast_parser.parse_document()

链接

标准

  • CWE_TOP_25:
    • CWE_400
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_4
    • REQ_11_3
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • OWASP_ASVS_L3:
    • V13_4_1
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
    • CC_9_1
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213