🇰🇷 한글 설명
Node.js의 TLS 호스트명 검증에서 결함이 발견되었습니다. `0177.0.0.1`, `0x7f.0.0.1`, `2130706433`, `127.1`처럼 정규화되지 않은 IPv4 표기를 사용하면 IP 주소로 분류되지 않고 DNS SAN과 비교되어, IP SAN이 없는 DNS SAN 인증서가 잘못 허용될 수 있습니다. 이 취약점은 Node.js 26.x, 24.x, 22.x에 영향을 미칩니다.
💡 쉬운 설명
Node.js가 특정 방식으로 쓰인 IP 주소를 확인할 때 인증서 검증을 잘못 처리합니다. 이로 인해 공격자가 잘못된 인증서로 서버를 사칭할 가능성이 있습니다.
🇺🇸 원문 (English)
A flaw in Node.js TLS hostname verification allows a certificate with only a DNS SAN to authenticate an IP endpoint when the client connects using a non-canonical IPv4 spelling, such as `0177.0.0.1`, `0x7f.0.0.1`, `2130706433` or `127.1`.
`tls.checkServerIdentity()` did not classify these hosts as IP addresses, but normalized them to their canonical form and matched the result against the certificate DNS names. A certificate containing `DNS:127.0.0.1` and no `IP Address:127.0.0.1` SAN was therefore accepted, while the same certificate is correctly rejected for `127.0.0.1`. Exploitation requires a certificate with a numeric DNS SAN issued by a CA trusted by the client, and a platform resolver that accepts these spellings, such as glibc.
This vulnerability affects Node.js **26.x**, **24.x**, and **22.x**.
📍 영향받는 시스템
Node.js 22.x, 24.x, 26.x (glibc 등 해당 표기를 허용하는 리졸버 사용 환경)
⚔️ 공격 벡터
신뢰된 CA로부터 숫자형 DNS SAN 인증서를 확보한 뒤, 비정규 IPv4 표기로 연결을 유도해 중간자 공격으로 서버를 사칭
🛡️ 대응 방법
Node.js를 보안 패치가 적용된 최신 버전(22, 24, 26 계열의 수정 릴리스)으로 업데이트
🔧 검증 코드
출력된 버전이 22.x, 24.x, 26.x의 패치된 최신 릴리스보다 낮으면 취약하며, 보안 공지에 명시된 수정 버전 이상이면 조치가 완료된 것입니다.
node -p "process.versions.node"