Go 언어 기반 오픈소스 RSS 리더 'yarr'의 HTML 정제 로직에서 원격 스크립트 실행이 가능한 XSS 취약점이 발견되었습니다.
Go의 net/url 파서가 인식하는 호스트 주소와 브라우저가 javascript: 스키마를 주석으로 처리하는 문법 차이를 결합한 정교한 페이로드가 사용되었습니다.
iframe 화이트리스트 검증을 우회하여 악의적인 RSS 피드를 읽는 것만으로도 임의 자바스크립트가 실행될 수 있음이 입증되었습니다.
요약 Go 언어로 작성된 인기 오픈소스 RSS 리더기 'yarr'에서 정교한 XSS(크로스 사이트 스크립팅) 취약점이 발견되었습니다.
작성자는 개인 홈랩 환경에서 yarr을 사용하던 중, 원격 RSS 피드의 콘텐츠가 웹 브라우저 DOM에 렌더링되는 방식에 호기심을 갖고 소스 코드를 분석했습니다. yarr은 피드 게시물을 가져올 때 HTML 파서를 통해 태그와 속성을 검사하는 `Sanitize` 함수를 거치도록 설계되어 있었습니다.
취약점의 핵심은 `iframe` 태그의 `src` 속성을 검증하는 `isValidIframeSource` 함수에 있었습니다. 이 함수는 유튜브나 비메오 등 허용된 도메인(화이트리스트)의 영상 임베드만 허용하기 위해 Go의 기본 `net/url` 패키지로 도메인을 추출해 검사합니다.
하지만 웹 브라우저가 `javascript:` 스키마를 처리하는 방식과 Go의 URL 파서가 문법을 해석하는 차이에서 허점이 발생했습니다. 작성자는 RFC 3986 규격상 `//`가 권한(authority/host) 영역의 시작을 의미한다는 점에 착안해 `javascript://www.youtube.com/%0a<임의의 자바스크립트 코드>` 형태의 페이로드를 구성했습니다.
Go의 `net/url` 파서는 `//www.youtube.com`을 정상적인 호스트명으로 인식해 검증을 통과시켰지만, 실제 웹 브라우저에서는 콜론 뒤의 `//www.youtube.com/` 부분이 자바스크립트 한 줄 주석(`//`)으로 해석되고, 줄바꿈 문자(`%0a`) 이후에 삽입된 악성 코드가 그대로 실행되는 폴리글랏(Polyglot) 트릭이 성립한 것입니다.
여기에 yarr이 iframe에 기본 부여하는 sandbox 정책(`allow-scripts allow-same-origin allow-popups`)까지 더해지면서, 악의적인 RSS 피드를 구독해 열람하기만 해도 사용자의 브라우저 세션에서 임의 스크립트가 실행될 수 있는 위험이 확인되었습니다. 연구자는 해당 취약점을 개발팀에 제보했다고 밝혔습니다.