Categories
程式開發

Firefox 現安全漏洞,Mozilla 發布緊急更新


近日,Mozilla 發現了一個安全漏洞,並於4 月3 日發布了Firefox 74.0.1 以修復該漏洞,該漏洞涉及到了Firefox 普通版和長期支持版(ESR),所以有理由推測這個漏洞在2019 年發布Firefox 68 ESR 時就已經存在其中了。

緊急發布更新

幾天前,Mozilla 為 Firefox 瀏覽器推出了新的版本 Firefox 74.0.1,以修補可能被利用的安全漏洞。普通版 Firefox 需要從 74.0 更新到 74.0.1,如果是 Firefox ESR 版本的用戶,需要從 68.6.0 更新到 68.6.1。 Tor 瀏覽器也隨之發布了新版本,需要從 9.0.7 升級至 9.0.8。

目前,Mozilla 並沒有公佈有關於該安全漏洞的詳細信息,包括何時發現該漏洞,攻擊者會如何利用該漏洞進行攻擊,目前為止因此漏洞被攻擊的人數有多少等等,Mozilla 只提到了一點:

Firefox 現安全漏洞,Mozilla 發布緊急更新 1

值得注意的是,這兩個漏洞 Mozilla 都提示發現了相關針對性的在野利用攻擊,在漏洞被利用時極可能為 0day 狀態。根據奇安信的分析來看,該漏洞主要是通過誘導用戶點擊存有安全隱患的頁面從而獲取用戶電腦的控制權。

Firefox 現安全漏洞,Mozilla 發布緊急更新 2

圖片來源於奇安信

什麼是 Use-after-free 漏洞

Use-after-free 漏洞,也稱為 UAF 漏洞,即釋放後重用。

大致原理就是:申請出一個堆塊保存在一個指針中,在釋放後卻沒有將該指針清空,形成了一個懸掛指針,而後再申請出堆塊時會將剛剛釋放出的堆塊申請出來,並複寫其內容,而懸掛的指針此時仍可以使用,結果出現了不可控的情況,而攻擊者就是利用這個漏洞控制函數指針,進而劫持程序執行流。

攻擊者可以利用UAF 漏洞對用戶造成一些任意內存的修改,可能會造成任意內存的讀取,可能會讀取用戶的cookie 或是頁面請求被修改,嚴重的能夠造成任意命令的執行,獲得shell,而造成的影響還是要取決於被釋放的指針是怎麼使用的。

如何避免 UAF 漏洞

早在 2018 年 12 月,Mozila 發布的 Firefox 64 就曾出現過一個與 select 元素有關的 UAF 漏洞問題,漏洞名稱為 CVE-2018-18492。去年 3 月,Google 也曾披露兩個漏洞,其中 Chrome 的漏洞名稱為 CVE-2019-5786,還有一個存在於 Microsoft Windows 中。去年 10 月,WhatsApp 也出現了 UAF 漏洞,名稱為 CVE-2019-11932。

UAF 漏洞雖然不易造成過於嚴重的後果,但想要完全解決這個問題也並非易事,那麼如何解決這個問題呢? Tarjei Mandt 在他的論文中提到了解決方案,大致如下:

Windows 系統中有一個名為 IoCompletionReserve 的對象,大小為 0x60,可以通過 NtAllocateReserveObject 申請出來,需要做的是:

  1. 首先申請 0x10000 個該對象並將指針保存下來;

  2. 然後再申請 0x5000 個對象,將指針保存下來;

  3. 第二步中的 0x5000 個對象,每隔一個對象釋放一個對象;

原理在於通過第一步的操作將現有的空餘堆塊都申請出來,而第二步中申請的堆塊都應是連續的,再通過第三步的操作,使用戶申請Use-after-free結構體前面沒有空閒的堆塊,因此在釋放的時候不會合併,再分配的時候基本上不會出現意外。

Tarjei Mandt 的論文《Kernel Pool Exploitation on Windows 7》:

https://media.blackhat.com/bh-dc-11/Mandt/BlackHat_DC_2011_Mandt_kernelpool-wp.pdf

延伸閱讀:

https://www.mozilla.org/en-US/security/advisories/mfsa2020-11/#CVE-2020-6819