GitHub Advisoryadvisory · npm
GHSA-733v-p3h5-qpq7 GraphQL Armor Cost-Limit Plugin Bypass via Introspection Query Obfuscation
MEDIUM
Official page ↗
- Ecosystem
- npm
- Packages
- @escape.tech/graphql-armor-cost-limit
- Severity
- Moderate
- CVSS vector
- CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
- Weaknesses
- CWE-400, CWE-770
- Reviewed
- 2025-04-25
Affected packages
• npm @escape.tech/graphql-armor-cost-limit: < 2.4.2 → fixed in 2.4.2
Description
Summary
A query cost restriction using the `cost-limit` can be bypassed if `ignoreIntrospection` is enabled (which is the default configuration) by naming your query/fragment `__schema`.
Details
At the start of the `computeComplexity` function, we have the following check for `ignoreIntrospection` option:
```ts
if (this.config.ignoreIntrospection && 'name' in node && node.name?.value === '__schema') {
return 0;
}
```
However, the `node` can be `FieldNode | FragmentDefinitionNode | InlineFragmentNode | OperationDefinitionNode | FragmentSpreadNode`
So, for example, sending the following query
```gql
query hello {
books {
title
}
}
```
would create an `OperationDefinitionNode` with `node.name.value == 'hello'`
The proper way to handle this would be to check for the `__schema` field, which would create a `FieldNode`.
The fix is
```ts
if (
this.config.ignoreIntrospection &&
'name' in node &&
node.name?.value === '__schema' &&
node.kind === Kind.FIELD
) {
return 0;
}
```
to assert that the node must be a `FieldNode`
PoC
```gql
query {
...__schema
}
fragment __schema on Query {
books {
title
author
}
}
```
```gql
query __schema {
books {
title
author
}
}
```
Impact
Applications using GraphQL Armor Cost Limit plugin with `ignoreIntrospection` enabled.
Fix:
Fixed on 772. A quick patch would be to set `ignoreIntrospection` to false.
Related
References
- https://github.com/Escape-Technologies/graphql-armor/security/advisories/GHSA-733v-p3h5-qpq7 web
- https://github.com/Escape-Technologies/graphql-armor/pull/772 web
- https://github.com/Escape-Technologies/graphql-armor/commit/5a329541cf32a359ee1f69748738f91231b26eba web
- https://github.com/Escape-Technologies/graphql-armor package