원문 캡처 · 0x67673068.me
원문 캡처 · 0x67673068.me

Yarr는 Go로 작성된 오픈소스 RSS 리더다. RSS 피드의 항목을 표시하는 과정에서 허용 목록에 든 iframe 주소를 검사하는 방식의 문제로, 악성 피드 항목을 불러온 사용자에게 교차 사이트 스크립팅(XSS)이 발생할 수 있다는 분석이 나왔다.

yarr 저장소는 각 피드 게시물을 객체 모델의 항목으로 처리하고 handleItem 함수에서 다룬다. 원격 게시물의 콘텐츠는 Sanitize 함수로 정리한 뒤 JSON 응답의 content 값에 담기며, 이후 동적으로 문서 객체 모델(DOM)에 렌더링된다.

분석에 따르면 정리 과정에서 iframe 태그와 src 속성이 허용된다. iframe의 src는 isValidIframeSource 함수가 검사한다. 이 함수는 URL의 호스트 부분이 Yarr의 기본 URL과 같거나, YouTube·Vimeo 등 코드에 정의된 허용 목록에 포함되면 주소를 승인한다.

문제는 Go의 net/url 패키지가 URL을 해석하는 방식과 브라우저가 javascript: URI를 처리하는 방식의 차이다. javascript://www.youtube.com/%0a<arbitrary-js>에서 URL 파서는 www.youtube.com을 호스트로 추출해 허용 목록과 일치한다고 판단한다. 반면 브라우저는 javascript: 뒤의 내용을 URL 디코딩한 뒤 자바스크립트 코드로 처리한다. %0a는 줄바꿈으로 디코딩되고, //www.youtube.com/은 자바스크립트 주석이 된다.

따라서 다음 iframe이 정리 과정을 통과할 수 있다는 설명이다.

html
<iframe src="javascript://www.youtube.com/%0a<arbitrary-js>"></iframe>

분석은 iframe에 기본 적용되는 샌드박스 정책도 실행을 허용하는 조건으로 지목한다. 기본값에는 allow-scripts, allow-same-origin, allow-popups가 포함된다. 이 취약점을 이용하면 악성 RSS 피드가 게시물을 불러온 Yarr 사용자에게 스크립트를 실행할 수 있다고 분석은 설명한다.

발견 내용을 Yarr 유지관리자에게 알렸지만 답변을 받지 못했다고 전했다. 다만 계정이 필요 없는 Yarr의 특성을 고려하면 즉각적인 영향은 크지 않을 수 있으며, 구독자가 어떤 다른 RSS 피드를 보는지 엿보는 정도가 최대 영향일 수 있다고 덧붙였다.