歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Chrome漏洞調試筆記1——CVE-2019-5768

來源:本站整理 作者:佚名 時間:2019-12-06 TAG: 我要投稿

2019年11月1日,Kaspersky的Blog 《Chrome 0-day exploit CVE-2019-13720 used in Operation WizardOpium》公布了他們捕獲的一個Chrome在野漏洞CVE-2019-13720利用樣本的部分內容。這也是2019年第二個被捕獲的Chrome在野漏洞?梢钥吹诫S著IE瀏覽器逐漸被淘汰,Edge瀏覽器用戶占有量遠低于Chrome,Chrome將會成為黑客攻擊的新目標。雖然Chrome的沙箱模塊增加了遠程代碼執行的難度,但是攻擊者仍然會通過類似CVE-2019-0808的內核漏洞或者Chrome自己的高權限模塊漏洞繞過沙箱。由于CVE-2019-13720的技術細節仍未公布,筆者選擇了同樣在今年被發現的CVE-2019-5768作為Chrome漏洞調試筆記的第一篇。由于筆者水平有限,文中錯誤之處懇請斧正。
 
0x0 Root Cause Analysis
FileReader
FileReader對象允許Web應用程序異步讀取存儲在用戶計算機上的文件(或原始數據緩沖區)的內容,可以使用 Blob 對象指定要讀取的數據。
FileReader.readAsArrayBuffer() 方法讀取指定的 Blob中的內容, 一旦完成, result 屬性中保存的將是被讀取內容的 ArrayBuffer 數據對象。
FileReader.onprogress 事件處理progress事件。該事件在讀取Blob時觸發。
FileReader.onloadend 事件處理loadend事件。該事件在讀取Blob結束時觸發。
一個典型的FileReader應用示例代碼如下:

這里申請了128MB的字符串保存到Blob對象中,通過FileReader.readAsArrayBuffer() 方法讀取到ArrayBuffer里,并綁定了FileReader.onprogress和FileReader.onloadend事件的回調,運行示例代碼,Chrome控制臺輸出如下:

需要注意的是最后兩個onprogress事件觸發時,Blob對象數據已經讀取完畢。
PoC
CVE-2019-5768的補丁如下:

這里修復的函數DOMArrayBuffer* FileReaderLoader::ArrayBufferResult()對應了js調用FileReader.readAsArrayBuffer() 后FileReader.result屬性的讀取操作。
觀察該函數補丁前的代碼,重點分析紅框部分的代碼,這里raw_data_是WTF::ArrayBufferBuilder的指針:

WTF::ArrayBufferBuilder使用增量方式構造WTF::ArrayBuffer,并保存構造的WTF::ArrayBuffer指針,WTF::ArrayBuffer采用引用計數算法維護指向實際數據內存的生命周期:

ArrayBufferBuilder::ToArrayBuffer() 將WTF::ArrayBufferBuilder轉換為WTF::ArrayBuffer:

轉換的邏輯是:當WTF::ArrayBufferBuilder保存的buffer空間被完全使用后,直接返回buffer,否則通過ArrayBuffer::Slice()返回一個WTF::ArrayBuffer的副本。
最后再回到FileReaderLoader::ArrayBufferResult(),分析DOMArrayBuffer::Create():

可以看到這里DOMArrayBuffer::Create()只是將WTF::ArrayBuffer的指針做了轉移,返回blink:: DOMArrayBuffer指針保存至局部變量result。
繼續走到if代碼,這里當finished_loading_ == true時,將局部變量result賦值給成員變量array_buffer_result_作為后面再調用FileReader.result屬性的返回結果,否則返回局部變量result。其中finished_loading變量由FileReaderLoader::OnFinishLoading() 賦值true:

我們再來梳理下完整的代碼邏輯:當腳本調用FileReader.result屬性時,c++代碼調用DOMArrayBuffer* FileReaderLoader::ArrayBufferResult()函數返回一個blink::DOMArrayBuffer指針,指向由WTF::ArrayBufferBuilder創建的WTF::ArrayBuffer對象。當Blob對象數據未讀取完時,FileReader.result指向WTF::ArrayBufferBuilder創建的WTF::ArrayBuffer對象的副本;當FileReader已讀取完Blob對象數據時,FileReader.result指向WTF::ArrayBufferBuilder創建的WTF::ArrayBuffer自身。
可以發現這里存在一個時序問題:finished_loading_未被置true時Blob對象數據可能已經讀取完畢(回憶FileReader示例Chrome的控制臺輸出結果),此時FileReader.result將指向WTF::ArrayBufferBuilder創建的WTF::ArrayBuffer自身。也就是說,onprogress和onloadend事件回調中的FileReader.result返回不同的blink::DOMArrayBuffer指針指向同一個WTF::ArrayBuffer。那么就可以通過釋放其中一個FileReader.result,使得另一個FileReader.result成為懸掛指針,PoC如下:

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 辽宁cba比分 安装琼崖海南麻将 青海十一选五软件下载 福建36选7龙岩 股票分析软件app 广东快乐10分钟开奖 上海天天彩 股市大盘行情走势图 分分彩任二计划软件 期如意期货配资平台 上海本地麻将下载 11选5一定牛 河南11选5走势图 迅雷下载电影三级片 850游戏棋牌怎么 …? 浙江十二选五快乐彩