SECURITY ADVISORY
Node.js Node2Shell 대응 가이드
이슈 요약
신뢰할 수 없는 Brotli 데이터를 해제하는 Node.js 서비스는 프로세스 종료·메모리 노출·원격 코드 실행의 영향을 받을 수 있습니다.
공격자가 제어할 수 있는 Brotli 데이터를 애플리케이션이 직접 또는 간접적으로 압축 해제하는 경로가 점검 대상입니다. 모든 Node.js URL이 외부로 직접 노출되어 취약한 것은 아니지만, 클라이언트 요청 본문 처리, 외부 API 응답 수신, 비동기 작업 큐 처리 경로를 반드시 확인해야 합니다.
주의: 단순 npm 패키지 의존성 업데이트나 lockfile 갱신만으로는 Node.js 런타임 자체의 취약점이 해결되지 않습니다. 실행 환경의 Node.js 런타임 버전을 직접 교체해야 합니다.
영향 대상과 확인 경로
다음과 같이 애플리케이션이 Brotli 입력을 압축 해제하는 경로를 식별하세요.
1. 요청 본문 압축 해제
클라이언트가 전송한 Content-Encoding: br 요청 본문을 웹 프레임워크나 미들웨어에서 자동 압축 해제하는 경로.
2. 외부 API 응답 수신
서버가 외부 HTTP API나 웹훅을 호출하고 수신한 Brotli 응답 본문을 내부에서 압축 해제하는 경로.
3. 직접 압축 해제 함수 호출
애플리케이션 코드에서 zlib.brotliDecompress(), zlib.createBrotliDecompress() 등을 통해 파일이나 메시지 큐 데이터를 처리하는 경로.
버전별 수정 기준
2026-10-21 공식 보안 릴리스에서 확인한 이 취약점의 수정 기준입니다. 영구적인 최신 버전 표가 아니므로, 적용 전 해당 계열의 최신 보안 릴리스와 지원 상태를 다시 확인하세요.
| 계열 | 수정 기준 | 지원 상태 |
|---|---|---|
| 22.x | 22.23.4 이상 | LTS |
| 24.x | 24.22.1 이상 | LTS |
| 26.x | 26.12.1 이상 | Current |
지원 상태 기준일: 2026-10-27. 운영 환경은 지원 중인 LTS 계열을 우선 검토하세요. 지원 종료(EOL) 계열은 지원 계열로 이전하고, 배포판 패키지·벤더 빌드는 공급자 공지로 수정 포함 여부를 확인하세요. 버전 숫자만으로 안전을 단정하지 않습니다.
실행 중인 버전 확인
개발 PC가 아닌 실제 운영 서버·컨테이너 안에서 확인합니다. 컨테이너 이름은 실제 실행 중인 대상으로 바꾸세요.
node --version
docker exec <container> node --version환경별 대응 6단계
테스트 환경에서 먼저 확인한 뒤 운영에 반영합니다. 확인부터 전체 인스턴스 재확인까지 순서대로 진행하세요.
확인 (Inspect)
실제 컨테이너·서버·작업자에서 실행 중인 런타임 버전을 확인합니다.
개발자 로컬 PC의 node --version만으로 운영 환경 확인을 완료 처리하지 마세요.
영향 파악 (Analyze)
요청 본문 처리, 외부 API 호출, 파일/큐의 Brotli 직접 사용 코드를 조사합니다.
외부 HTTP 헤더만 보고 내부 영향이 없다고 속단하지 마세요.
수정 (Patch)
베이스 이미지(Dockerfile) 또는 서버 런타임을 공식 수정 버전 이상으로 변경합니다.
npm update 또는 package-lock.json 수정만으로 런타임 패치가 끝났다고 간주하지 마세요.
검증 (Verify)
스테이징/테스트 환경에서 서비스 기동, 압축 데이터 처리, 에러 핸들링을 테스트합니다.
테스트 검증 없이 운영 환경에서 전역 런타임 교체를 직접 수행하지 마세요.
반영 (Deploy)
새 이미지를 빌드 및 배포하고, 실행 중인 이전 컨테이너 프로세스를 순차 교체합니다.
파일만 복사하고 이전 프로세스가 살아있는 상태에서 배포 완료 처리하지 마세요.
재확인 (Audit)
배포된 전체 인스턴스의 런타임 버전과 정상 트래픽 응답 상태를 점검합니다.
단일 인스턴스 1개의 성공을 전체 클러스터의 완료로 확대 해석하지 마세요.
임시 완화책과 한계
WAF나 역방향 프록시(Nginx, Cloudflare 등)에서 Content-Encoding: br 요청 헤더를 거부하도록 설정하면 외부 공격자가 전송하는 요청 본문 압축 해제 경로는 일시 차단할 수 있습니다.
하지만 이 설정은 애플리케이션이 외부 API에서 수신하는 Brotli 응답이나 비동기 큐 메시지 해제 경로까지는 보호하지 못합니다. 임시 조치일 뿐 근본 해결책이 아니므로 반드시 런타임 업데이트를 완료해야 합니다.
외부 점검 도구 참고 · Xint
Node.js Guard
2026-10-27에 Node.js Guard 공개 페이지와 URL 입력 양식을 확인했습니다. 실제 검사는 실행하지 않았으며, 검사 결과의 정확성과 이용 가능 여부는 보증하지 않습니다. 현재 이용 조건은 공식 사이트에서 확인하세요.
해당 검사는 대상 Node.js 프로세스를 종료시킬 수 있습니다. 소유하거나 명시적으로 검사 권한을 받은 시스템에서, 영향 범위를 검토한 뒤 이용하세요.
외부 도구 이용은 선택 사항입니다. 이 가이드의 업데이트·재확인 절차부터 진행할 수 있습니다. Super Wednesday는 이 도구를 운영하거나 검사 결과를 보증하지 않습니다.
Node.js Guard 안내 보기 · 외부 사이트 (새 창)운영 담당자에게 전달할 확인 목록
외주 개발사 또는 인프라 운영 담당자에게 점검을 요청할 때 활용할 수 있는 체크리스트입니다.
- 운영 중인 서버 및 컨테이너의 실제 Node.js 버전 확인 (22.23.4 / 24.22.1 / 26.12.1 미만 여부)
- 요청 본문, 외부 API 응답, 파일 처리 중 Brotli 압축 해제(zlib.brotliDecompress) 사용 위치 식별
- Dockerfile 베이스 이미지 또는 런타임 환경을 공식 수정 버전 이상으로 업데이트
- 스테이징 환경에서 압축 데이터 정상 처리 및 핵심 서비스 API 검증
- 운영 클러스터 롤링 재배포 후 구버전 인스턴스 완전 종료 및 전수 버전 일치 확인
공식 출처 및 기술 근거
- Node.js 2026-10-21 보안 공지 (공식 블로그) (새 창)
CVE-2026-111497 Brotli decoder 메모리 오류 및 보안 릴리스 범위 공지
- Node.js v22.23.4 릴리스 노트 (새 창)
22.x LTS 수정 릴리스
- Node.js v24.22.1 릴리스 노트 (새 창)
24.x 수정 릴리스
- Node.js v26.12.1 릴리스 노트 (새 창)
26.x 수정 릴리스
내용 수정 이력
- 2026-10-27 · B 구성의 가독성과 탐색 개선. 공식 수정 기준·지원 상태 재확인, 외부 도구 공개 페이지 확인 범위 정정. 실제 검사 미실행.
- 2026-10-26 · 최초 가이드 작성: Node.js 2026-10-21 공식 보안 공지 및 릴리스 기준 확인, 외부 도구(Node.js Guard) 상태 점검 반영.
업데이트와 배포 적용이 필요하신가요?
런타임 업데이트와 배포 적용이 필요하다면 현재 운영 환경과 필요한 작업 범위를 알려주세요. 적용 절차와 서비스 영향을 함께 검토합니다.
업데이트·배포 적용 상담