graphql: add query depth limit to prevent DoS attacks#32344
Merged
rjl493456442 merged 2 commits intoethereum:masterfrom Aug 19, 2025
Merged
graphql: add query depth limit to prevent DoS attacks#32344rjl493456442 merged 2 commits intoethereum:masterfrom
rjl493456442 merged 2 commits intoethereum:masterfrom
Conversation
fjl
approved these changes
Aug 7, 2025
Contributor
|
We'll have to see if this limit is too tight for real world uses, but it's good to add. |
gballet
pushed a commit
to gballet/go-ethereum
that referenced
this pull request
Sep 11, 2025
## Summary This PR addresses a DoS vulnerability in the GraphQL service by implementing a maximum query depth limit. While ethereum#26026 introduced timeout handling, it didn't fully mitigate the attack vector where deeply nested queries can still consume excessive CPU and memory resources before the timeout is reached. ## Changes - Added `maxQueryDepth` constant (set to 20) to limit the maximum nesting depth of GraphQL queries - Applied the depth limit using `graphql.MaxDepth()` option when parsing the schema - Added test case `TestGraphQLMaxDepth` to verify that queries exceeding the depth limit are properly rejected ## Security Impact Without query depth limits, malicious actors could craft deeply nested queries that: - Consume excessive CPU cycles during query parsing and execution - Allocate large amounts of memory for nested result structures - Potentially cause service degradation or outages even with timeout protection This fix complements the existing timeout mechanism by preventing resource-intensive queries from being executed in the first place. ## Testing Added `TestGraphQLMaxDepth` which verifies that queries with nesting depth > 20 are rejected with a `MaxDepthExceeded` error. ## References - Original issue: ethereum#26026 - Related security best practices: https://www.howtographql.com/advanced/4-security/ --------- Co-authored-by: Felix Lange <fjl@twurst.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR addresses a DoS vulnerability in the GraphQL service by implementing a maximum query depth limit. While #26026 introduced timeout handling, it didn't fully mitigate the attack vector where deeply nested queries can still consume excessive CPU and memory resources before the timeout is reached.
Changes
maxQueryDepthconstant (set to 20) to limit the maximum nesting depth of GraphQL queriesgraphql.MaxDepth()option when parsing the schemaTestGraphQLMaxDepthto verify that queries exceeding the depth limit are properly rejectedSecurity Impact
Without query depth limits, malicious actors could craft deeply nested queries that:
This fix complements the existing timeout mechanism by preventing resource-intensive queries from being executed in the first place.
Testing
Added
TestGraphQLMaxDepthwhich verifies that queries with nesting depth > 20 are rejected with aMaxDepthExceedederror.References