메뉴
← 기술 블로그
글자 크기
Security2026.10.24

Node.js October 2026
보안 릴리스
Brotli RCE부터
TLS 우회까지 10개 CVE

2026년 10월 21일,Node.js가 모든 지원 릴리스 라인에 걸쳐 10개 취약점을 수정했습니다.그중 4개가 High 등급이며,하나는 원격 코드 실행이 가능합니다.

이 글은 2편 시리즈의 2편입니다.
1편: PHP2Shell, PHP 역사상 가장 위험한 취약점이 터졌다

PHP2Shell이 전 세계 웹서버를 뒤흔든 같은 날,Node.js도 10개의 보안 패치를 릴리스했습니다.

헤드라인은 CVE-2026-111497,Node.js에 번들된 Brotli 디코더의 Out-of-Bounds Write로원격 코드 실행이 가능한 취약점입니다.Node.js 커뮤니티에서는 PHP2Shell에 빗대어“Node2Shell”이라 부르고 있습니다.

10개 CVE 전체 목록

CVE-2026-111497HIGHzlib (Brotli)

Brotli 디코더 OOB Write — 원격 코드 실행

조작된 Brotli 스트림이 디코더 할당 영역 밖에 쓰기를 유발. Node.js는 이를 RCE로 분류.

영향: 22.x, 24.x, 26.x

CVE-2026-105482HIGHdns

NUL 바이트가 포함된 호스트네임으로 DNS 조회 조작

C 리졸버의 NUL 종단 처리와 Node.js의 호스트네임 검증 불일치로 다른 호스트로 조회가 우회됨.

영향: 22.x, 24.x, 26.x

CVE-2026-105483HIGHtls

전각(fullwidth) 숫자를 사용한 TLS 인증서 호스트네임 우회

IP를 전각 문자(U+FF10 등)로 표현하면 인증서 검증을 통과하면서 실제로는 다른 호스트로 연결.

영향: 24.x, 26.x

CVE-2026-106069HIGHtls

느슨한 IP 해석을 통한 TLS 인증서 호스트네임 우회

호스트가 느슨하게 IP로 변환되는 경우 인증서 hostname 검증을 우회 가능.

영향: 22.x, 24.x, 26.x

CVE-2026-105481MEDIUMhttp

HTTP keep-alive 응답 처리 문제

keep-alive 연결 재사용 시 응답 처리 불일치.

영향: 22.x, 24.x, 26.x

CVE-2026-106072MEDIUMtls

TLS 호스트네임 정규화 이전 검증 우회

서버 인증서 검증 시 호스트네임을 정규화하기 전에 비교하여 우회 가능.

영향: 22.x, 24.x, 26.x

CVE-2026-106074MEDIUMtrust store

eMudhra CA 인증서 제거

신뢰 저장소에서 eMudhra CA 인증서 제거.

영향: 22.x, 24.x, 26.x

CVE-2026-106073MEDIUMundici

Undici HTTP 클라이언트 취약점

번들된 Undici HTTP 클라이언트(fetch 구현체)의 보안 수정.

영향: 22.x, 24.x, 26.x

CVE-2026-106070LOWzlib (ZipFile)

ZIP 검증 시 공격자 제어 바이트 노출

ZIP 파일 검증 과정에서 공격자가 제어 가능한 바이트가 노출.

영향: 26.x

CVE-2026-106071LOWPermission Model

와일드카드 경로로 Permission Model 과잉 부여

와일드카드 패턴이 의도보다 넓은 파일시스템 접근을 허용.

영향: 26.x

CVE-2026-111497: Brotli 디코더 RCE — 이번 릴리스의 핵심

이 취약점은 Node.js 자체가 아니라Node.js에 번들된 Google Brotli 라이브러리에 있습니다.Brotli 프로젝트도 같은 날 1.2.1, 1.1.1, 1.0.10을 릴리스했으며,Python의 brotli, brotlicffi 패키지도 영향을 받습니다.

기술적 원인

Brotli 디코더의 AES_Cipher() 함수가출력 버퍼 길이를 signed int로 계산합니다.입력 크기가 2GiB의 배수가 되면 정수 오버플로가 발생하고,디코더가 할당된 메모리 영역 밖에 쓰기를 수행합니다.

수정 패치(upstream 98fbc89211)는TryGetIntCipherOutputLength() 가드를 crypto_cipher.h에 추가하여오버사이즈 입력이 오버플로 대신 안전하게 실패하도록 합니다.

어떤 서비스가 위험한가

“내가 제어하지 않는 Brotli 데이터를 디코딩하는 모든 곳”이 대상입니다.

• 외부 요청의 Brotli 인코딩된 request body를 받는 서버

• 외부 API 응답을 Brotli로 받아 처리하는 클라이언트

• 파일 암호화/압축 파이프라인

• 백업 툴링, CDN 프록시

CVSS v4.0 기준 9.2로 평가되었으며,입력을 공격자가 제어할 수 있는 환경에서는 즉시 대응이 필요합니다.

TLS 호스트네임 우회 3종 — 신뢰의 틈

이번 릴리스에서 High로 분류된 나머지 3개 CVE는모두 TLS와 DNS의 호스트네임 처리 불일치를 악용합니다.공격자가 영향을 줄 수 있는 호스트네임을Node.js가 검증하는 환경이라면 위험합니다.

CVE-2026-105482HIGH

NUL 바이트 호스트네임으로 DNS 조회 조작

