GraphQLのサーバーやゲートウェイを動かしている会社は、依存関係の奥にある1つの部品の版を確かめる必要があります。GraphQLの開発に広く使われるnpmの部品@graphql-tools/utilsに、プロトタイプ汚染の脆弱性CVE-2026-114604が見つかりました。GitHubの勧告のデータベースは、深刻度をHigh(CVSS 4.0で8.4)としています。対象は10.10.1から12.0.1までで、12.0.2で直っています。
プロジェクトの勧告は2026年9月30日(米国時間)に出ており、直した12.0.2も同じ日に公開されました。GitHubの勧告のデータベースには、10月23日(日本時間)に載っています。
GitHubの勧告。対象は10.10.1〜12.0.1、直った版は12.0.2出典: GitHub Advisory Database「GHSA-c4qx-w738-7hr3」(引用)
何が危ないのか
問題があるのは、mergeIncrementalResultという関数です。GraphQLには、応答を一度に返さず、@deferや@streamという指示で、あとから少しずつ分けて返す仕組み(incremental delivery)があります。この関数は、あとから届いた分を、すでに受け取った結果の中のどこに入れるかを、応答に書かれた「場所(path)」をたどって決めます。
勧告によると、関数は危ない名前(__proto__など)を場所の指定から外す確かめをしていましたが、その確かめをすり抜ける書き方がありました。すり抜けると、受け取った側のNode.jsの処理の中で、すべてのオブジェクトの共通の土台(Object.prototype)に、好きな項目と値を足せてしまいます。
勧告は、検証で「管理者かどうか」を表す項目を土台に足し、あとから作った何も入っていないオブジェクトでも、管理者と判定されるようになった例を示しています。応答の中だけでなく、同じ処理の中の関係の無いコードの動きまで変わるのが、プロトタイプ汚染の怖さです。
どんな条件で影響するか
勧告が挙げる前提は次のとおりです。
| 前提 |
内容 |
| 関数を使っている |
上流のGraphQLのサーバーなどから届く分割された応答を、mergeIncrementalResultでまとめている |
| 応答を確かめていない |
まとめる前に、場所の指定が文字列や数字だけかを確かめていない。既定ではこの確かめは無い |
| 上流を攻撃者が握れる |
上流のサーバーが悪意を持つ、乗っ取られている、または通信の途中で書き換えられる |
| 土台を固めていない |
Object.prototypeを凍結(変更できなく)していない |
勧告は、GraphQL Tools自身の本番のコードはこの関数を直接呼んでおらず、分割された応答を組み立てる利用者向けに公開されている関数だとしています。当社がnpmで公開されている部品を調べた範囲では、HTTPで上流のGraphQLのサーバーに問い合わせる@graphql-tools/executor-http(3.5.0)がこの関数を呼んでいました。複数のサービスを1つにまとめるゲートウェイ(GraphQL MeshやHive Gatewayなど)は、この部品を通して上流に問い合わせることがあります(当社調べ)。
| 版 |
扱い |
| 10.10.0以前 |
対象外。この欠陥が入る前の作り |
| 10.10.1〜12.0.1 |
影響する |
| 12.0.2以降 |
直っている。10月25日時点の最新は13.1.3 |
10系と11系には、直った版がありません。12.0.2以降へ上げる必要があります。
影響する会社・しない会社
- 影響する: GraphQLのゲートウェイやBFF(画面向けの中継のサーバー)をNode.jsで動かし、ほかのGraphQLのサーバーに@defer・@streamで問い合わせている会社。とくに、社外や別の部署が運用する上流につないでいる場合
- 確かめる: GraphQL MeshやHive Gatewayなど、@graphql-tools/executor-httpを使う部品を入れている会社。依存関係の中の@graphql-tools/utilsの版を見ます
- 影響が小さい: 上流のサーバーも自社で管理し、通信を暗号化して経路を守っている会社。勧告の前提の「上流を攻撃者が握れる」に当たりにくくなります(当社の見立て)
- 影響しない: @graphql-tools/utilsを使っていない会社や、10.10.0以前を使っている会社