Your RSA-2048 keys break in 2030. Find every one of them before attackers do.
📦
📦 npm
Not in CISA KEV
MEDIUM severity

GHSA-733v-p3h5-qpq7 graphql-armor-cost-limit

MEDIUMFix: Escape-Technologies/graphql-armor#772

GHSA-733v-p3h5-qpq7 is a medium-severity (CVSS 5.3) vulnerability in @escape.tech/graphql-armor-cost-limit. A fix is available for @escape.tech/graphql-armor-cost-limit — see the affected versions and patch details below.

GraphQL Armor Cost-Limit Plugin Bypass via Introspection Query Obfuscation

Published
Apr 25, 2025
Updated
Apr 29, 2025
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Apr 29, 2025 · OSV.dev, FIRST.org (EPSS)

Real-World Exposure

1 pkg affected
📦@escape.tech/graphql-armor-cost-limit

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects npm packages — download data is not available via public APIs for these ecosystems.

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:

    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

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

    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

query  {
  ...__schema
}

fragment __schema on Query {
  books {
    title
    author
  }
}
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.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
📦npm@escape.tech/graphql-armor-cost-limitall versions2.4.2npm install @escape.tech/graphql-armor-cost-limit@2.4.2

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for @escape.tech/graphql-armor-cost-limit, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update @escape.tech/graphql-armor-cost-limit to 2.4.2 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-733v-p3h5-qpq7 is resolved across your whole dependency graph.

  3. Workarounds

    If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.

  4. How O3 protects you

    O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like GHSA-733v-p3h5-qpq7 can be triaged on real exposure rather than presence alone.

Tailored to GHSA-733v-p3h5-qpq7. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.

Frequently Asked Questions

### 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, send
O3 Security · Impact-Aware SCA

Is GHSA-733v-p3h5-qpq7 in your dependencies?

O3 Security finds GHSA-733v-p3h5-qpq7 across npm dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.

GHSA-733v-p3h5-qpq7: Medium 5.3 severity | O3 Security