2018년 11월 보안 릴리스

(2018년 11월 27일 수정됨) 보안 릴리스를 사용할 수 있습니다.

요약

모든 활성 Node.js 릴리스 라인의 수정 버전을 이제 사용할 수 있습니다. 이번 버전에서는 최초 공지(하단 참고)에서 취약점으로 분류한 부분을 수정했습니다. Node.js 6과 8에서는 OpenSSL 1.0.2q로, Node.js 10과 11에서는 OpenSSL 1.1.0j로 업그레이드했습니다.

모든 사용자가 아래 버전으로 최대한 빨리 업그레이드하기를 권장합니다.

다운로드와 릴리스 상세내용

다음 버전을 다운로드할 수 있습니다. 상세한 코드 변경내용도 각 릴리스 페이지에서 볼 수 있습니다.

노트 (2018년 12월 3일): 아래 정리한 수정사항을 잘못 백포트한 문제를 수정하려고 Node.js 6.15.1(LTS "Boron")을 릴리스했습니다. 자세한 내용은 릴리스 페이지를 참고하세요.

디버거가 기본적으로 모든 인터페이스에서 5858 포트로 수신(CVE-2018-12120)

분류: 보호되지 않은 주요 채널(CWE-419)

Node.js 6의 모든 버전은 취약하고 심각도는 높음입니다. node --debugnode debug로 디버거를 활성화하면 기본적으로 모든 인터페이스의 5858 포트로 수신하게 됩니다. 이를 통해 원격 컴퓨터가 디버그 포트에 붙어서 임의의 JavaScript를 실행할 수도 있습니다. 지금은 기본 인터페이스가 localhost입니다. 언제든 node --debug=localhost처럼 인터페이스를 지정하면서 디버거를 시작할 수 있습니다. Node.js 8에서 디버거는 제거되었고 인스펙터로 교체되었으므로 8 이상 버전은 취약하지 않습니다.

Ben Noordhuis가 보고하고 수정했습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약하지 않습니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약하지 않습니다
  • Node.js 11(현재 버전)의 모든 버전은 취약하지 않습니다

커다란 HTTP 헤더로 인한 서비스 거부(CVE-2018-12121)

분류: 제어되지 않은 리소스 소비 / 서비스 거부(CWE-400)

Node.js 6 이상의 모든 버전은 취약하고 심각도는 높음입니다. 최대 크기의 헤더(연결당 거의 80 KB)와 헤더를 처리하는데 시간이 걸리도록 조정해서 많은 요청을 보내면 힙 할당에 실패하면서 HTTP 서버가 중단될 수 있습니다. 로드 밸런서나 다른 프락시 계층을 사용하면 공격 가능성을 줄일 수 있습니다.

이제 Node.js가 받는 HTTP 헤더의 전체 크기는 8192 바이트가 넘지 않아야 합니다.

Trevor Norris가 보고했고 Matteo Collina가 수정했습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약합니다
  • Node.js 11(현재 버전)의 모든 버전은 취약합니다

"Slowloris" HTTP 서비스 거부(CVE-2018-12122)

분류: 제어되지 않은 리소스 소비 / 서비스 거부(CWE-400)

Node.js 6 이상의 모든 버전은 취약하고 심각도는 낮음입니다. 공격자가 HTTP나 HTTPS 연결을 유지한 채 아주 느리게 헤더를 보내면 장시간 연결된 리소스가 살아있으므로 서비스 거부(DoS)를 일으킬 수 있습니다. 로드 밸런서나 다른 프락시 계층을 사용하면 공격 가능성을 줄일 수 있습니다.

이제 서버가 HTTP 헤더를 받는 데 40초의 만료 시간이 적용됩니다. server.headersTimeout으로 이 값을 조정할 수 있습니다. 이 시간 내에 헤더를 완전히 받지 못했을 때는 다음 청크를 받았을 때 소켓이 소멸합니다. server.setTimeout()과 함께 사용하면 과도한 리소스 유지와 서비스 거부를 막는 데 도움이 됩니다.

Jan Maybach(liebdich.com)가 보고하고 Matteo Collina가 수정했습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약합니다
  • Node.js 11(현재 버전)의 모든 버전은 취약합니다

javascript 프로토콜에 대한 URL 파서의 호스트명 스누핑(CVE-2018-12123)

분류: 입력의 잘못된 해석(CWE-115)

Node.js 6 이상의 모든 버전은 취약하고 심각도는 낮음입니다. Node.js 애플리케이션이 URL 호스트명을 결정하려고 url.parse()을 사용할 때 대소문자가 섞인 "javascript:"(예: "javAscript:") 프로토콜을 사용하면(다른 프로토콜은 영향이 없습니다) 호스트명이 스누핑될 수 있습니다. 호스트명에 기반한 URL에 따라 보안을 다르게 하면 이는 잘못된 결정일 수 있습니다.

Martin Bajanik(Kentico)이 보고하고 Matteo Collina가 수정했습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약합니다
  • Node.js 11(Current)의 모든 버전은 취약합니다

HTTP 요청 분할(CVE-2018-12116)

분류: 입력의 잘못된 해석(CWE-115)

Node.js 6과 8은 취약하고 심각도는 중간입니다. Node.js에서 사용자가 제공한 유니코드 데이터가 처리되지 않은 채로 HTTP 요청의 path 옵션에 사용될 수 있다면, 사용자가 정의한 해당 데이터가 예상치 못한 두 번째 HTTP 요청을 같은 서버에 보내도록 할 수 있습니다.

