Node.js를 넘어선 Brotli 취약점, 어디까지 점검하고 디코딩은 끌 수 있나
Node.js의 런타임 업데이트로 드러난 Brotli 디코더 결함은 같은 C 코드를 포함한 Python 패키지에도 영향을 줍니다. 각 환경의 입력 경로와 수정 버전, Brotli 디코딩을 끄는 선택지를 살펴보되, 기능 비활성화가 패치를 대체하는지는 구분해야 합니다.
Node2Shell: Node.js Brotli vulnerability allows remote code execution (CVE-2026-111497)
Node.js의 Brotli 디코더에서 비정상 입력이 메모리 경계를 벗어나 쓰게 하는 취약점이 발견됐습니다. 공격자가 조작한 압축 데이터를 처리하면 서비스 장애나 메모리 노출, 원격 코드 실행으로 이어질 수 있으며, 패치 버전으로 업그레이드해야 합니다.
에디터 노트
이번 취약점은 공격자가 통제하는 압축 데이터를 처리할 때만 노출되지만, Express 5와 body-parser 2.x의 수신 요청 처리 및 fetch()의 자동 응답 해제처럼 입력 경로가 여러 곳에 있습니다. Node.js 24.22.0에서 연구자들이 코드 실행을 보고했고 24.22.1이 같은 입력을 거부한다는 설명은 업그레이드 우선순위를 뒷받침합니다. 10월 22일 기준 실제 악용 보고가 없다는 사실과 연구 환경에서 코드 실행이 확인됐다는 사실은 구분해야 합니다. 댓글에서 제기한 2월 상류 수정과 10월 Node.js 반영 사이의 간격은 공급망에서 보안 수정이 런타임에 도달하기까지 걸리는 시간을 드러냅니다. 다만 커밋 메시지만으로 보안 영향이 명확했는지, 반영 지연에 어떤 사정이 있었는지는 자료에 나오지 않습니다. 인바운드 차단은 fetch() 응답을 막지 못하므로 임시 규칙을 적용한 서비스도 런타임 업그레이드를 별도로 마쳐야 합니다.
AI 요약
Node.js와 Bun에서 Brotli 데이터를 해제할 때 메모리 경계를 벗어나 쓰는 취약점 CVE-2026-111497이 발견됐습니다. 공격자가 조작한 입력을 처리하면 프로세스가 중단되거나 메모리 일부가 노출될 수 있고, 원격 코드 실행도 가능합니다. Node.js는 취약점 심각도를 높음으로 분류했습니다.
Node.js 22.x, 24.x, 26.x는 각각 22.23.4, 24.22.1, 26.12.1에서 수정됐습니다. Bun은 1.4.4 이상으로 올려야 합니다. 25.x, 23.x, 20.x 및 이전 Node.js 버전은 지원 종료 상태라 수정 버전이 제공되지 않습니다.
공격자가 제어하는 Brotli 데이터가 런타임에 들어와야 취약점이 발동합니다. Express 5와 body-parser 2.x는 Brotli로 압축한 요청 본문을 해제하므로 공격자가 조작한 요청을 받을 수 있습니다. 반면 기본 Node.js HTTP 서버는 수신한 Brotli 본문을 자동으로 해제하지 않습니다. fetch()는 Brotli 응답을 자동 해제하므로 공격자가 운영하거나 침해한 서버에서 받은 응답도 입력 경로가 됩니다. node:zlib의 Brotli 함수에 신뢰할 수 없는 데이터를 전달하는 코드 역시 영향을 받습니다.
호스트, CI 실행기, 서버와 컨테이너 안에서 Node.js 버전을 확인하고 같은 릴리스 라인의 수정 버전 이상으로 올려야 합니다. 이전 태그로 고정한 컨테이너 이미지는 다시 빌드하고 배포해야 합니다. 관리형 플랫폼은 자체 런타임 업데이트가 늦을 수 있으므로 제공자가 실행하는 버전도 확인해야 합니다. Linux 배포판 패키지는 Node.js에 번들된 Brotli 대신 시스템 Brotli 라이브러리를 쓸 수 있어 배포판 보안 공지도 확인해야 합니다.
즉시 업그레이드하지 못하면 리버스 프록시나 로드밸런서에서 Content-Encoding: br 요청을 거부해 수신 요청의 노출을 줄일 수 있습니다. Vercel은 10월 21일 인바운드 요청을 차단하는 방화벽 규칙을 추가했습니다. 다만 이런 조치는 다른 서버에서 받은 Brotli 응답에는 적용되지 않습니다. 원문은 런타임 업그레이드만이 취약점을 제거한다고 설명합니다.
문제는 Brotli 디코더의 범위를 벗어난 쓰기(out-of-bounds write)입니다. Node.js는 Brotli 프로젝트의 0ed4268a 커밋을 가져와 잘못된 입력을 감지하고 버퍼 바깥에 쓰기 전에 처리를 중단하도록 수정했습니다. 같은 수정은 Brotli 1.2.1, 1.1.1, 1.0.10에도 포함됐습니다.
10월 22일 공개된 첫 PoC는 의도적으로 약화한 테스트 빌드에서만 코드 실행에 성공했습니다. 같은 날 연구자들은 수정 전 공식 Node.js 24.22.0 Linux arm64 이미지에서도 코드 실행을 보고했지만 매번 성공하지는 않았다고 원문은 전합니다. Node.js 24.22.1은 같은 입력을 거부하며, 10월 22일 기준 실제 공격 사례는 보고되지 않았습니다.
원문: Aikido / 번역·요약: Trawling
Node.js의 런타임 업데이트로 드러난 Brotli 디코더 결함은 같은 C 코드를 포함한 Python 패키지에도 영향을 줍니다. 각 환경의 입력 경로와 수정 버전, Brotli 디코딩을 끄는 선택지를 살펴보되, 기능 비활성화가 패치를 대체하는지는 구분해야 합니다.