문서
Node.js url.parse() 취약점 컨트리뷰션
표상영 · 토스 · 토스 기술 블로그
소개
토스 보안기술팀은 안전한 금융 서비스를 제공하기 위한 연구를 수행하고 있어요. 많은 서비스에서 사용되고 있는 Node.js의 취약점을 분석하고 안전하게 패치될 수 있도록 기여했던 과정을 소개드려요.
AI 핵심 요약
Node.js의 레거시 url.parse()가 WHATWG URL API와 다르게 hostname을 파싱해 도메인 검증을 우회할 수 있는 Hostname Spoofing 취약점이 발견됐습니다. 예를 들어 검증에는 WHATWG 파서를, 실제 요청에는 url.parse()를 사용하는 경우 파싱 결과가 달라져 임의 도메인으로 요청하는 SSRF가 발생할 수 있습니다. 작성자는 Node.js에 취약점을 제보하고 패치 논의에 참여해, 허용 문자 화이트리스트를 Reserved Characters 차단 방식으로 바꾸고 url.parse()를 Deprecated 처리하도록 기여했습니다. 수정 사항은 v19.1.0과 v18.13.0에 반영됐으며, URL 검증에서는 실제 요청에 사용되는 파서와 검증 파서의 일관성이 중요하다는 점을 보여줍니다.
- URL 검증과 실제 요청에 서로 다른 파서를 쓰면 hostname 해석 차이로 검증이 우회될 수 있습니다.
- 외부 입력 URL을 서버에서 가져오는 기능은 SSRF로 이어질 수 있으므로 파싱과 검증 경로를 함께 점검해야 합니다.
- Node.js 패치는 허용 문자 화이트리스트 대신 URI의 Reserved Characters를 차단하는 방식으로 hostname 검사를 강화했습니다.
- 취약점이 수정된 버전은 Node.js v19.1.0과 v18.13.0이며, url.parse()는 Deprecated 처리됐습니다.