Skip to content

deps(dev): update dependency @graphql-tools/utils to v12 [security] - #346

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/npm-graphql-tools-utils-vulnerability
Open

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/npm-graphql-tools-utils-vulnerability

Conversation

@renovate

@renovate renovate Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@graphql-tools/utils (source) 8.2.3 → 12.0.1 age confidence

GraphQL Tools has prototype pollution in well-established utility function mergeDeep

CVE-2026-104852 / GHSA-7mx3-vvmw-hjmv

More information

Details

Closed by https://github.com/ardatan/graphql-tools/pull/8423
Mitigated in Hive Gateway by https://github.com/graphql-hive/gateway/pull/2600

A client can alias fields to constructor, __proto__ or prototype so that the response keys from two subgraphs collide on those names during result merging. Because mergeDeep recursed through inherited properties, the merge walked {}.constructor to Object, then Object.__proto__ to Function.prototype, and wrote a subgraph-supplied value over Function.prototype.call, breaking every subsequent request in the process until restart. This is remotely triggerable by an unauthenticated client with a single query against any supergraph that merges an object from two subgraphs, which is the ordinary @shareable or entity case, so it is a denial of service rather than a theoretical hardening issue.

{
  shared {
    fieldA
    constructor: fieldB {
      __proto__: child {
        call: value
      }
    }
  }
}

Severity

  • CVSS Score: 8.2 / 10 (High)
  • Vector String: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

References

This data is provided by the GitHub Advisory Database (CC-BY 4.0).


Release Notes

ardatan/graphql-tools (@​graphql-tools/utils)

v12.0.1

Compare Source

Patch Changes
  • #​8368 60db079 Thanks @​ardatan! - Omit mutation/subscription from printSchemaWithDirectives when those root types are no longer present on the schema (e.g. after pruneSchema).

  • #​8366 57e316d Thanks @​ardatan! - Allow % in paths checked by isValidPath (e.g. directories from URL-encoded repo names).

  • #​8370 1c1c5a0 Thanks @​ardatan! - Clean up observableToAsyncIterable queues and unsubscribe when the observable completes, so iterators do not retain references after done. Fixes leak detection flakes related to #​8057.

  • #​8370 1c1c5a0 Thanks @​ardatan! - Prefer runtime description values over stale astNode descriptions in printSchemaWithDirectives / getDescriptionNode. Fixes #​5508.

  • #​8423 0b9529f Thanks @​enisdenjo! - Fix prototype pollution in mergeDeep

    Source keys named __proto__, constructor or prototype are now skipped at every recursion level, and the check for an existing key uses hasOwnProperty instead of in, so inherited properties are never used as merge targets.

    Previously, merging untrusted data such as JSON.parse('{"constructor":{"__proto__":{"call":"x"}}}') could reach and overwrite properties on Object.prototype or Function.prototype.

v12.0.0

Compare Source

Major Changes
  • #​8346
    2273c21
    Thanks @​ardatan! - This release adds GraphQL v17 support and aligns
    the existing executor implementation with the latest GraphQL v17 API changes. The following
    changes are included:

    • getAsyncHelpers is now available on GraphQLResolveInfo. Its track method is used whenever
      waitUntil is available, as in Yoga's
      Explicit Resource Management
    • getAbortSignal is now available on GraphQLResolveInfo, matching behavior that was already
      available in this executor implementation, as in Yoga's
      Execution Cancellation
    • GraphQLResolveInfo automatically aligns variableValues according to the GraphQL version for
      better compatibility. In GraphQL v17 and above, variableValues follows the wrapped shape
      ({ coerced, sources }) expected by GraphQL APIs. In GraphQL v16 and below, variableValues
      remains a flat map as in previous versions.
    • If your custom scalar resolvers define __serialize and __parseValue, they are automatically
      mapped to coerceOutputValue and coerceInputValue in GraphQL v17.
    • BREAKING: @graphql-tools/executor's getVariableValues now returns { variableValues }
      on success, where variableValues is a VariableValues object ({ coerced, sources }). On
      failure, it returns { errors }.
    • BREAKING: collectFields, shouldIncludeNode, getDeferValues, and collectSubFields now
      need a VariableValues object instead of Record<string, any> for the variableValues
      argument.
    • visitResult now internally normalizes ExecutionRequest.variables into a
      VariableValues-compatible shape ({ coerced, sources }) before traversing selections.

