JavaScript 런타임 Node.js 프로젝트가 2026년 10월 21일, 22.x·24.x·26.x 전 지원 라인을 아우르는 긴급 보안 릴리스를 내놓았다. 이번 업데이트(v22.23.4·v24.22.1·v26.12.1)는 모두 10개 취약점을 수정했으며, 최고 심각도는 '높음(High)'으로 분류됐다. 최심부로 꼽힌 결함은 압축 데이터만으로 서버에서 코드를 실행할 수 있는 원격 코드 실행(RCE) 위험이 있다는 점에서 주목받는다. 같은 주 PHP 긴급 패치에 이은 연쇄 보안 점검 속에서, Node.js 기반 서비스 운영자의 신속한 업그레이드가 요구되고 있다.

개발 환경에서 코드를 다루는 모습. Node.js 사용자는 최신 보안 버전으로의 업그레이드가 필요하다 / 출처: PxHere / 라이선스: FREE(CC0)

압축 데이터로 서버 장악 노리는 Brotli 결함

이번 릴리스에서 가장 큰 관심을 받은 것은 Brotli 디코더의 허점이다. Brotli는 웹에서 널리 쓰이는 데이터 압축 포맷으로, Node.js는 내장 압축 모듈 node:zlib를 통해 이를 처리한다. 문제의 결함(CVE-2026-111497)은 형식이 잘못된 압축 입력을 처리하는 과정에서 디코더 내부 버퍼를 넘어 데이터를 기록하는 '버퍼 오버플로우' 형태로 드러났다.

디코더가 잘못된 블록 전환을 형식 오류가 아닌 '추가 입력 필요'로 잘못 판단하면서 내부 버퍼에 데이터가 계속 덧붙는 구조다. 외부에서 받은 Brotli 데이터를 해제하는 앱이라면 공격자가 이를 악용해 프로세스 메모리를 손상시킬 수 있고, 이것이 충돌·메모리 유출·원격 코드 실행으로 이어질 수 있다. 보안 커뮤니티는 이 취약점을 'Node2Shell'로 부른다.

"애플리케이션이 node:zlib로 압축을 해제하는 Brotli 데이터를 공격자가 공급할 수 있다면, 프로세스 메모리 손상으로 이어질 수 있다" — Node.js 공식 보안 공지(2026년 10월 21일)

전송 계층 신원 확인을 흔드는 TLS 검증 결함

'높음' 등급 4건 중 3건은 TLS 인증서 검증과 관련돼 있다. IP 주소를 '127.0.0.1'처럼 전각 숫자로 적으면 검증 로직이 IP로 인식하지 못해 다른 용도의 인증서가 승인될 수 있고(CVE-2026-105483), '0127.0.0.1'처럼 앞자리 0이 붙은 주소를 운영체제와 라이브러리가 서로 다르게 해석하는 불일치도 노린다(CVE-2026-106069). '0x7f.0.0.1' 같은 비표준 IPv4 표기에 DNS 이름 항목만 담은 인증서로도 IP 접속을 통과시킬 수 있는 문제(CVE-2026-106072, 중간 등급)도 함께 수정됐다.

여기에 DNS 조회 함수 dns.resolve가 NUL 문자가 포함된 호스트명을 조용히 잘라버리는 결함(CVE-2026-105482)도 함께 수정됐다. 도메인 허용목록으로 호스트명을 검증한 뒤 조회를 수행하는 애플리케이션이, 검증한 이름과 다른 이름의 레코드를 그대로 받아 쓸 수 있는 위험이 있다. 이 밖에도 keep-alive 응답 뒤바꿈, 시작 스냅샷의 난수 반복, ZIP 처리·권한 모델 관련 하위 등급 결함들도 정리됐다.

데이터 센터 서버실 내부. Node.js는 웹 서버·API·빌드 도구 등 광범위한 환경에서 동작한다 / 출처: Pexels / 라이선스: FREE

Next.js·NestJS·Nuxt 사용자가 알아야 할 내용

이번 결함은 프레임웍 코드가 아니라 Node.js 런타임 자체에 있기 때문에, Next.js·NestJS·Nuxt처럼 Node.js 위에서 동작하는 프레임웍 사용자는 프레임웍 버전만 최신으로 올려서는 해결되지 않는다. 실행 환경의 Node.js를 22.23.4·24.22.1·26.12.1 가운데 해당하는 버전으로 올리는 것이 유일한 근본 대책이다.

프레임웍별 노출 양상은 조금씩 다르다. NestJS는 Express 5와 body-parser 2.x가 'Content-Encoding: br'로 지정된 요청 본문을 자동으로 압축 해제하기 때문에, 누구나 보낼 수 있는 요청 경로가 처음부터 열려 있는 셈이다. Next.js는 이미지 최적화처럼 외부 응답을 받아 처리하는 기능이 노출 경로가 될 수 있으며, 도커 등으로 셀프호스팅할 경우 런타임 교체가 필수다. Vercel 같은 관리형 플랫폼은 패치된 런타임과 방화벽 규칙을 플랫폼 쪽에서 적용하지만, Node.js 20.x로 고정해 뒀다면 22.x 이상으로 바꿔 재배포해야 한다. Nuxt의 node-server 프리셋이나 도커 배포도 동일하게 해당된다. Next.js는 별도로 10월 14일 프레임웍 자체 보안 업데이트를 공개했으나 이번 런타임 문제와는 별개 조치다. Bun으로 서비스를 구동하는 경우에도 1.4.4 미만 버전은 같은 Brotli 결함을 지니고 있어 1.4.4 이상으로 올려야 한다.

PHP 'PHP2Shell'에 이은 연쇄 보안 비상

이번 Node.js 패치는 앞서 벌어진 PHP 긴급 패치와 함께 개발 생태계의 초고압 보안 주간으로 기억될 전망이다. PHP 진영은 10월 21일, 인증 없는 원격 코드 실행이 가능한 중대 결함 두 건(CVE-2026-109618·CVE-2026-109619, CVSS 9.2)을 수정한 8.2.35부터 8.5.12까지의 버전을 내놓았고, 미국 국가안보국(NSA)은 업데이트가 어려운 조직은 시스템을 외부로부터 분리하라고까지 권고했다. 같은 기간 LLM 프록시 라이브러리 LiteLLM의 공급망 침해와 인도 인증기관 eMudhra의 개인키 유출도 터졌고, Node.js도 이번 릴리스에서 유출된 키로 서명된 인증서를 신뢰하지 않도록 내장 CA 저장소를 갱신했다.

10월 22일에는 공개 개념증명(PoC)이 나왔고, 같은 날 연구자들이 공식 Node.js 24.22.0 이미지를 상대로 코드 실행에 성공했다는 보고도 나왔다. 성공률은 100%가 아니었지만, 야외 악용이 아직 미보고인 가운데서도 실험실 수준의 실행 가능성이 확인된 만큼 대응을 미루기 어렵다.

회로 기판 위 자물쇠. TLS 인증서 검증 결함은 서버의 신원 확인 체계를 흔들 수 있다 / 출처: Public Domain Pictures / 라이선스: FREE

운영자가 지금 확인할 것

Node.js 사용자는 v22.23.4, v24.22.1, v26.12.1 가운데 해당하는 최신 보안 버전으로 업그레이드하면 된다. Node.js 20 이하 등 지원이 끝난 버전은 이런 패치를 받지 못하므로 지원 라인 이전도 함께 검토해야 한다.

이번 릴리스는 c-ares, OpenSSL, SQLite, Undici 같은 내장 의존성도 함께 갱신했으며, 시작 스냅샷이나 단일 실행 파일(SEA)로 패키징한 앱은 갱신된 런타임으로 재빌드해야 한다. 당장 업그레이드가 어렵다면 리버스 프록시에서 Brotli 압축 요청을 차단하는 임시 완화책이 있으나, 외부에서 받아 해제하는 응답까지는 막지 못한다. AI가 취약점 발굴 속도를 끌어올리는 만큼 운영자의 패치 속도도 그에 걸맞아야 한다.

참고 자료: Node.js 공식 보안 공지(2026년 10월 21일), Vercel 보안 권고문, Aikido 기술 분석, PHP 재단 보도자료