2018년 3월 보안 릴리스

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

요약

모든 활성 Node.js 릴리스 라인의 수정 버전을 이제 사용할 수 있습니다. 이번 버전에서는
최초 공지(하단 참고)에서 취약점으로 분류한 부분을 수정했습니다.

이전 최초 공지에서 언급한 취약점 외에도 Node.js 인스펙터 기능의 취약점도 수정했습니다.
자세한 내용을 아래에서 설명합니다.

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

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

OpenSSL 1.0.2o

OpenSSL 1.0.2o 버전이 이번 주에 릴리스 되었습니다. 이 버전에서는 서비스 거부(DoS) 공격을 할 수 있는
주로 PKCS#7과 관련된 결함
수정되었습니다.(CVE-2018-0739) Node.js가 현재 PKCS#7을 지원하지 않고 이 결함이 SSL/TLS 기능에는
영향을 주지 않으므로 crypto 팀은 이 결함이 Node.js 사용자에게 영향을 주지 않는다고 생각합니다.

OpenSSL 프로젝트의 코드 정리 작업으로 OpenSSL 1.0.2o에는 일부 코드 변경도 포함되어 있습니다.
보안 영향과 관계없이 모든 Node.js 릴리스 라인에 이번 릴리스를 포함했습니다.

Node.js 인스펙터 DNS 재 바인딩 취약점(CVE-2018-7160)

Node.js 6.x부터는 "inspector"라고 알려진
디버거 프로토콜이 포함되어 있고
--inspect나 관련 명령행 플래그로 활성화할 수 있습니다. 이 디버거 서비스가 원격 코드 실행에
이용할 수 있는 DNS 재 바인딩 공격
취약했습니다.

Node.js 프로세스를 실행하는 컴퓨터와 같은 컴퓨터에서 웹 브라우저로 악의적인 웹사이트를 열거나
다른 컴퓨터에서 Node.js가 실행 중인 컴퓨터에 네트워크로 접근할 때 공격이 발생할 수 있습니다.
악의적인 웹사이트가 DNS 재 바인딩 공격으로 웹 브라우저를 속여서 동일 출처 정책(same-origin-policy)
검사를 건너뛰고 localhost나 로컬 네트워크 호스트에 HTTP 연결을 할 수 있습니다. 디버그 포트를
열어놓은 Node.js 프로세스가 localhost나 로컬 네트워크의 한 호스트에서 실행되고 있는 경우
악의적인 웹사이트는 디버거로 프로세스에 접근할 수 있고 전체 코드 실행 권한을 갖게 됩니다.

인스펙터 구현체가 브라우저에서 제공하는 Host 헤더를 추가로 확인하도록 수정했습니다.
hostname 즉, DNS를 처리하는 주체를 통한 연결이라면 연결이 정확하게
localhostlocalhost6인지를 확인합니다.

이 해결책이 원격 디버깅 상황에 영향을 줄 수 있습니다. 예를 들어 더는 hostname을 사용해서 원격 컴퓨터를
디버깅할 수 없습니다. 이번의 추가적인 보안 검사를 우회하려면 IP 주소를 사용하거나 SSH 터널을 사용해서
접속해야 합니다. 따라서 이번 변경사항이 “하위 호환성을 깨뜨리는 변경사항이지만”,
Node.js 릴리스 계획에 따라
semver-major를 올리지 않고 semver-minor로 모든 영향받은 릴리스 라인에 보안 수정으로 포함했습니다.

Node.js 4.x에는 인스펙터 디버그 프로토콜이 없으므로 취약하지 않습니다.

원격 코드 실행의 위험 때문에 이번 취약점의 심각도는 높습니다(HIGH). 하지만 보통 디버거를
사용하는 환경(예: 개발환경)에만 영향을 줍니다.

Timo Schmid가 이 취약점을 보고했습니다.

'path' 모듈의 정규 표현식 서비스 거부(CVE-2018-7158)

Node.js 4.x 릴리스 라인의 'path' 모듈에는 잠재적인 정규표현식
서비스 거부(ReDoS) 지점이 포함되어 있습니다.
이 코드는 Node.js 6.x부터 교체되었으므로 이번 취약점은 모든 Node.js 4.x 버전에만 영향을 줍니다.