v11.2.2

Compare Source

Patch Changes
  • #​8302
    e90719b
    Thanks @​pbomb! - fix mergeDeep to treat explicit undefined property
    values as overrides rather than skipping them, distinct from an absent property

v11.2.1

Compare Source

Patch Changes
  • #​8204
    615c1a2
    Thanks @​pbomb! - fix mergeDeep to treat null property values as
    explicit overrides rather than skipping them

v11.2.0

Compare Source

Minor Changes

v11.1.1

Compare Source

Patch Changes
  • #​8256
    981d461
    Thanks @​twavv! - Fix mergeDeep returning undefined instead of {}
    when merging two or more empty objects.

    Previously the output accumulator was only initialized inside the per-key loop, so merging sources
    with no own keys (e.g. mergeDeep([{}, {}])) left it undefined. This silently dropped
    empty-object values during nested merges ({ data: {} } became { data: undefined }), which
    could surface as "Cannot return null for non-nullable field" errors when stitching schemas. The
    accumulator is now initialized as soon as an object source is encountered.

v11.1.0

Compare Source

Minor Changes

v11.0.1

Compare Source

Patch Changes
  • ae36a0e
    Thanks @​mattkrick! - Handle enum values correctly if they are
    arguments of directives defined in the extensions

v11.0.0

Compare Source

Major Changes
  • #​7685
    6f3776c
    Thanks @​ardatan! - Support "federation/subgraph style" schemas in
    astFromSchema and printSchemaWithDirectives

    If a GraphQLSchema doesn't have any defined operation types, we should print the schema
    definition as an extension rather than omitting it entirely. They are not a valid schema on their
    own, but they are valid subgraph schemas in a federation setup, and it is possible to build such
    schemas with assumeValid options.

    // A schema without defined root types
    buildSchema(
      /* GraphQL */ `
        extend schema @link(url: "https://specs.apollo.dev/federation/v2.0", import: ["@key"])
    
        type User @key(fields: "id") {
          id: ID!
          username: String
        }
      `,
      { assumeValid: true, assumeValidSDL: true }
    )

    POTENTIAL BREAKING CHANGE: This can be a breaking change because now the schema above will be
    printed as the input, previously extend schema was converted to schema {}.

v10.11.0

Compare Source

Minor Changes
  • #​7588
    2118a80
    Thanks @​EmrysMyrddin! - Add optional schema coordinate in error
    extensions. This extension allows to precisely identify the source of the error by automated tools
    like tracing or monitoring.

    This new feature is opt-in, you have to enable it using schemaCoordinateInErrors executor
    option.

    Caution: This feature, when enabled, will expose information about your schema. If you need to
    keep your schema private and secret, you should strip this attribute at serialization time before
    sending errors to the client.

    import { parse } from 'graphql'
    import { normalizedExecutor } from '@graphql-tools/executor'
    import { getSchemaCoordinate } from '@graphql-tools/utils'
    import schema from './schema'
    
    const result = await normalizedExecutor({
      schema,
      document: parse(`...`),
      schemaCoordinateInErrors: true // enable adding schema coordinate to graphql errors
    })
    
    if (result.errors) {
      for (const error of result.errors) {
        console.log('Error in resolver ', error.coordinate, ':', error.message)
        // or with `getSchemaCoordinate` util, to workaround types if needed
        console.log('Error in resolver', getSchemaCoordinate(error), ':', error.message)
      }
    }

v10.10.3

Compare Source

Patch Changes
  • #​7683
    2fe123a
    Thanks @​ardatan! - Revert
    #​7683 which can cause unexpected breaking changes so
    as before the schema extension node will always be converted to a schema definition node

v10.10.2

Compare Source

