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