$8000賞金獎勵:Opera瀏覽器從XSS 到 RCE
背景介紹:
今天的故事來自國外一位名為Renwa的白帽子(https://twitter.com/RenwaX23),這也是他提交給Opera的第二個漏洞-Opera 的 My Flow 功能中的遠程代碼執行漏洞,當然,該漏洞在本篇文章發布前已得到修復。
什么是My Flow?
Opera 瀏覽器最酷的功能之一就是My Flow,它基本上是計算機和手機之間的共享空間,允許你與手機共享鏈接、圖像和視頻,只需要掃描相應的二維碼,你就可以在設備之間共享發送內容。

漏洞發現
使用 Opera 中的開發人員工具,可以發現My Flow界面是從域web.flow.opera.com加載的,它只是一個普通的 HTML 頁面,并且允許查看其代碼和組件。
通過查看頁面源代碼,白帽小哥發現該頁面與瀏覽器擴展程序進行通信,但是從瀏覽器擴展程序列表中的opera://extensions/,卻無任何發現。經過一番研究,白帽小哥發現它實際上是一個隱藏的瀏覽器擴展,可以通過使用特殊命令打開 Opera 來顯示,--show-component-extension-options,通過這個特殊命令打開后,可以成功看到名為Opera Touch Background的擴展程序,并且能夠查看其源代碼。
回到 web.flow.opera.com 頁面,白帽小哥開始尋找 XSS 漏洞,下面這段代碼成功引起了他的注意:
const html = e.dataTransfer.getData('text/html');const src = html.match(//);if (src && src[1]) { const parser = document.createElement("span"); parser.innerHTML = src[1];}
該功能主要用拖放,當用戶將圖像放到頁面上時,代碼會創建一個元素,并將其 innerHTML 元素設置為圖像的位置,但是,這樣做會有兩個問題:
- 在瀏覽器中,可以將 dataTransfer 設置為任意值
- 在瀏覽器中,如果創建一個新元素并將其 innerHTML 設置為 標簽,會在后臺繼續加載
這就意味著盡管屏幕上沒有加載圖像,但以下代碼會彈出一個警告框:
const parser = document.createElement("span");parser.innerHTML = '';
于是白帽小哥創建了一個 XSS POC,為了展示引發 XSS 的難易程度,他創建了一個網頁,一旦開始拖動圖像,幾秒鐘后就會重定向到 web.flow.opera.com 頁面,這就意味著用戶只需要拖動圖像,然后松開鼠標的同時,XSS 就會發生!

但是,白帽小哥并不滿足,于是繼續研究 Opera Touch Background 擴展的實際作用,事實證明,它具有更高的權限,甚至擁有對本機函數的訪問權限,例如opr.operaTouchPrivate,它是為與 My Flow 應用程序一起使用而開發的函數集合,查看可用功能,有兩個案例引起了白帽小哥的注意:SEND_FILE和OPEN_FILE。
SEND_FILE 函數檢索有關用戶提供的文件信息并將其上傳到 My Flow,它還將文件保存到用戶計算機的Downloads/MyFlow中。而OPEN_FILE 則用于 My Flow 的圖像文件,但在測試時發現它可以打開任何類型的文件,而不僅僅是圖像文件。
有了這兩個功能,我們豈不是可以在目標計算機上寫入和打開任意文件了?于是白帽小哥立刻創建POC場景,首先創建一個包含calc的文件exploit.bat,然后打開該文件——這將導致它被執行并打開 Windows 計算器:
operaTouchBackground.port.postMessage({ type: "SEND_FILE", name: 'exploit.bat', content: 'calc', file_type: 'image/png'});
operaTouchBackground.port.postMessage({ type: 'OPEN_FILE', localFileName: 'exploit.bat'});
最后只需借助一個讓人們信任的用戶界面,然后讓用戶單擊(拖動)即可激活漏洞利用了!

漏洞在上報幾天后即得到了修復,并在大約三周后給予白帽小哥8000美刀的賞金獎勵。