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) 로직이 들어갑니다.
그러나 이 함수에는 다음과 같은 기술적 결함이 있었습니다.
- 타입 검증 부재: 변환 단계에서 세그먼트의 타입을 엄격하게 검증하는 절차가 빠져 있었습니다.
- 가드 우회 경로: 문자열이 아닌 비원시 값(예: 배열)으로 강제 변환(coerce)되는
__proto__키가 사용되면 기존의 엄격한 문자열 비교 가드를 그대로 통과하게 됩니다. - 속성 접근 도달: 동등 비교를 통과한 위험한 키가 실제 객체의 속성 접근 단계까지 도달해 프로토타입을 오염시킬 수 있는 상태가 됩니다.
영향 범위 및 위험성
이번 취약점은 특정 버전 범위의 패키지를 사용하는 모든 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에 반영되었습니다. 주요 수정 내용은 다음과 같습니다.
- 비원시 세그먼트 거부: 속성에 접근하기 전에 세그먼트가 원시 값(Primitive)인지 확인하고, 비원시 세그먼트의 접근을 원천적으로 거부하도록 변경되었습니다.
- 공통 헬퍼 도입:
isSafeObjectKey와isDangerousObjectKey헬퍼 함수를 도입해 여러 호출 지점에서 일관된 보안 검증 로직을 공유하도록 개선되었습니다.
인프라 보안 담당자와 개발자가 가장 먼저 확인할 것은 현재 사용 중인 @graphql-tools/utils의 버전입니다. 10.10.1에서 12.0.1 사이 버전을 쓰고 있다면 즉시 12.0.2 이상으로 업그레이드해 프로세스 오염 위험을 제거할 수 있습니다.