2016년 9월, 모든 활성 릴리스 라인의 보안 업데이트

Node.js 프로젝트는 진행 중인 모든 릴리스 라인의 몇 가지 보안상 결함을 패치하기 위한 업데이트를 계획했습니다. 이 결함은 Node.js의 특정 이슈뿐만 아니라 OpenSSL 프로젝트로부터 발표된 것도 포함됩니다. 이 업데이트는 치명적이진 않지만, 릴리스가 출시되는 대로 모든 Node.js를 업그레이드 하시길 권장합니다.

릴리스는 UTC 기준 2016년 9월 27일 화요일(미국 정오) 저녁이나 그 직후에 출시될 예정입니다.

이 릴리스에 포함되는 일부 패치는 Node.js의 호환성이 깨지는 API 변화로 주 버전을 올려야 합니다. 하지만, 저희 보안 절차에 따라, 이 변경사항은 부 버전 (x.y.zy)을 올리며, v0.10과 v0.12 릴리스는 수 버전을 올려 배포할 것입니다.

릴리스가 예상되는 버전 넘버는 다음과 같습니다.

  • Node.js v6.7.0(현재 버전)
  • Node.js v4.6.0(LTS “Argon”)
  • Node.js v0.12.16(유지보수 버전)
  • Node.js v0.10.46(유지보수 버전)

추가 사항:

  • LTS 스케줄에 따라, Node.js v0.10 버전을 위한 지원은 10월에 중단됩니다. 그러므로, 이 업데이트는 Node.js v0.10 버전의 마지막 릴리스가 될 것입니다. 아직 프로덕션에서 v0.10 버전을 사용 중이라면, 가능한 빨리 v4(LTS “Argon”)나 v6(10월에 발표될 LTS)로 변경하시길 바랍니다.
  • 보안 릴리스 절차에 따라, 이 업데이트 중 LTS 버전과 유지보수 버전(v4, v0.12, v0.10)에 적용되는 사항은 보안과 관련되거나 사용자에게 최대한의 안정성을 제공하기 위한 중대한 수정 사항만으로 제한할 것입니다.

Node.js 특정 보안 결함

이번 릴리스에는 최근의 OpenSSL 릴리스와는 관련이 없는 수정사항을 포함합니다. 다음 사항이 포함됩니다.

  • 모든 Node.js 버전에 영향을 주는 TLS 인증서의 프로세스에 관련된 높은 심각성의 결함
  • 모든 Node.js 버전에 영향을 주는 낮은 심각성의 Windows 네이티브 코드(원시 코드) 주입
  • 모든 Node.js 버전에 영향을 주는 낮은 심각성의 HTTP 검증 오류

개선된 취약성에 관한 전면 발표는 모든 릴리스가 다운로드 가능해지면 제공될 예정입니다.

9월 OpenSSL 릴리스

OpenSSL 프로젝트는 Node.js v4 버전과 그 위의 버전에 포함된 1.0.2i 버전과 Node.js v0.10 버전과 v0.12 버전에 보함된 1.0.1u 버전의 전반적인 유효성을 발표했습니다. 저희 암호화 팀(Shigeki Ohtsu, Fedor Indutny, Ben Noordhuis)은 Node.js에 줄 영향을 알아내기 위해 OpenSSL 릴리스에서 제기된 결함 분석을 진행하고 있습니다. 분석 결과는 아래를 참고하십시오.

CVE-2016-6304: OCSP(온라인 인증서 상태 프로토콜) 상태 요청 연장으로 인한 무한 메모리 증가

악성 클라이언트가 서버 메모리를 소모시켜, 한 세션에 매우 많은 OCSP 상태 요청을 보내 DoS(서비스 거부 공격)를 유발합니다. 이 결함은 DoS 공격의 용이성과 TLS를 사용하는 Node.js 서버가 취약하여 높은 심각성으로 분류되었습니다. 분석 결과: Node.js의 모든 버전은 이 취약점에 영향을 받습니다.

CVE-2016-6305: 빈 기록에 걸려 있는 SSL_peek()

OpenSSL 1.1.0 SSL/TLS가 SSL_peek()로 요청을 보내는 동안 피어가 빈 기록을 보낼 때 걸려있습니다. Node.js는 아직 OpenSSL 1.1.0에 의존하고 있지 않으므로 이 결함에 영향을 받지 않습니다. 분석 결과: Node.js의 모든 버전은 이 취약점에 영향 받지 않습니다.

CVE-2016-2183: SWEET32 제어/완화

SWEET32는 64비트 사이즈의 블럭을 이용하는 오래된 블럭 사이퍼 알고리즘에 대한 새로운 공격입니다. 이를 완화하기 위해, OpenSSL은 DES 기반 사이퍼를 HIGH 그룹에서 MEDIUM그룹으로 옮겼습니다. Node.js는 기본 스위트에 MEDIUM그룹은 제외하고, HIGH 그룹은 포함하여, 영향을 받는 사이퍼는 기본 스위트를 사용하지 않는 이상 포함되지 않습니다. Node의 기본 TLS 사이퍼 스위트는 API 문서에서 확인하실 수 있습니다. 분석 결과: Node.js의 모든 버전은 이 취약점에 영향을 받습니다.

CVE-2016-6303: MDC2_Update()에서 OOB 쓰기 오류

