🇰🇷 한글 설명
Node.js의 zlib.ZipFile API에서 로컬 헤더와 중앙 디렉터리 검증이 실패한 뒤에도 요청한 엔트리가 아닌 바이트를 반환할 수 있는 결함입니다. 검증 오류 후 파싱된 로컬 헤더가 콘텐츠 오프셋 없이 캐시되어, 이후 읽기에서 파일 시작 부분의 공격자 제어 바이트가 반환되며 CRC-32 검증도 통과합니다. 이 영향은 Node.js 26.x에 있습니다.
💡 쉬운 설명
Node.js로 만든 ZIP 검사 프로그램이 실제 파일과 다른 내용을 안전하다고 판단할 수 있습니다. 공격자가 만든 ZIP 파일을 통해 이런 불일치를 악용할 수 있습니다.
🇺🇸 원문 (English)
A flaw in the Node.js `zlib.ZipFile` API can cause it to return bytes that do not belong to the requested entry after the local and central header validation fails.
When `zipEntry.modified` is read on an archive whose local header does not match its central directory, either directly or while compacting the archive, the validation error is caught but the parsed local header is left cached without a content offset. A later content read then returns attacker-controlled bytes from the start of the file instead of rejecting the archive, and CRC-32 verification still passes because the attacker controls the central directory CRC. A Node.js-based scanner can therefore approve different content from what another ZIP implementation extracts from the same archive.
This vulnerability affects Node.js **26.x**.
📍 영향받는 시스템
Node.js 26.x의 zlib.ZipFile API를 사용하는 ZIP 처리 애플리케이션 및 보안 스캐너
⚔️ 공격 벡터
로컬 헤더와 중앙 디렉터리가 일치하지 않도록 조작한 ZIP 아카이브를 Node.js 기반 스캐너에 전달해 다른 내용을 승인받게 함
🛡️ 대응 방법
Node.js 26.x를 패치된 버전으로 업데이트하거나, 취약한 zlib.ZipFile 사용을 중단하고 신뢰할 수 있는 다른 ZIP 파서를 사용
🔧 검증 코드
출력이 v26.으로 시작하면 취약 버전 계열이므로 패치 버전 적용 여부를 확인해야 하며, 출력이 없으면 해당 메이저 버전이 아닙니다.
node -v 2>/dev/null | grep -E '^v26\.'