Node.js는 호스트네임에 NUL 바이트(0x00)가 포함되어도전체 문자열을 인증서 검증에 사용합니다.하지만 C 리졸버는 NUL에서 잘라내므로검증된 호스트와 실제 연결 대상이 다를 수 있습니다.

영향: 22.x, 24.x, 26.x

CVE-2026-105483HIGH

전각 숫자로 TLS 와일드카드 인증 우회

유니코드 전각 숫자(U+FF10~U+FF19)로 IP 주소를 표현하면와일드카드 인증서(*.example.com)의 깊이 제한을 ���회할 수 있습니다.*.example.com 인증서가 a.b.example.com까지 유효해지는 상황.

영향: 24.x, 26.x

CVE-2026-106069HIGH

느슨한 IP 해석을 통한 TLS 인증서 검증 우회

호스트네임이 비표준 방식으로 IP 주소로 해석될 때인증서의 hostname 검증이 우회됩니다.webhook URL, 링크 프리뷰 등 공격자가 주소를 영향 줄 수 있는 곳에서 위험합니다.

영향: 22.x, 24.x, 26.x

이 세 가지 TLS 취약점은외부 URL을 받아 아웃바운드 TLS 연결을 만드는 서비스에서SSRF(Server-Side Request Forgery)와 결합될 수 있어특히 주의가 필요합니다.

패치 버전

Node.js 26 (Current)26.12.1
Node.js 24 (Krypton LTS)24.22.1
Node.js 22 (Jod LTS)22.23.4
Node.js 20 (EOL)패치 없음
Node.js 25, 23, 21 (EOL)패치 없음

Node.js 20 — 공식 패치 없음

Node.js 20은 2026년 4월 30일에 EOL에 도달했습니다.
10개 취약점 모두 Node.js 20에 해당되지만 패치는 제공되지 않습니다.
Node.js 22 또는 24로의 마이그레이션이 필요합니다.
EOL 버전의 상용 지원이 필요하면
HeroDevs NES 같은 서비스를 고려하세요.

버전업이 당장 어렵다면

Node.js는 PHP2Shell과 달리대부분의 CVE에 대해 우회 방법이 제한적입니다.그래도 위험을 줄일 수 있는 조치가 있습니다.

CVE-2026-111497 (Brotli RCE)

2GiB 이상 입력이 subtle.encrypt()에 도달하지 않도록 요청 크기를 제한하세요. reverse proxy(Nginx, HAProxy)에서 request body size를 제한하는 것이 가장 현실적입니다.

TLS 관련 (105482, 105483, 106069)

외부 입력으로 호스트네임을 구성하는 아웃바운드 연결을 점검하세요. webhook URL, 링크 프리뷰, 외부 API 연동에서 호스트네임 검증 로직을 추가하거나 허용 목록(allowlist)을 적용하세요.

Docker / 컨테이너 환경

공식 Node.js Docker 이미지는 10월 21일에 업데이트되었습니다. 이미지 태그를 고정하지 않고 latest나 22-slim 같은 rolling 태그를 사용 중이라면 이미지를 리빌드하세요.

Node.js를 번들하는 경우

Electron, pkg, nexe 등으로 Node.js를 내장하는 바이너리는 Node.js 업데이트와 별개로 리빌드가 필요합니다.

Brotli — Node.js만의 문제가 아니다

CVE-2026-111497은 Google Brotli 라이브러리 자체의 결함이므로Brotli를 사용하는 다른 런타임과 패키지도 영향을 받습니다.

Node.js22.23.4, 24.22.1, 26.12.1
Brotli (upstream)1.0.10, 1.1.1, 1.2.1
Python brotli (PyPI)1.2.1
Python brotlicffi (PyPI)1.2.1.0
Bun1.4.4

Go, Rust, Java의 Brotli 구현은별도의 네이티브 구현이거나Google C 라이브러리를 바인딩하는 방식에 따라 영향 여부가 다릅니다.사용 중인 Brotli 라이브러리의 버전을 확인하세요.

대응 체크리스트

✓Node.js 버전 확인: node -v 로 전체 환경의 버전 파악
✓패치 적용: 22.23.4 / 24.22.1 / 26.12.1 로 업데이트
✓Node.js 20 이하: 즉시 22 또는 24로 마이그레이션 계획
✓Docker 이미지: 10/21 이후 빌드된 공식 이미지로 리빌드
✓Brotli 사용 여부 확인: Python brotli, brotlicffi도 업데이트
✓TLS 아웃바운드 연결: 외부 입력으로 호스트네임을 구성하는 곳 점검
✓reverse proxy: request body size 제한 확인
✓Node.js를 번들하는 바이너리: 리빌드 필요

PHP2Shell과 같은 날 릴리스되어 상대적으로 덜 주목받았지만,Brotli RCE(CVE-2026-111497)는 CVSS 9.2의 심각한 취약점입니다.TLS 우회 취약점 3건도 SSRF 체인에 활용될 가능성이 높아빠른 패치가 필요합니다.

Node.js는 PHP와 달리 워커 프로세스 내부에서의메모리 안전성 문제보다는 입출력 경계의 검증 불일치가 주된 위협입니다.리버스 프록시에서 입력 크기를 제한하고,외부 입력 기반의 아웃바운드 연결을 점검하는 것이버전 업데이트와 함께 할 수 있는 현실적 방어입니다.

본 글은 리원에이스 기술개발본부가 작성한 기술 콘텐츠입니다. 외부 공유 시 출처를 명시해 주세요.

2026년 10월 24일
리원에이스 기술개발본부