특정 상황에 MDC2_Update()에서 OOB(대역 외) 에러를 초래하는 오버플로가 발생할 수 있습니다. 이 공격은 OOB 에러를 일으키기 위해 필요한 데이터의 사이즈 때문에 대부분의 플랫폼에서는 적용되지 않습니다. Node.js는 이 결함에 영향을 받지만 이 에러를 이용하는 것의 비현실적인 부분과 MDC-2의 매우 낮은 이용 실태로, Node.js 이용자에게 매우 낮은 심각성으로 간주됩니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향을 받습니다.

CVE-2016-6302: 잘못된 SHA512 티켓 DoS 공격

서버가 TLS 세션 티켓 HMAC에 SHA512를 이용한다면, 잘못된 티켓을 받아 충돌하여 DoS(서비스 거부) 공격에 취약할 수 있습니다. Node.js는 세션 티켓에 SHA512를 사용하지 않으므로 이 결함에 영향을 받지 않습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-2182: BN_bn2dec()에서 OOB 쓰기 오류

애플리케이션이 매우 큰 BIGNUM과 함께 BN_bn2dec() 함수를 사용했을 때 OOB(대역 외) 에러가 발생할 수 있습니다. TLS는 기록의 한도가 구문 분석되기 전 크기가 큰 인증서를 거부를 하므로 영향을 받지 않습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-2180: TS_OBJ_print_bio()에서 OOB 읽기 오류

OOB(대역 외) 읽기 오류가 TS_OBJ_print_bio() 함수를 통해 큰 개체 ID(OID)가 존재할 때 발생할 수 있습니다. Node.js는 OpenSSL의 타임스탬프 권한(Time Stamp Authority)을 사용하지 않으므로 이 결함에 영향 받지 않는 것으로 보입니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-2177: 포인터 산술의 정의되지 않은 행동

이 프로그래밍 결함은 포스트 https://www.openssl.org/blog/blog/2016/06/27/undefined-pointer-arithmetic/에 설명되어 있습니다. Node.js 사용자가 이 결함에 직접적인 영향을 받기 어려울 것으로 보입니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-2178: DSA 서명에 시간 플레그 상수가 보전되지 않음

OpenSSL DSA 구현에 결함은 특정 작업에 따르는 비상수 시간 코드 경로를 의미합니다. 이 결함은 공격자가 개인 DSA 키를 복구하기 충분할 캐시 타이밍 공격을 통해 증명할 수 있습니다. DSA는 매우 드물게 이용되기 때문에 이 공격을 이용하기에 어려움이 있으므로 이 결함은 Node.js 사용자게 매우 낮은 심각성입니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향을 받습니다.

CVE-2016-2179: DTLS 버퍼 메시지 DoS

DTLS 연결 중에 핸드쉐이크(handshake) 메시지가 비정상적으로 전달이 될 경우, OpenSSL이 아직 프로세스할 준비가 안 된 메시지들은 나중에 쓰기 위해 버퍼됩니다. 이는 메모리를 소진해 DoS(서비스 거부 공격)를 초래하도록 이용될 수 있습니다. Node.js는 DTLS를 지원하지 않으므로, 사용자들은 이 결함에 영향을 받지 않습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-2179: DTLS 재생방지(Replay Protection) DoS

DTLS 재생 공격 방지 장치에 있는 이 결함은 공격자가 서버가 DTLS 연결에 평범한 패킷을 떨어트리도록 만들 수 있도록 할 수 있으며, 결과적으로 연결에 DoS를 초래할 수 있습니다. Node.js는 DTLS를 지원하지 않으므로, 이용자는 이 결함에는 영향을 받지 않습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-6306: 인증서 메시지 OOB 읽기 오류

사라진 메시지 길이를 확인할 때 할당된 버퍼보다 최대 2바이트 정도의 OOB(대역 외) 읽기 오류가 생길 수 있습니다. 이론적인 DoS 위험이 있습니다. 이는 클라이언트와 서버 중 클라이언트 인증을 사용하는 쪽에만 영향을 줍니다. Node.js는 이 낮은 심각성의 결함에 영향 받습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받습니다.

CVE-2016-6307: tls_get_message_header()의 과대 메모리 할당

OpenSSL 1.1.0 버전의 과대 메모리 할당은 TLS 헤더의 길이를 조작하여 만들 수 있습니다. Node.js는 OpenSSL 1.1.0 버전에 아직 의존하지 않아 이 결함에 영향을 받지 않습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

CVE-2016-6308: dtls1_preprocess_fragment()의 과대 메모리 할당

이 결함은 CVE-2016-6307의 결함과 비슷하지만 DTLS에 영향을 줍니다. Node.js는 OpenSSL 1.1.0 버전에 아직 의존하지 않고, DTLS를 도입하지 않아, 이 결함에 영향을 받지 않습니다. 분석 결과: 모든 버전의 Node.js는 이 취약점에 영향 받지 않습니다.

연락처와 차기 업데이트

정보 갱신을 위해 nodejs-sec 구글 그룹(https://groups.google.com/forum/#!forum/nodejs-sec)과 릴리스 발표를 위한 Node.js 웹사이트(https://nodejs.org/en/blog/)를 확인 해주세요.

현재 버전의 Node.js 보안 정책은 https://nodejs.org/en/security/에서 보실 수 있습니다.

Node.js의 취약점을 제보하고 싶다면 security@nodejs.org로 연락해주세요.

보안 취약점, Node.js 보안 관련 릴리스, nodejs GitHub 조직내의 유지보수 되고 있는 프로젝트의 최신 상태를 위해 적은 양으로 통지만 하는 nodejs-sec 메일링 리스트 https://groups.google.com/forum/#!forum/nodejs-sec를 구독해 주세요.