GraphQL Tools 프로토타입 오염 취약점(CVE-2026-114604) 분석

GraphQL Tools의 mergeIncrementalResult 함수에서 프로토타입 오염 취약점이 발생했습니다. 증분 응답을 처리하는 과정에서 세그먼트 타입 검증이 누락되면서 __proto__를 차단하는 가드가 우회됐고, 공격자가 Node.js 프로세스의 Object.prototype에 임의의 속성과 값을 추가할 수 있게 됩니다.

CVE-2026-114604 취약점 개요

Node.js 환경에서 GraphQL 응답을 처리하는 @graphql-tools/utils 패키지에서 심각한 보안 취약점이 보고되었습니다. 이 취약점은 CVE-2026-114604 및 GHSA-c4qx-w738-7hr3 식별자로 관리되며, 약점 분류상 CWE-1321로 정의되었습니다.

제보자(reporter) 기준 심각도는 ‘High’로 평가되었습니다. 공격자가 서버 프로세스의 기본 객체 구조를 조작할 수 있는 프로토타입 오염(Prototype Pollution) 취약점이기 때문입니다.

기술적 분석: 가드 우회 메커니즘

문제가 발생한 mergeIncrementalResult 함수는 증분(incremental) GraphQL 응답의 경로(path) 세그먼트를 객체 키로 변환해 결과를 병합하는 역할을 합니다. 보통 이런 함수에는 __proto__처럼 위험한 키로 프로토타입이 오염되는 것을 막기 위한 가드(Guard) 로직이 들어갑니다.

그러나 이 함수에는 다음과 같은 기술적 결함이 있었습니다.

  1. 타입 검증 부재: 변환 단계에서 세그먼트의 타입을 엄격하게 검증하는 절차가 빠져 있었습니다.
  2. 가드 우회 경로: 문자열이 아닌 비원시 값(예: 배열)으로 강제 변환(coerce)되는 __proto__ 키가 사용되면 기존의 엄격한 문자열 비교 가드를 그대로 통과하게 됩니다.
  3. 속성 접근 도달: 동등 비교를 통과한 위험한 키가 실제 객체의 속성 접근 단계까지 도달해 프로토타입을 오염시킬 수 있는 상태가 됩니다.

영향 범위 및 위험성

이번 취약점은 특정 버전 범위의 패키지를 사용하는 모든 Node.js 프로세스에 영향을 미칩니다. 이를 악용하면 공격자가 서버에서 실행 중인 Node.js 프로세스의 Object.prototype에 임의로 선택한 이름과 값의 속성을 추가할 수 있습니다.

취약 버전 및 영향도 요약

구분 상세 내용
취약 패키지 및 함수 @graphql-tools/utils / mergeIncrementalResult
취약 버전 범위 10.10.1 이상 ~ 12.0.1 이하
안전 버전 12.0.2 이상
취약점 식별자 CVE-2026-114604, GHSA-c4qx-w738-7hr3
CWE 분류 CWE-1321
심각도 (제보자 기준) High

대응 방안 및 패치 버전

이 취약점은 패키지를 즉시 업데이트하면 해결됩니다. 12.0.2 버전부터는 영향을 받지 않으므로 최신 버전으로의 업데이트가 권장됩니다.

수정 사항 분석

보안 패치는 GitHub 수정 PR #8467에 반영되었습니다. 주요 수정 내용은 다음과 같습니다.

  1. 비원시 세그먼트 거부: 속성에 접근하기 전에 세그먼트가 원시 값(Primitive)인지 확인하고, 비원시 세그먼트의 접근을 원천적으로 거부하도록 변경되었습니다.
  2. 공통 헬퍼 도입: isSafeObjectKey와 isDangerousObjectKey 헬퍼 함수를 도입해 여러 호출 지점에서 일관된 보안 검증 로직을 공유하도록 개선되었습니다.

인프라 보안 담당자와 개발자가 가장 먼저 확인할 것은 현재 사용 중인 @graphql-tools/utils의 버전입니다. 10.10.1에서 12.0.1 사이 버전을 쓰고 있다면 즉시 12.0.2 이상으로 업그레이드해 프로세스 오염 위험을 제거할 수 있습니다.

댓글 남기기