path.dirname(), path.extname(), path.parse() 등 다양한 경로 파싱 함수가
'path' 모듈 내에서 사용하는 정규표현식 splitPathRe는 공격자가 문자열을 조작해서 이러한 함수 중
하나에 전달했을 때 이를 평가하는데 상당한 시간이 걸려서 전체 서비스거부가 발생할 수 있도록 작성되었습니다.

Node.js 사용자에게 이번 취약점의 보안 위험도는 높다고(HIGH) 판단했으며 최대한 빨리 Node.js 4.x를
업그레이드하기를 권장합니다.

이번 취약점은 Virginia Tech의 James Davis가 보고했습니다.

HTTP Content-Length 헤더 값의 공백을 무시합니다.(CVE-2018-7159)

현재 Node.js 모든 버전의 HTTP 파서는 Content-Length 헤더에서 공백을 무시하므로
Content-Length: 1 2같은 값을 12 값으로 해석합니다. HTTP 명세는 Content-Length 값에
공백을 허용하지 않으므로 Node.js HTTP 파서가 여기에 맞추도록 했습니다.

Node.js 사용자가 이번 결함으로 가지는 보안 위험도는 아주 낮은 것으로 판단했습니다. 공격자가
Content-Length에 잘못된 값을 전달하는 것으로는 이번 결함을 이용하는 것은 몹시 어렵거나
불가능해 보입니다. 사용자가 작성한 코드에서 Content-Length 값이 실제 제공한 데이터의 길이와
일치하지 않을 때 취약점이 생길 수 있습니다. 저수준 HTTP 유틸리티를 만드는 Node.js 사용자는 파싱이
완료된 후 제공된 입력값의 길이를 다시 확인해 보는 것이 좋습니다.

숫자가 아닌 값을 거절했듯이 값에 공백이 있는 Content-Length를 거절하므로 이번 변경사항은
“하위 호환성을 깨뜨리는 변경사항입니다”. 하지만
Node.js 릴리스 계획에 따라
semver-major를 올리지 않고 semver-minor로 모든 영향받은 릴리스 라인에 보안 수정으로 포함했습니다.

이번 결함은 Сковорода Никита Андреевич(Nikita Skovoroda/@ChALkeR)가 보고했습니다.

루트 인증서 갱신

Node.js 바이너리에 포함된 루트 인증서도 갱신했습니다. 8개 인증서를 새로 추가하고 30개 인증서를
제거했습니다. 자세한 내용은 Node.js 공개 저장소
https://github.com/nodejs/node/pull/19322에서 볼 수 있습니다.

Node.js는 Mozilla의 NSS 루트 인증서 데이터베이스를
사용합니다. 이 데이터베이스에서 정기적으로 인증서를 추가하고 제거합니다. 가끔은 이번 업데이트에 제거된
WoSign / StartCom 인증서의 경우처럼
감시나 신뢰도 문제로 인증서를 철회하기도 합니다.

제거된 인증서가 필요해서 다시 추가하려면(권장하지 않지만)
NODE_EXTRA_CA_CERTS
환경 변수를 사용할 수 있습니다. 추가로 신뢰하는 인증서 목록을 변경해서 TLS나 HTTPS 서버를
생성하려면 ca 옵션을 사용할 수 있습니다.

이 변경사항은 Ben Noordhuis가 제출했습니다.

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


요약

Node.js 프로젝트는 지원 중인 모든 릴리스 라인의 새 버전을 2018년 3월 27일(UTC) 이후에 릴리스할 것입니다.
이번 릴리스에는 몇 가지 보안 수정사항이 포함되어 있고 업그레이드된 OpenSSL의 버전을 포함할 수도 있습니다.

포함 사항

OpenSSL 1.0.2o

OpenSSL 팀이 2018년 3월 27일에 OpenSSL 1.0.2o를 공개하겠다고
발표했습니다.
이번 릴리스에서 수정된 이슈 중 가장 높은 심각도는 중간 심각도(MODERATE)입니다.
OpenSSL 보안 정책에 따르면
이 등급은 다음과 같이 정의되어 있습니다.

