Node.js를 포함한 다른 HTTP/2 구현체에서 서비스 거부 공격의 취약점이 발견되었습니다. 더 자세한 내용은 https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md를 참고해 주세요.
모든 Node.js 활성 릴리스 라인에서 업데이트 버전을 사용할 수 있습니다. 여기에는 Node.js 8.x의 Linux ARMv6 빌드도 포함되었습니다.(이는 연기되었습니다.)
모든 Node.js 사용자는 가능한 한 빨리 아래 목록에 있는 버전으로 업그레이드 하길 권장합니다.
다운로드와 릴리스 상세 내용
다음의 버전을 다운로드 받을 수 있습니다. 각 릴리스 페이지에서 코드 변경 내역도 볼 수 있습니다.
- Node.js 8.16.1: https://nodejs.org/dist/latest-v8.x/
- Node.js 10.16.3: https://nodejs.org/dist/latest-v10.x/
- Node.js 12.8.1: https://nodejs.org/dist/latest-v12.x/
수정된 취약점
영향: Node.js 8(LTS “Carbon”), Node.js 10(LTS “Dubnium”), Node.js 12 (Current)의 모든 버전은 다음 내용에 취약합니다.
- CVE-2019-9511 “Data Dribble”: 공격자는 특정 리소스에서 대량의 데이터를 여러 스트림으로 요청합니다. 윈도우 크기 및 스트림 우선 순위를 조작하여 서버가 1 바이트 청크로 데이터를 큐에 넣도록 합니다. 이 데이터를 얼마나 효율적으로 큐에 넣는지에 따라 CPU, 메모리를 과도하게 소비하게 하여 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9512 “Ping Flood”: 공격자는 지속적인 핑을 HTTP/2 피어로 보내 피어가 내부 응답 큐를 작성하게 합니다. 이 데이터를 얼마나 효율적으로 큐에 넣는지에 따라 CPU, 메모리를 과도하게 소비하게 하여 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9513 “Resource Loop”: 공격자는 여러 요청 스트림을 생성하고 우선 순위 트리에 상당한 변동을 일으키는 방식으로 스트림 우선 순위를 계속 섞습니다. 이로 인해 과도한 CPU가 소비되어 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9514 “Reset Flood”: 공격자는 여러 스트림을 열고 각 스트림을 통해 잘못된 요청을 보내 피어에서 RST_STREAM 프레임의 스트림을 요청합니다. 피어가 RST_STREAM 프레임을 큐에 넣는 방법에 따라 메모리, CPU를 소비하게 하여 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9515 “Settings Flood”: 공격자는 SETTINGS 프레임 스트림을 피어에게 보냅니다. RFC는 SETTINGS 프레임당 하나의 승인으로 피어 응답을 요구하므로 빈 SETTINGS 프레임은 핑과 거의 동일하게 행동합니다. 이 데이터를 얼마나 효율적으로 큐에 넣는지에 따라 CPU, 메모리를 과도하게 소비하게 하여 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9516 “0-Length Headers Leak”: 공격자는 길이가 0인 헤더 이름과 길이가 0인 헤더 값을 가지는 헤더 스트림을 보냅니다. 추가로 이 헤더의 허프만 인코딩 결과가 1 바이트 이상일 수 있습니다. 일부 구현에서는 이러한 헤더에 메모리를 할당하고 세션이 종료될 때까지 할당을 유지합니다. 이로 인해 불필요한 메모리가 소비되어 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9517 “Internal Data Buffering”: 공격자는 HTTP/2 윈도우를 열어서 피어가 제약 없이 전송할 수 있지만, TCP 윈도우를 닫아 놓기 때문에 피어가 실제로 (많은) 바이트를 쓸 수는 없습니다. 이 상태에서 공격자는 큰 응답 개체에 대한 요청 스트림을 보냅니다. 서버가 응답을 큐에 넣는 방법에 따라 메모리, CPU를 과도하게 소비하여 서비스 거부가 발생할 수 있습니다.
- CVE-2019-9518 “Empty Frames Flood”: 공격자는 end-of-stream 플래그 없이 빈 페이로드 프레임 스트림을 보냅니다. 이 프레임은 DATA, HEADERS, CONTINUATION, PUSH_PROMISE일 수 있습니다. 피어는 각 프레임을 처리하는 데 시간을 소비하여 대역폭을 공격합니다. 이로 인해 과도한 CPU가 소비되어 서비스 거부가 발생할 수 있습니다.(구글의 Piotr Sikora가 발견)
연락처와 차후 업데이트
현재 Node.js 보안 정책과 취약점을 어떻게 보고할 수 있는지는
https://nodejs.org/en/security/에서 볼 수 있습니다.
Node.js의 보안 취약점과 보안과 관련된 릴리스의 최신 정보를 얻으려면
https://groups.google.com/forum/#!forum/nodejs-sec에서 소수의 공지만 하는
nodejs-sec 메일링 리스트를 구독해 주세요. 이 프로젝트는
nodejs GitHub 조직에서 관리하고 있습니다.