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

Firefox UAF漏洞分析

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

2018年12月,Mozila通過mfsa2018-29發布了Firefox 64,修復了多個安全問題,其中就包含CVE-2018-18492,這是一個與select元素有關的UAF(use-after-free,釋放后重用)漏洞,最早由Nils發現并報告。之前我們已經討論過UAF問題,也看到廠商采取了多種保護措施想消除這些問題。但直到目前為止,我們還是經常能在web瀏覽器中發現與UAF相關的漏洞,因此理解這些問題對查找及修復漏洞來說至關重要。在本文中,我們將與大家分享這個UAF漏洞以及相關補丁的具體細節。
 
0x01 觸發漏洞
我們可以使用如下PoC觸發該漏洞:

圖1. PoC
在存在漏洞Firefox版本中運行該PoC,我們可以看到crash時的棧跟蹤狀態如下:

圖2. 崩潰時的棧跟蹤狀態
從圖中可知,當解析填充0xe5e5e5e5的某個內存地址時,會出現read access violation(讀取訪問沖突)。0xe5e5e5e5是jemalloc用來“污染”已釋放內存的一個值。這里的“污染”指的是以一種可識別模式來填充已被釋放的內存,這樣便于分析。正常情況下,我們選擇的填充模式不要對應于可訪問的地址,這樣任何嘗試從已填充內存中解析值的操作(比如UAF)都會導致crash。
 
0x02 漏洞分析
PoC包含6行代碼,讓我們來逐行分析:
創建一個div元素
創建一個option元素
將option元素附加到div元素,現在這個div元素是option元素的父節點
將DOMNodeRemoved事件監聽器添加到div元素中。這意味著如果option節點被移除,就會調用我們在這里添加的函數
創建一個select元素
這里再深入分析一下:
當使用JavaScript創建select元素時,xul.dll!NS_NewHTMLSelectElement函數就會獲得控制權,該函數會為這個select元素分配大小為0x188字節的一個對象:

圖3. xul.dll!NS_NewHTMLSelectElement函數
如上所示,在代碼底部會跳轉至mozilla::dom::HTMLSelectElement::HTMLSelectElement函數。

圖4. mozilla::dom::HTMLSelectElement::HTMLSelectElement函數
在該函數中會初始化新分配對象的各種字段。需要注意的是,這里也會分配大小為0x38字節的另一個對象,將其初始化為HTMLOptionsCollection對象。因此,每個Select元素默認情況下都會對應一個options collection(選項集合)。讓我們看一下PoC的最后一行。
將第二行創建的option元素移動到select元素的options collection中
在JavaScript中執行該操作將導致mozilla::dom::HTMLOptionsCollection::IndexedSetter函數被調用(大家可以在圖2的棧跟蹤狀態中看到該函數被調用)。

圖5. IDA中觀察到的程序邏輯
這里瀏覽器會執行一些檢查操作。比如,如果選項索引值大于當前options collection的長度值,那么就會調用mozilla::dom::HTMLSelectElement::SetLength函數來擴充options collection容量。在PoC中,這個長度值為為0(參考圖1第6行的[0])。然后瀏覽器會進入圖5的紅色方框處的檢測邏輯。如果待設置的索引值不等于options collection的選項數,那么就會進入右分支。在PoC中,我們使用的索引值為0,而選項數也為0,因此會執行左分支。因此瀏覽器會調用nsINode::ReplaceOrInsertBefore函數,如下紅框所示:

圖6. 調用nsINode::ReplaceOrInsertBefore函數
在nsINode::ReplaceOrInsertBefore函數中,瀏覽器會調用nsContentUtils::MaybeFireNodeRemoved函數,通知父節點關于子節點移除的相關事件(如果父節點在監聽這類事件)。

圖7. 調用nsContentUtils::MaybeFireNodeRemoved函數
由于我們在PoC第4行(參考圖1)中,在div元素上設置了DOMNodeRemoved事件監聽器,因此這里瀏覽器就會觸發我們設置的函數。在這個函數中,第一個sel變量會被設置為0,該操作會移除對select元素的最后一個引用。接下來,函數會創建一個巨大的數組緩沖區,這會給內存帶來較大負擔,觸發垃圾回收機制(garbage collector)。此時會釋放select元素對象,因為已經沒有關于該對象的任何引用。現在被釋放的內存已被0xe5e5e5e5填充。最后,函數會調用alert來flush掛起的異步任務。從nsContentUtils::MaybeFireNodeRemoved函數返回后,被釋放的select對象會被用來讀取指針,觸發read access violation:

圖8. 觸發Read Access Violation
這里需要注意的是,如果瀏覽器執行的是右分支,那么還是會調用同一個函數(nsINode::ReplaceOrInsertBefore),但在調用該函數之前,會使用AddRef函數來增加select對象的引用計數。如果是這樣操作,就不會出現UAF問題:

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 大超市外围开时尚饰品赚钱吗 梦幻5开50赚钱 不投入的网络赚钱项目 养老鹅赚钱吗 苏宁赚钱攻略 给国家储备粮肉赚钱吗 五星游戏赚钱 做菇赚钱吗 三本院校学生想赚钱 任务多怎么赚钱软件 159封妖赚钱吗 什么快递员最赚钱 抖音短视频赚钱原理 卖冰冻鸡杂怎么样赚钱 斗米赚钱多吗 英文赚钱怎么翻译成英语