중간 심각도는 클라이언트 애플리케이션이 예기치 않은 종료, 그리 널리 사용되지 않는 프로토콜(DTLS 등)의
결함, 국부 결함과 같은 문제를 포함합니다. 일반적으로 이러한 결함은 다음 릴리스까지 공개하지 않으며,
한 번에 여러 결함을 해결할 수 있을 때 릴리스 일정을 정합니다.

이 글은 이번 OpenSSL 릴리스에서 해결된 결함에 대해 Node.js 영향도 평가를 한 후 갱신될 것입니다.
하지만 심각도와 상관없이 Node.js의 모든 활성 릴리스 라인은 OpenSSL 1.0.2n에서 1.0.2o로
업그레이드할 가능성이 큽니다.

영향:

  • Node.js 4.x(LTS “Argon”)의 모든 버전은 영향을 받습니다.
  • Node.js 6.x(LTS “Boron”)의 모든 버전은 영향을 받습니다.
  • Node.js 8.x(LTS “Carbon”)의 모든 버전은 영향을 받습니다.
  • Node.js 9.x(현재 버전)의 모든 버전은 영향을 받습니다.

서비스 거부(DoS) 취약점

4.x의 모든 버전에는 외부 공격자가 서비스 거부(DoS)를 일으킬 수 있는 취약점이 있습니다.
이 취약점의 심각도는 높으므로(HIGH) 영향받는 버전의 사용자는 수정 버전이 릴리스 되면
업그레이드 계획을 세워야 합니다.

영향:

  • Node.js 4.x(LTS “Argon”)의 모든 버전은 취약합니다.
  • Node.js 6.x(LTS “Boron”)의 모든 버전은 취약하지 않습니다.
  • Node.js 8.x(LTS “Carbon”)의 모든 버전은 취약하지 않습니다.
  • Node.js 9.x(현재 버전)의 모든 버전은 취약하지 않습니다.

HTTP 파싱 결함

Node.js의 모든 버전에는 HTTP 파서가 잘못된 HTTP 요청을 잘못 해석할 수 있는 결함이 있습니다.
이 결함의 보안 영향도는 아주 작으므로 심각도는 아주 낮습니다(VERY LOW). 이는 사용성과 관련되어 있지만
잘 구성된 HTTP 서버를 공격하는데 이 결함을 실제로 사용할 수 있는 방법을 아직 찾지 못했습니다.

영향:

  • Node.js 4.x(LTS “Argon”)의 모든 버전은 취약합니다.
  • Node.js 6.x(LTS “Boron”)의 모든 버전은 취약합니다.
  • Node.js 8.x(LTS “Carbon”)의 모든 버전은 취약합니다.
  • Node.js 9.x(현재 버전)의 모든 버전은 취약합니다.

루트 인증서 갱신

모든 릴리스는 Node.js 바이너리에 포함된 루트 인증서도 갱신할 것입니다. 5개의 새로운 인증서를 추가하고
30개의 인증서를 제거합니다. 자세한 내용은 Node.js 공개 저장소
https://github.com/nodejs/node/pull/19322에서 볼 수 있습니다.

제거된 인증서가 필요해서 다시 추가하려면(권장하지 않지만)
NODE_EXTRA_CA_CERTS
환경 변수를 사용할 수 있습니다. 추가로 신뢰하는 인증서 목록을 변경해서 TLS나 HTTPS 서버를 생성하려면
ca 옵션을 사용할 수 있습니다.

Node.js 4.x(LTS “Argon”)와 관련된 내용

Node.js 릴리스 일정에 따라
Node.js 4.x(LTS “Argon”) 지원을 4월 30일에 중단할 것입니다. 이 릴리스 라인이
"유지보수 버전"으로 최소한의 수정사항만 받으므로 Node.js 4.x의 다음 릴리스가
이 릴리스 라인의 최종 버전이 될 것입니다.

아직 Node.js 4.x에서 상위 릴리스 라인으로 마이그레이션하지 않았다면 빠른 시기에 마이그레이션 하기
바랍니다. Node.js는 Node.js 6.x(LTS “Boron”)나 Node.js 8.x(LTS “Carbon”)를
도입하기를 권장합니다.

릴리스 시기

2018년 3월 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 조직에서 관리하고 있습니다.