OpenSSL 1.0.2g, 1.0.1s 업데이트

OpenSSL 프로젝트는 UTC 기준 3월 1일 화요일에 1.0.2g와 1.0.1s 버전을 릴리스할 것이라고 이번 주에 발표했습니다. 이번 릴리스는 OpenSSL의 보안 정책에서 “높은” 심각도로 평가된 “여러 가지 결함”을 수정할 것입니다. 여기서 “높은” 심각도는 다음을 의미합니다.

보편적이지 않은 설정에 영향을 거거나 이용 가능성이 크지 않기 때문에 낮은 위험성을 가지는 이슈

Node.js v0.10과 v0.12는 모두 OpenSSL v1.0.1을 사용하고 Node.js v4와 v5는 OpenSSL v1.0.2를 사용합니다. nodejs.org의 릴리스와 다른 곳의 인기 있는 배포판 소스에는 OpenSSL이 정적으로 컴파일되어 있으므로 모든 릴리스 라인이 이번 업데이트의 영향을 받습니다.

지금 단계에서는 엠바고 때문에 이 결함에 대한 자세한 내용이 확실하지 않고 Node.js 사용자에 어떤 영향을 주는지도 확실하지 않습니다.

이번 주나 다음 주, 각 릴리스 라인에 사소하고 보안과 관련 없는 릴리스가 이미 계획되어 있었으므로 OpenSSL 릴리스가 얼마나 Node.js 사용자에게 영향을 주냐에 따라 릴리스 일정을 조정할 것입니다.

그러므로 진행 계획은 다음과 같습니다.

OpenSSL 릴리스 이후 대략 24시간 이내에 crypto 팀이 이번 릴리스에 대한 Node.js 사용자의 영향도 평가를 할 것입니다. 이 내용은 각 릴리스 라인에 따라 다를 것이고 이 글에 올릴 것입니다.

이 영향도 평가에 일부로 영향도를 고려해서 각 릴리스 라인의 릴리스 일정을 발표할 것입니다. 3월 1일 화요일 직후 Node.js v0.10, v0.12, v4, v5의 중요한 업데이트가 있을 수 있으므로 준비하시기 바랍니다.

Node.js v0.10(유지보수 버전)

이번 주에 Node.js v0.10.43 릴리스가 예정되어 있습니다. 이 버전에는 domains의 수정사항과 v0.10.42에서 발생한 http_parser의 회귀에 대한 중요한 수정사항이 포함되어 있습니다. 이번 릴리스에 포함된 변경사항의 자세한 내용과 릴리스 후보(v0.10.43-rc.1)를 다운로드받아 사용하는 방법에 대한 안내는 https://github.com/nodejs/node/pull/5404에서 볼 수 있습니다. Node.js v0.10 사용자는 릴리스 후보가 현재 배포된 코드와 호환되는지 테스트해 보길 권합니다.

OpenSSL 1.0.1s 릴리스에 Node.js v0.10에 영향을 주는 중요한 수정사항이 있다면 v0.10.43 릴리스에 이 수정사항을 포함하도록 노력할 것입니다.

Node.js v0.12(LTS)

이번 주에 Node.js v0.12.11 릴리스가 예정되어 있습니다. 이 버전에는 domains의 수정사항과 v0.12.10에서 발생한 http_parser의 회귀에 대한 중요한 수정사항이 포함되어 있습니다. 이번 릴리스에 포함된 변경사항의 자세한 내용과 릴리스 후보(v0.12.11-rc.1)를 다운로드받아 사용하는 방법에 대한 안내는 https://github.com/nodejs/node/pull/5403에서 볼 수 있습니다. Node.js v0.12 사용자는 릴리스 후보가 현재 배포된 코드와 호환되는지 테스트해 보길 권합니다.

OpenSSL 1.0.1s 릴리스에 Node.js v0.12에 영향을 주는 중요한 수정사항이 있다면 v0.12.11 릴리스에 이 수정사항을 포함하도록 노력할 것입니다.

Node.js v4(LTS “Argon”)

Node.js v4의 중요한 업데이트가 다음 주 3월 8일에 예정되어 있습니다. https://github.com/nodejs/node/pull/5301에서 Node.js v4.4.0에 무슨 변경사항이 있는지 볼 수 있고 배포된 코드를 테스트할 수 있는 릴리스 후보를 볼 수 있습니다.

OpenSSL 1.0.2g 업데이트에 Node.js v4에 영향을 주는 중요한 수정사항이 있다면 Node.js v4 사용자의 위험을 줄이기 위해 보안 업데이트만을 포함하여 이번 주에 v4.3.2를 릴리스할 수도 있습니다.

OpenSSL 1.0.2g 업데이트에 Node.js v4에 영향을 주는 중요한 수정사항이 없다면 계획했던 대로 v4.4.0 릴리스를 진행하면서 OpenSSL 1.0.2g 업그레이드도 시도할 것입니다. Node.js v4 사용자는 원하는 때에 v4.4.0 업그레이드를 할 수 있으므로 변경사항에 대해 충분히 테스트할 수 있습니다.

Node.js v5(안정 버전)

이번 주에 Node.js v5의 정기 업데이트가 예정되어 있습니다. https://github.com/nodejs/node/pull/5464에서 Node.js v5.7.1에 어떤 내용이 포함되는지 볼 수 있습니다. 이번 버전에 몇 가지 회귀에 대한 변경사항이 있음에도 이번 버전에서 semver-minor 변경사항은 제외했습니다.

OpenSSL 1.0.2g 릴리스에 Node.js v5에 영향을 주는 중요한 변경사항이 있다면 v5.7.1 릴리스가 해당 업데이트를 포함하도록 할 것입니다.

요약

  • OpenSSL 업데이트 이후 24시간 이내에 영향도 평가가 나올 것입니다.
  • 이번 주에 Node.js v0.10, v0.12, v5가 릴리스 될 것이고 여기에 중요한 보안 릴리스가 포함될 수 있습니다.
  • Node.js v4.4.0 릴리스는 다음 주에 이뤄질 것이고 이번 주에 v4.3.2 보안 업데이트가 이뤄질 가능성이 있습니다.

OpenSSL 릴리스 이후 대략 24시간 이내에 영향도 평가와 릴리스 시기에 대한 새로운 내용을 nodejs-sec 구글 그룹에 올릴 것이므로 주시하기 바랍니다. https://groups.google.com/forum/#!forum/nodejs-sec

연락처와 차기 업데이트

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

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

보안 취약점과 보안과 관련된 릴리스에 대한 최신 정보를 받고 싶다면 https://groups.google.com/forum/#!forum/nodejs-sec에서 약간의 공지만 올라오는 nodejs-sec 메일링 리스트를 구독하기 바랍니다. 프로젝트는 nodejs GitHub 조직에서 관리되고 있습니다.

(2016년 3월 2일 갱신됨) OpenSSL 영향 평가

crypto 팀(Ben Noordhuis, Shigeki Ohtsu, Fedor Indutny)에서 이번 주의 OpenSSL 릴리스 1.0.2g1.0.1s에서 해결한 결함을 분석했습니다. 이 분석 결과는 아래에 나와 있습니다.

Node.js 사용자에 대한 전체적인 영향은 낮지만 확실한 보안을 위해 OpenSSL의 새로운 버전을 포함해서 모든 릴리스 라인의 새 버전을 이번 주에 만들 것입니다.

  • v0.10.43(유지보수 버전)은 계획대로 이번 주에 진행됩니다. 이 버전에는 domains의 수정사항과 v0.10.42에서 발생한 http_parser의 회귀에 대한 중요한 수정사항이 포함되어 있고 OpenSSL을 1.0.1s로 업그레이드했습니다. 중요한 변경사항으로는 SSLv2 지원을 완전히 제거한 것입니다. 아래 CVE-2016-0800를 참고하세요.
  • v0.12.11(LTS)는 계획대로 이번 주에 진행됩니다. 이 버전에는 domains의 수정사항과 v0.12.10에서 발생한 http_parser의 회귀에 대한 중요한 수정사항과 몇 가지 사소한 수정사항이 포함되어 있습니다. OpenSSL도 1.0.1s로 업그레이드했습니다. 중요한 변경사항으로는 SSLv2 지원을 완전히 제거한 것입니다. 아래 CVE-2016-0800를 참고하세요.
  • v4.4.0(LTS Argon)은 계획대로 다음 주에 진행될 것이고 OpenSSL을 1.0.2g로 업그레이드 했습니다. v4.4.0의 보안과 관련 없는 수정사항을 적용하지 않고 새로운 OpenSSL을 사용하고자 하는 사용자가 보수적으로 업그레이드할 수 있도록 OpenSSL만 업그레이드한 v4.3.2를 이번 주에 릴리스할 것입니다.
  • v5.7.1(안정 버전)은 계획대로 이번 주에 진행할 것이고 v5.7.0에서 발생한 다수의 회귀에 대한 수정사항을 포함하고 있고 OpenSSL도 1.0.2g로 업그레이드 했습니다.

각 버전의 릴리스 공지는 Node.js 블로그에 있습니다.

CVE-2016-0800: SSLv2 기본 빌드, 기본 협상, 약한 암호화 비활성화

평가:

  • Node.js v0.10과 v0.12는 --enable-ssl2로 SSLv2를 수동으로 활성화하지 않는 한 영향을 받지 않습니다.
  • Node.js v4와 v5는 영향을 받지 않습니다.

이 취약점은 DROWN 공격으로 표시되었고 SSLv2를 지원하는 서버에만 영향을 줍니다.

현대 서버와 클라이언트는 TLS 암호화 프로토콜을 사용하지만 잘못된 설정으로 인해 많은 서버가 아직도 1990년대의 TLS 전신인 SSLv2를 지원합니다. 최신 클라이언트 중 실제로 SSLv2를 사용하는 클라이언트가 없기 때문에 이 지원이 실제로는 중요하지 않았습니다. 그래서 SSLv2가 매우 불안전하다고 알려졌음에도 클라이언트가 SSLv2를 사용하지 않으므로 지금까지 단순한 SSLv2 지원을 보안 문제로 간주하지 않았습니다.

