GraphQL Armor Max-Depth Plugin Bypass via Introspection Query Obfuscation
Key facts
- Attack vector
- —
- Privileges required
- —
- User interaction
- —
- Attack complexity
- —
- Impact type
- Denial of service
- Confidentiality · integrity · availability
- —
- Fix status
- Fixed
No CVSS vector from any source. Fix status from GitHub. Impact type from CWE-400.
Summary
### Summary A query depth restriction using the `max-depth` property can be bypassed if `ignoreIntrospection` is enabled (which is the default configuration) by naming your query/fragment `__schema`. ### Details At the start of the `countDepth` function, we have the following check for the `ignoreIntrospection` option: ```typescript if (this.config.ignoreIntrospection && 'name' in node && node.name?.value === '__schema') { return 0; } ``` However, the `node` can be one of: `FieldNode`, `FragmentDefinitionNode`, `InlineFragmentNode`, `OperationDefinitionNode`, `FragmentSpreadNode`. For example, consider sending the following query: ```graphql query hello { books { title } } ``` This would create an `OperationDefinitionNode` where `node.name.value == 'hello'` The proper way to handle this is to check explicitly for the `__schema` field, which corresponds to a `FieldNode`. The fix is ```typescript if ( this.config.ignoreIntrospection && 'name' in node && node.name?.value === '__schema' && node.kind === Kind.FIELD ) { return 0; } ``` This ensures that the node is explicitly a `FieldNode`. ### PoC Max depth: `6` ```graphql query { books { author { books { author { ...__schema } } } } } fragment __schema on Author { books { title } } ``` ### Impact This issue affects applications using the GraphQL Armor Depth Limit plugin with `ignoreIntrospection` enabled. ### Fix This is fixed in [PR#823](https://github.com/Escape-Technologies/graphql-armor/pull/823)
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| — | @escape.tech/graphql-armor-max-depth (npm) | before 2.4.2 | 2.4.2 | Patch available | GHSA-hmfr-rx46-4jx2 |
- @escape.tech/graphql-armor-max-depth (npm) Vendor— Affected before 2.4.2 Fixed in 2.4.2 Patch available GHSA-hmfr-rx46-4jx2
Remediation
- Fix · GHSA-hmfr-rx46-4jx2 @escape.tech/graphql-armor-max-depth (npm) Fixed in 2.4.2 Advisory →
Timeline
- 2026-10-03 Threatist record created from GHSA-hmfr-rx46-4jx2
References
Other 4
- https://github.com/Escape-Technologies/graphql-armor/security/advisories/GHSA-hmfr-rx46-4jx2
- https://github.com/Escape-Technologies/graphql-armor/pull/823
- https://github.com/Escape-Technologies/graphql-armor/commit/1f923bc09f5f053f60b6ba2bd419d4b94cbe1db3
- https://github.com/Escape-Technologies/graphql-armor
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences