2주 전, HTTP 관련 취약성을 수정하고 번들 버전의 OpenSSL을 업그레이드 하기 위한 모든 상용 릴리스 라인(v0.10, v0.12, v4, v5)의 업데이트 계획을 발표했습니다.
OpenSSL 업데이트 릴리스에 대해 Node.js 사용자가 받는 영향을 정리해 올린 적 있습니다. 이번 업데이트는 Node.js 사용자에게 영향을 주는 한 가지 작은 변화도 포함하고 있습니다.
발표된 취약점과 OpenSSL을 업데이트하는 수정사항을 담은 Node.js v0.10.42(유지보수 버전), v0.12.10(LTS), v4.3.0 “Argon”(LTS), v5.6.0(안정 버전)을 오늘 릴리스 했습니다.
내부 보안 수정사항 때문에 LTS “Argon” 배포 라인은 v4.2.x에서 v4.3.x으로 이동되었다는 점은 기억해 두시기 바랍니다. v4.2.x의 업데이트는 더 이상 이루어지지 않습니다. 가능하면 v4.3.0으로 업그레이드 하시기 바랍니다.
사용 중인 Node.js 버전의 수정된 취약점이 주는 영향도와 환경을 업그레이드해야 하는 긴급성을 알리기 위해 아래에 자세한 내용을 정리했습니다.
CVE-2016-2086 Response Smuggling 취약점
Régis Leroy는 특정 조건에서 Response Smuggling 공격이 가능한 Node.js의 취약점에 대해 언급하였습니다. 이 취약점을 해결하기 위해, 요청과 응답의 Node.js HTTP 헤더 파싱 기법은 Content-Length를 다루는 형식적인 HTTP 사양에 더 가까워졌습니다.
이 취약성의 영향은 애플리케이션과 네트워크에 따라 다르지만 Node.js가 공격에 취약한지 파악하기가 더 어려워 졌습니다. 따라서 업그레이드 하시길 권장합니다.
- Node.js 0.10.x 버전은 취약합니다. v0.10.42(유지보수 버전)로 업그레이드하세요.
- Node.js 0.12.x 버전은 취약합니다. v0.12.10(LTS)으로 업그레이드하세요.
- LTS Argon을 포함한 Node.js 4.x 버전은 취약합니다. v4.3.0 “Argon”(LTS)으로 업그레이드하세요.
- Node.js 5.x 버전은 취약합니다. v5.6.0(안정 버전)으로 업그레이드하세요.
CVE-2016-2216 Response Splitting 취약점
Node.js HTTP 헤더 파싱은 response splitting 공격(new-line / CRLF injection)을 받을 수 있다고 Сковорода Никита Андреевич(Nikita Skovoroda / @ChALkeR)와 Amit Klein(Safebreach 소속)이 각각 알렸습니다. Node.js가 CRLF 문자를 검사하여 response splitting 공격을 방어하고 있는 동안, 이전 검사를 우회하며 이 문자를 분해하여 유니코드 문자로 response 헤더를 구성하는 것이 가능합니다.
이 취약점을 해결하기 위해, 형식적인 HTTP 사양을 만족하는 요청과 응답에 대한 Node.js의 HTTP 헤더 파싱 기법은 종료되었습니다. 토큰을 위한 유효한 세트의 문자 이외의 것을 포함하는 HTTP 헤더는 거부될 것입니다. 위 검사는 Node.js의 서버와 클라이언트를 위한 요청과 응답에 적용됩니다.
Node.js의 클라이언트와 서버를 위한 느슨한 HTTP 헤더 파싱에 의존하는 Node.js 애플리케이션이 존재할 수도 있습니다. 그래서 위 변화는 semver-major 버전을 증가시켜야 하는 중대한 변화입니다. 그러나 LTS 정책에 따라, 이 변화를 Node.js의 v4(v4.2.x에서 v4.3.x으로), v5 버전의 semver-minor로서, v0.10과 v0.12 버전의 semver-patch로서 소개합니다.
v5.6.0 버전은 제외하고 v0.10.42, v0.12.10, v4.3.0 버전의 Node.js LTS 배포 또한 새로운 구조의 헤더 파싱을 벗어나기 위해 사용되는 새로운 명령행 인수를 포함합니다. Node.js가 시작할 때 --security-revert=CVE-2016-2216 옵션을 제공함으로써 관대한 HTTP 헤더 문자 체크가 대신 사용될 것입니다. 이 옵션을 사용하는 것은 추천하지 않으며, 새로운 행동으로의 회기 결과가 완전히 이해될 때에만 임시 통합 툴로써 사용하길 권합니다.
모든 사용자는 수정본 버전으로 업그레이드하기를 권합니다.
- Node.js 0.10.x 버전은 취약합니다. v0.10.42(유지보수 버전)로 업그레이드하세요.
- Node.js 0.12.x 버전은 취약합니다. v0.12.10(LTS)으로 업그레이드하세요.
- LTS Argon을 포함한 Node.js 4.x 버전은 취약합니다. v4.3.0 “Argon”(LTS)으로 업그레이드하세요.
- Node.js 5.x 버전은 취약합니다. v5.6.0(안정 버전)으로 업그레이드하세요.
OpenSSL 업그레이드 정리
Node.js v0.10.42와 v0.12.10 버전에서는 1.0.1q에서 1.0.1r으로 OpenSSL의 번들 버전을 업그레이드 합니다. 자세한 사항은 OpenSSL 1.0.1 변경사항에서 확인할 수 있습니다.
Node.js v4.3.0과 v5.6.0 버전에서는 1.0.2e에서 1.0.2f로 OpenSSL의 번들 버전을 업그레이드 합니다. 자세한 사항은 OpenSSL 1.0.2 변경사항에서 확인할 수 있습니다.
우리의 영향 평가에 따라, 배포 사항은 아래와 같습니다.
DH small 하위 그룹 (CVE-2016-0701)
v0.10과 v0.12 버전의 Node.js는 이 취약성에 영향을 받지 않습니다.
v4와 v5 버전의 Node.js는 SSL_OP_SINGLE_DH_USE 옵션을 이미 사용하기 때문에 이 취약성에 영향을 받지 않습니다.
SSLv2가 비활성화된 암호를 막지 않음 (CVE-2015-3197)
기본적으로 v0.10과 v0.12 버전의 Node.js에서는 SSLv2를 사용하지 않고, --enable-ssl2 명령행 인수가 사용되지 않는 한 영향을 받지 않습니다. (추전하지 않습니다)
Node.js v4 버전과 v5 버전은 SSLv2를 지원하지 않습니다.
DHE man-in-the-middle 보호 업데이트(Logjam)
이전 버전의 OpenSSL에서는(Node.js v0.10.39, v0.12.5, v4.0.0, v5.0.0 버전 이상) 디피-헬만 파라미터가 768 비트보다 짧으면 서버에서 접속을 거부하여 TLS 클라이언트의 로그잼 문제를 방지했습니다.
모든 Nodes.js 라인에 적용된 OpenSSL 새 버전에서는 이 값을 1024 비트로 증가시켰습니다. 이번 변경 사항은 길이가 짧은 DH 파라미터를 사용해 서버에 접속하는 TLS 클라이언트에만 영향이 있습니다.
새 버전 릴리스가 공지되는 nodejs-sec(https://groups.google.com/forum/#!forum/nodejs-sec) 게시물에 많은 관심 부탁드립니다. nodejs.org 블로그에서 보안 관련 글만 포함하는 Atom feed도 사용할 수 있습니다.