피드로 돌아가기
Node.js 8.8.0 (Current)
Node.js BlogNode.js Blog
Backend

Node.js 8.8.0이 http2를 기본 노출하고 zlib CVE-2017-14919 취약점을 windowBits 자동 조정으로 해결

Node.js 8.8.0 (Current)

2017년 10월 24일5intermediate

Context

Node.js 8.8.0 이전에는 http2 모듈을 사용하기 위해 특정 플래그가 필요했으며, zlib 1.2.9의 windowBits=8 설정 시 크래시 또는 예외가 발생하는 DOS 벡터가 존재했다.

Technical Solution

  • http2를 기본 노출: 플래그 없이 http2 모듈을 직접 require 가능하도록 변경
  • NODE_NO_HTTP2 환경 변수 추가: 사용자 영역 http2 구현이 필요한 경우 기본 노출을 비활성화할 수 있는 옵션 제공
  • http2 Duplex 스트림 지원: 제네릭 Duplex 스트림에 대한 지원 추가
  • ESM 라이프사이클 후크 추가: resolve 및 instantiate loader pipeline 후크를 모듈 시스템에 추가
  • zlib CVE-2017-14919 완화: raw deflate 스트림 초기화 시 windowBits=8 설정이 감지되면 자동으로 windowBits=9로 조정하여 DOS 벡터 방지

Key Takeaway

런타임 수준의 보안 취약점은 사용자 코드 수정을 강제하지 않으면서 기본 동작을 변경하는 방식으로 완화할 수 있으며, 환경 변수를 통한 옵트아웃 메커니즘은 레거시 호환성을 유지하면서 새 기능을 기본 활성화할 수 있는 설계 패턴이다.


Node.js를

8.

8.0 이상으로 업그레이드하는 팀은 http2를 명시적 플래그 없이 즉시 사용 가능하며, 기존 http2 사용자 구현이 있다면 NODE_NO_HTTP2 환경 변수로 충돌을 방지할 수 있다. 또한 zlib 기반 압축을 사용하는 애플리케이션은 windowBits 설정 검증 로직을 제거해도 DOS 공격으로부터 자동 보호된다.

원문 읽기