피드로 돌아가기
OpenSSL and Breaking UTF-8 Change (fixed in Node v0.8.27 and v0.10.29)
Node.js BlogNode.js Blog
Security

Node.js가 OpenSSL 취약점(CVE-2014-0224)을 패치하고 UTF-8 인코딩 변경으로 불일치한 서로게이트 쌍을 유니코드 대체 문자(U+FFFD)로 치환

OpenSSL and Breaking UTF-8 Change (fixed in Node v0.8.27 and v0.10.29)

2014년 6월 16일7intermediate

Context

Node.js의 V8 엔진이 JavaScript 문자열을 UTF-8로 인코딩할 때 불일치한 서로게이트 쌍(unmatched surrogate pairs)을 허용하여 유효하지 않은 UTF-8 문자열이 생성되었다. RFC 준수 WebSocket 구현에서 유효하지 않은 텍스트 페이로드를 수신하면 클라이언트 연결이 끊어져야 하는데, 이를 처리하는 로직이 없으면 재연결 시도로 인한 서비스 거부 공격(DoS)이 발생할 수 있다.

Technical Solution

  • OpenSSL 번들 버전 업그레이드: 0.8 브랜치에서 v1.0.0m으로, 0.10 브랜치에서 v1.0.1h으로 변경하여 CVE-2014-0224 취약점 해결
  • 서로게이트 쌍 검증 추가: 문자열에 불일치한 서로게이트 쌍이 포함되면 유니코드 미지정 문자(U+FFFD)로 자동 치환
  • 하위 호환성 옵션 제공: NODE_INVALID_UTF8 환경 변수 설정 시 기존 동작으로 복구 가능
  • 인코딩 방식 지정 권장: 이진 데이터의 경우 .write(str, 'binary') 형태로 명시적으로 인코딩 방식 지정
  • JavaScript 수준의 완화: node-unicode-sanitize 라이브러리를 사용한 사전 문자열 정제

Key Takeaway

문자 인코딩 처리에서 불일치한 서로게이트 쌍을 명시적으로 검증하고 안전한 대체 문자로 처리하는 것이 WebSocket 같은 프로토콜에서 보안 취약점을 방지하는 데 필수적이다.


Node.js를 사용하는 WebSocket 애플리케이션에서 UTF-8 인코딩된 문자열을 write() 메서드로 전송할 때, 불일치한 서로게이트 쌍 때문에 클라이언트 재연결 루프에 빠질 수 있으므로, 버전

0.

8.27 이상 또는

0.

1

0.29 이상으로 업그레이드하거나 사전에 node-unicode-sanitize로 문자열을 검증해야 한다.

원문 읽기