Arkadiy Tetelman(Lob)이 Node.js 6과 8의 보안 이슈를 보고했고 Node.js 10 이상에 적용된 수정사항을 Benno Fünfstück가 백포트해서 수정했습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약하지 않습니다
  • Node.js 11(현재 버전)의 모든 버전은 취약하지 않습니다

ECDSA 서명 생성 시 OpenSSL 소요 시간 분석 취약성(CVE-2018-0735)

심각도: 낮음

OpenSSL ECDSA 서명 알고리즘이 부 채널 소요 시간 분석(Timing attack)에 취약한 것으로 밝혀졌습니다. 공격자가 서명 알고리즘의 소요 시간 차이를 이용해 개인 키를 복구할 수 있습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약하지 않습니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약하지 않습니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약합니다
  • Node.js 11(현재 버전)의 모든 버전은 취약합니다

DSA 서명 생성 시 OpenSSL 소요 시간 분석 취약성(CVE-2018-0734)

심각도: 낮음

OpenSSL DSA 서명 알고리즘이 부 채널 소요 시간 분석(Timing attack)에 취약한 것으로 밝혀졌습니다. 공격자가 서명 알고리즘의 소요 시간 차이를 이용해 개인 키를 복구할 수 있습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium")의 모든 버전은 취약합니다
  • Node.js 11(현재 버전)의 모든 버전은 취약합니다

ECC 스칼라 곱에서 OpenSSL의 마이크로아키텍처 소요 시간 분석 취약성(CVE-2018-5407)

심각도: 낮음

ECDSA와 ECDH 등에서 사용되는 OpenSSL ECC 스칼라 곱이 마이크로아키텍처 소요 시간 분석 부채널 공격(Timing attack)에 취약한 것으로 밝혀졌습니다. ECDSA 서명을 생성하는 동안 로컬 소요 시간 분석이 가능한 공격자가 개인 키를 복구할 수 있습니다.

영향:

  • Node.js 6(LTS "Boron")의 모든 버전은 취약합니다
  • Node.js 8(LTS "Carbon")의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium") 10.8.0 까지의 모든 버전은 취약합니다
  • Node.js 10(LTS "Dubnium") 10.9.0 이후 모든 버전은 취약하지 않습니다
  • Node.js 11(현재 버전)의 모든 버전은 취약하지 않습니다

감사의 글

Matteo Collina가 취약성을 고치는데 상당한 작업을 했습니다.

Sam Roberts는 OpenSSL을 업그레이드하고 코드에 기여했으며 이번 릴리스 준비를 도왔습니다.

Ben Noordhuis, Fedor Indutny, Benno Fünfstück가 코드에 기여했습니다.

Trevor Norris, Jan Maybach, Martin Bajanik, Arkadiy Tetelman이 적절한 채널(아래 참조)을 통해 취약성을 보고했습니다.

아래부터는 원래의 글입니다.

요약

Node.js 프로젝트는 지원 중인 모든 릴리스 라인의 새 버전을 2018년 11월 27일(UTC) 정도에 릴리스할 것입니다. 이번 릴리스에는 Node.js의 보안 수정사항을 포함할 것이고 오늘(2018년 11월 20일) 릴리스 된 OpenSSL 업데이트도 포함될 것입니다.

OpenSSL 1.0.2q1.1.0j에는 이전에 공개된 낮은 심각도의 소요 시간 분석 취약성에 대한 수정사항이 포함되어 있습니다. OpenSSL 릴리스 공지를 참고하세요.

영향

아래 취약성을 수정하기 위해 지원 중인 모든 릴리스 라인의 새 버전을 릴리스할 것입니다.

**Node.js 6(LTS "Boron")**의 모든 버전은 다음 사항에 취약합니다.

  • 2가지 제어되지 않은 리소스 소비 / 서비스 거부(CWE-400) 취약성
  • 2가지 입력의 잘못된 해석(CWE-115) 취약성
  • 1가지 보호되지 않은 주요 채널(CWE-419) 취약성

**Node.js 8(LTS "Carbon")**의 모든 버전은 다음 사항에 취약합니다.

  • 2가지 제어되지 않은 리소스 소비 / 서비스 거부(CWE-400) 취약성
  • 2가지 입력의 잘못된 해석(CWE-115) 취약성

**Node.js 10(LTS "Dubnium")**의 모든 버전은 다음 사항에 취약합니다.

  • 2가지 제어되지 않은 리소스 소비 / 서비스 거부(CWE-400) 취약성
  • 1가지 입력의 잘못된 해석(CWE-115) 취약성

**Node.js 11(현재 버전)**의 모든 버전은 다음 사항에 취약합니다.

  • 2가지 제어되지 않은 리소스 소비 / 서비스 거부(CWE-400) 취약성
  • 1가지 입력의 잘못된 해석(CWE-115) 취약성

릴리스 시기

2018년 11월 27일(UTC) 정도에 릴리스할 것이며 사용자가 영향도 평가를 할 수 있도록 각 릴리스에서 처리한 결함의 상세내용도 같이 공개할 것입니다.

연락처와 차후 업데이트

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

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

Node.js의 보안 취약점과 보안과 관련된 릴리스의 최신 정보를 얻으려면 https://groups.google.com/forum/#!forum/nodejs-sec에서 소수의 공지만 하는 nodejs-sec 메일링 리스트를 구독해 주세요. 이 프로젝트는 nodejs GitHub 조직에서 관리하고 있습니다.