주요 변경사항
보안 릴리스입니다.
HTTP/2의 다른 구현체와 마찬가지로 Node.js에서 서비스 거부 공격을 할 수 있는
취약점이 발견되었습니다.
더 자세한 정보는 https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-002.md에서
확인하세요.
다음 취약점이 수정되었습니다.
- 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가 발견)
Commits
- [
6d427378c0
] - deps: update nghttp2 to 1.39.2 (Anna Henningsen) #29122 - [
33d4d916d5
] - deps: update nghttp2 to 1.39.1 (gengjiawen) #28448 - [
17fad97113
] - deps: update nghttp2 to 1.38.0 (gengjiawen) #27295 - [
0b44733695
] - deps: update nghttp2 to 1.37.0 (gengjiawen) #26990 - [
5afc77b044
] - deps: update nghttp2 to 1.34.0 (James M Snell) #23284 - [
073108c855
] - http2: allow security revert for Ping/Settings Flood (Anna Henningsen) #29122 - [
6d687f7af8
] - http2: pause input processing if sending output (Anna Henningsen) #29122 - [
854dba649e
] - http2: stop reading from socket if writes are in progress (Anna Henningsen) #29122 - [
a3191689dd
] - http2: consider 0-length non-end DATA frames an error (Anna Henningsen) #29122 - [
156f2f35df
] - http2: shrink defaultvector::reserve()
allocations (Anna Henningsen) #29122 - [
10f05b65c4
] - http2: handle 0-length headers better (Anna Henningsen) #29122 - [
ac28a628a5
] - http2: limit number of invalid incoming frames (Anna Henningsen) #29122 - [
11b4e2c0db
] - http2: limit number of rejected stream openings (Anna Henningsen) #29122 - [
7de642b6f9
] - http2: do not create ArrayBuffers when no DATA received (Anna Henningsen) #29122 - [
dd60d3561a
] - http2: only call into JS when necessary for session events (Anna Henningsen) #29122 - [
00f6846b73
] - http2: improve JS-side debug logging (Anna Henningsen) #29122 - [
b095e35f1f
] - http2: improve http2 code a bit (James M Snell) #23984 - [
cc282239c1
] - test: apply test-http2-max-session-memory-leak from v12.x (Anna Henningsen) #29122
Windows 32-bit Installer: https://nodejs.org/dist/v8.16.1/node-v8.16.1-x86.msi
Windows 64-bit Installer: https://nodejs.org/dist/v8.16.1/node-v8.16.1-x64.msi
Windows 32-bit Binary: https://nodejs.org/dist/v8.16.1/win-x86/node.exe
Windows 64-bit Binary: https://nodejs.org/dist/v8.16.1/win-x64/node.exe
macOS 64-bit Installer: https://nodejs.org/dist/v8.16.1/node-v8.16.1.pkg
macOS 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-darwin-x64.tar.gz
Linux 32-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-linux-x86.tar.xz
Linux 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-linux-x64.tar.xz
Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-linux-ppc64le.tar.xz
Linux s390x 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-linux-s390x.tar.xz
AIX 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-aix-ppc64.tar.gz
SmartOS 32-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-sunos-x86.tar.xz
SmartOS 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-sunos-x64.tar.xz
ARMv6 32-bit Binary: Coming soon
ARMv7 32-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-linux-armv7l.tar.xz
ARMv8 64-bit Binary: https://nodejs.org/dist/v8.16.1/node-v8.16.1-linux-arm64.tar.xz
Source Code: https://nodejs.org/dist/v8.16.1/node-v8.16.1.tar.gz
Other release files: https://nodejs.org/dist/v8.16.1/
Documentation: https://nodejs.org/docs/v8.16.1/api/
SHASUMS
1 | -----BEGIN PGP SIGNED MESSAGE----- |