Patch Changes
  • #​7679
    dddc5f6
    Thanks @​ardatan! - Support "federation/subgraph style" schemas in
    astFromSchema and printSchemaWithDirectives

    If a GraphQLSchema doesn't have any defined operation types, we should print the schema
    definition as an extension rather than omitting it entirely. They are not a valid schema on their
    own, but they are valid subgraph schemas in a federation setup, and it is possible to build such
    schemas with assumeValid options.

    // A schema without defined root types
    buildSchema(
      /* GraphQL */ `
        extend schema @link(url: "https://specs.apollo.dev/federation/v2.0", import: ["@key"])
    
        type User @key(fields: "id") {
          id: ID!
          username: String
        }
      `,
      { assumeValid: true, assumeValidSDL: true }
    )

v10.10.1

Compare Source

Patch Changes

v10.10.0

Compare Source

Minor Changes
  • #​5269
    fded91e
    Thanks @​uroslates! - Add default values to the arguments

    When the schema is like following;

    type Query {
        getAllPages(currentPage: Int = 0, pageSize: Int = 10, pageType: getAllPages_pageType = ContentPage, sort: String = "asc"): PagesList
    }
    
    enum getAllPages_pageType {
        ContentPage
        CategoryPage
        CatalogPage
    }
    
    type PagesList {
        ...
    }

    The generated operation will be like following;

    query getAllPages_query($currentPage: Int = 0, $pageSize: Int = 10, $pageType: getAllPages_pageType = ContentPage, $sort: String = "asc") {
        getAllPages(currentPage: $currentPage, pageSize: $pageSize, pageType: $pageType, sort: $sort) {
            ...
        }
    }
Patch Changes
  • #​7012
    fd105f4
    Thanks @​ardatan! - Fix the bug in mergeDeep;

    The following inputs and outputs are corrected;

    • mergeDeep([{a:2}, undefined]) - Any nullish values should be ignored so it should return
      {a:2}
    • mergeDeep([]) - no sources should return undefined
    • mergeDeep([undefined]) - no sources should return undefined
  • #​5294
    3b99a9b
    Thanks @​n1ru4l! - Do not map builtin scalars

v10.9.1

Compare Source

Patch Changes

v10.9.0

Compare Source

Minor Changes
  • #​7281
    53db005
    Thanks @​EmrysMyrddin! - Add optional subgraphName preoperty
    to the ExecutionRequest interface for usage in Gateways like Hive Gateway.
Patch Changes

v10.8.6

Compare Source

Patch Changes

v10.8.5

Compare Source

Patch Changes

v10.8.4

Compare Source

Patch Changes

v10.8.3

Compare Source

Patch Changes

v10.8.2

Compare Source

Patch Changes

v10.8.1

Compare Source

Patch Changes

v10.8.0

Compare Source

Minor Changes
Patch Changes
  • 0a3e193
    Thanks @​ardatan! - Do not add _v prefix if there is only one
    argument/variable

v10.7.2

Compare Source

Patch Changes

v10.7.1

Compare Source

Patch Changes

v10.7.0

Compare Source

Minor Changes
  • #​6789
    2c70d27
    Thanks @​n1ru4l! - - New helper function getAbortPromise to get a
    promise rejected when AbortSignal is aborted

    • New helper function registerAbortSignalListener to register a listener to abort a promise when
      AbortSignal is aborted

    Instead of using .addEventListener('abort', () => {/* ... */}), we register a single listener to
    avoid warnings on Node.js like
    MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 abort listeners added. Use emitter.setMaxListeners() to increase limit.

v10.6.4

Compare Source

Patch Changes

v10.6.3

Compare Source

Patch Changes
  • 020b9e4
    Thanks @​ardatan! - `AbortSignal` in `GraphQLResolveInfo`, and
    `AbortSignal` in `ExecutionRequest`

v10.6.2

Compare Source

Patch Changes
  • #​6737
    1b24656
    Thanks @​ardatan! - Handle array of primitives correctly

    The bug was following;

    mergeDeep([{ options: ['$a', '$b'] }, { options: ['$c'] }, { options: ['$d', '$e'] }])
    
    // results in { options: [{}, {}] }

v10.6.1

Compare Source

Patch Changes
  • 1e02935
    Thanks @​ardatan! - Handle parse errors correctly when loader gets a
    string directly

v10.6.0

Compare Source

Minor Changes
  • 414e404
    Thanks @​ardatan! - new fakePromise, mapMaybePromise and
    fakeRejectPromise helper functions