DROWN은 단순한 SSLv2 지원도 현대 서버와 클라이언트에 위협이 됨을 보여줍니다. 이는 공격자가 SSLv2를 지원하고 같은 비밀키를 사용하는 서버에 프로브를 보냄으로써 최신 클라이언트와 서버 간의 현대적인 TLS 연결을 복호화할 수 있습니다.

HTTPS 소켓에 SSLv2를 지원하는 것만으로도 클라이언트가 SSLv2를 실제 사용하냐와 관계없이 이 취약점을 활성화하게 되므로 이는 중요합니다.

Node.js v0.10.29부터 SSLv2와 SSLv3는 기본적으로 비활성화되었습니다. 이는 node--enable-ssl2--enable-ssl3 명령행 인수를 전달함으로써 활성화할 수 있습니다. 이 프로토콜이 안전하지 않다는 것은 꾸준히 입증되었으므로 SSLv2와 SSLv3를 비활성화한 상태로 두는 것을 강력히 권장합니다.

node--enable-ssl2 명령행 인를 사용하고 있다면 HTTPS 서버는 이 공격에 취약합니다. 민감한 데이터의 복호화 가능성을 피하려면 이 인를 사용하기를 그만두어야 합니다.

SSLv2 지원이 제거되었습니다

OpenSSL 1.0.1s에서 SSLv2 지원 장벽을 추가한 점과 수많은 SSLv2 취약점을 고려하여 Node.js v0.10.43과 v0.12.11은 SSLv2 지원과 --enable-ssl2 명령행 인수를 완전히 제거할 것입니다.

CVE-2016-0705: DSA 코드의 이중 해제(double-free) 문제 수정

평가: Node.js의 모든 버전은 낮은 심각도로 영향을 받습니다.

이 결함으로 잠재적인 DoS(Denial of Service) 벡터로 사용되거나 메모리 변조를 일으키도록 올바르지 않은 DSA를 사용할 수 있습니다. 하지만 실제 공격에 이 결함을 악용하기는 매우 어려워 보이므로 Node.js 사용자에게 주는 심각도는 낮은 것으로 판단됩니다.

CVE-2016-0798: 서버의 메모리 누수를 해결하려고 SRP 가짜 사용자 시드를 비활성화했습니다.

평가: Node.js의 모든 버전은 영향을 받지 않습니다.

OpenSSL의 보안 원격 암호(SRP, Secure Remote Password)는 Node.js로는 노출되지 않으므로 모든 버전이 이 결함의 영향을 받지 않습니다.

CVE-2016-0797: BN_hex2bn/BN_dec2bn 널 포인터 역참조/힙 변조

평가: Node.js의 모든 버전은 낮은 심각도로 영향을 받을 수 있습니다.

이 결함은 아주 드문 상황에서 메모리 변조를 일으킬 수 있습니다. 게다가 BN_hex2bn()BN_dec2bn() 함수는 Node.js에서는 명시적으로 사용되지 않지만 OpenSSL의 일부 API에서 내부적으로 사용됩니다. 이 단계에서 확신할 수는 없지만 Node.js는 이 함수를 사용하는 코드를 호출하지 않는다고 생각합니다.

이 결함을 활용하기가 어렵고 Node.js가 내부적으로 이 함수를 사용해야 하는 API를 사용하지 않을 가능성이 있으므로 이 결함은 Node.js 사용자에게는 심각도가 아주 낮은 것으로 간주합니다.

CVE-2016-0799: BIO_*printf 함수의 메모리 문제 수정

평가: Node.js의 모든 버전은 영향을 받지 않습니다.

이 결함은 잠재적인 DoS(Denial of Service) 벡터로 제공되거나 메모리 변조를 일으킬 수 있습니다. OpenSSL이 내부적으로 BIO_*printf() 함수를 사용하지만 Node.js에서 이러한 함수를 호출하는 유일한 API 호출 경로는 Node.js에서 변경할 수 없는 기본 인증서 크기 제한이 있으므로 이 결함을 이용할 가능성이 없습니다. 그래서 Node.js는 이 결함에 영향을 받지 않는다고 생각합니다.

CVE-2016-0702: 모듈러 지수 연산(exponentiation)에서의 부채널 공격을 수정했습니다.

평가: Node.js의 모든 버전은 낮은 심각도로 영향을 받습니다.

이 결함은 CacheBleed Attack이라고 부릅니다.

이 결함으로 공격자가 전제 RSA 비밀키를 복구할 가능성이 있는 부채널 공격을 실행할 수 있습니다. 이는 인텔 샌디 브리지(혹은 그 이전 버전) 마이크로아키텍처에서 하이퍼 스레딩(hyper-threading)을 사용할 때만 영향을 미칩니다. 하스웰을 비롯한 새로운 마이크로아키텍처에서는 영향이 없습니다. 하이퍼스레딩을 비활성화하는 것은 이 공격을 막는 선택사항 중 하나입니다.