v10.5.6

Compare Source

Patch Changes
  • #​6677
    dc5043b
    Thanks @​enisdenjo! - onError and onEnd callbacks from
    mapAsyncIterator are invoked only once regardless of how many times throw/return was called
    on the iterator

v10.5.5

Compare Source

Patch Changes

v10.5.4

Compare Source

Patch Changes

v10.5.3

Compare Source

Patch Changes

v10.5.2

Compare Source

Patch Changes
  • 07b87ed
    Thanks @​ardatan! - Respect extensionASTNodes in directable
    GraphQLSchema object

v10.5.1

Compare Source

Patch Changes
  • 6291e14
    Thanks @​ardatan! - Add all args from extensions to the AST even if
    they don't exist in the directive def

v10.5.0

Compare Source

Minor Changes

v10.4.0

Compare Source

Minor Changes
  • b8bf584
    Thanks @​ardatan! - Introduce `getDirectiveExtensions` and refactor
    directive handling in the extensions

v10.3.4

Compare Source

Patch Changes

v10.3.3

Compare Source

Patch Changes

v10.3.2

Compare Source

Patch Changes

v10.3.1

Compare Source

Patch Changes

v10.3.0

Compare Source

Minor Changes

v10.2.3

Compare Source

Patch Changes

v10.2.2

Compare Source

Patch Changes
  • #​6238
    0f7059b
    Thanks @​ardatan! - If the given objects are arrays with the same
    length, merge the elements.

    const a = [{ a: 1 }, { b: 2 }]
    const b = [{ c: 3 }, { d: 4 }]
    const result = mergeDeep(a, b) // [{ a: 1, c: 3 }, { b: 2, d: 4 }]

v10.2.1

Compare Source

Patch Changes
  • #​6194
    7368829
    Thanks @​ardatan! - Handle interface objects in a different way

  • #​6188
    e10c13a
    Thanks @​ardatan! - Add respectArrayLength flag to mergeDeep so
    instead of concatenating the arrays, elements of them will be merged if they have the same length

v10.2.0

Compare Source

Minor Changes
Patch Changes

v10.1.3

Compare Source

Patch Changes
  • #​6055
    4093f70
    Thanks @​enisdenjo! - Disallow new lines in paths when checking
    with isValidPath

    A string may sometimes look like a path but is not (like an SDL of a simple GraphQL schema). To
    make sure we don't yield false-positives in such cases, we disallow new lines in paths (even
    though most Unix systems support new lines in file names).

v10.1.2

Compare Source

Patch Changes

v10.1.1

Compare Source

Patch Changes

v10.1.0

Compare Source

Minor Changes

v10.0.13

Compare Source

Patch Changes

v10.0.12

Compare Source

Patch Changes

v10.0.11

Compare Source

Patch Changes

v10.0.10

Compare Source

Patch Changes

v10.0.9

Compare Source

Patch Changes

v10.0.8

Compare Source

Patch Changes
  • accd58fd
    Thanks @​ardatan! - Extract inspect into the new cross-inspect
    package

  • Updated dependencies
    [accd58fd]:

    • cross-inspect@​1.0.0

v10.0.7

Compare Source

Patch Changes
  • b4c17591
    Thanks @​ardatan! - Convert GraphQLError like originalError property
    to a GraphQLError

v10.0.6

Compare Source

Patch Changes

v10.0.5

Compare Source

Patch Changes

v10.0.4

Compare Source

Patch Changes

v10.0.3

Compare Source

Patch Changes

v10.0.2

Compare Source

Patch Changes

v10.0.1

Compare Source

Patch Changes

v10.0.0

Compare Source

Major Changes

v9.2.1

Compare Source

Patch Changes
  • b5c8f640
    Thanks @​ardatan! - Do not use a global WeakMap for memoize2of4,
    and introduce memoize2of5

v9.2.0

Compare Source

Minor Changes
Patch Changes

v9.1.4

Compare Source

Patch Changes

v9.1.3

Compare Source

Patch Changes

v9.1.2

Compare Source

Patch Changes

v9.1.1

Compare Source

Patch Changes

[!IMPORTANT]
✂ PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants