Kate Li (Taiwan)的部落格

首頁

今年的offensivecon大會議題質量不錯(附資料下載)

作者 zindani 時間 2020-03-11
all

年前曾在微博上推薦過OffensiveCon 2019大會議題,議題清單與介紹可參見官網(https://www.offensivecon.org/agenda/),很多專注於漏洞挖掘與利用的乾貨分享,現時只有部分議題ppt公開,通過點擊文末的“閱讀原文”可打包下載(包含8個議題),包括ppt、paper和code。

會議結束後,Twitter上贊聲一片,議題質量很贊。

本文主要聊聊已公開的一些議題,學習下思路。

議題清單

Modern Source Fuzzing

這是作者Ned Willliamson在353c大會上的《Attack Chrome IPC》議題的擴展補充,我之前還寫過《安全研究者的自我修養》一文,裡面介紹的就是作者提及的二進位漏洞研究的學習思路。

現時作者沒公開這次會議的ppt,大家還是看353C的演講視頻吧:https://media.ccc.de/v/35c3-9579-attacking_chrome_ipc

IPC You Outside the Sandbox: One bug to Rule the Chrome Broker

作者已經在github上公佈此漏洞的利用程式碼hack2win-chrome,點擊”閱讀原文“可下載到。

本議題講的是Chrome沙箱逃逸漏洞,漏洞位於應用緩存(AppCache)子系統上,主要方便從本地讀取數據進行離線流覽,訪問速度更快,還能緩解服務器壓力。

AppCache位於沙箱之外的高許可權行程browser,沙箱內低許可權的renderer行程通過發送IPC消息與browser行程互動的,當AppCache出漏洞時,就有可能逃逸出沙箱。

漏洞成因

這次的ppt寫得比較模糊,沒那麼清楚,還是直接看patch diff:

移動CancelUpdate()函數到newest_complete_cache_=nullptr;之後,直接看看CancelUpdate裡面的邏輯:

CancelUpdate() newest_complete_cache_=nullptr;

在調用AppCacheGroup::RemoveCache清除緩存時,newest_complete_cache_指向的是被銷毀的對象,所以後面才要把它置空,但在銷毀之前調用了CancelUpdate =>

AppCacheGroup::RemoveCache newest_complete_cache_ CancelUpdate

AppCacheUPdateJob::~AppCacheUPdateJob=>AppCacheGroup::SetUpdateAppCacheStatus=>AppCacheHost::OnupdateComplete=>

AppCacheUPdateJob::~AppCacheUpdateJob AppCacheGroup::SetUpdateAppCacheStatus AppCacheHost::OnupdateComplete

SetSwappableCache

SetSwappableCache

最後的SetSwappableCache用於設定新的交換緩存(swap cache),會引用到newest_complete_cache_,而此時它還未被置NULL,導致出現Use After Free漏洞。

SetSwappableCache newest_complete_cache_

漏洞利用:

【洩露地址】:使用與AppCache對象大小相同的net::CanonicalCookie對象來佔用釋放對象的記憶體,而CanonicalCookie對象開頭是個cookie名稱,即字串指針,再從瀏覽器中讀取cookie資訊來達到資訊洩露的目的,從而拿到可控數據的堆地址繞過ASLR。

AppCache net::CanonicalCookie CanonicalCookie

【程式碼執行】:使用與AppCache對象大小相同的Blob對象對佔用釋放記憶體,再偽造AppCacheGroup對象,當它析構釋放時,在~AppCacheGroup中會調用到已被填充控制的虛函數指針,再結合ROP繞過DEP,從而達到程式碼執行。

AppCache Blob AppCacheGroup ~AppCacheGroup

整個過程還是需要自己動手調試一遍才比較清楚,估計足够調上幾天了,國內似乎也沒有一遍完整的文章分析過該漏洞的利用細節,期待有人分享。

3D Accelerated Exploitation

該議題主要介紹VirsualBox 3D加速器的攻擊面和漏洞利用,由於VBox是開源的,囙此可以直接使用AFL去Fuzzing,fuzz目標就是通過發送畸形chromium messages來觸發漏洞。他們應該是自己寫個構造發送消息的程式,輸入檔案即chromium messages內容,樣本可能是收集550操作碼的資訊去構造,也可能通過hook去直接抓取真實數據作為樣本,然後用afl去跑。更具體的實現管道,作者也沒細說。

MWR Labs這幾年經常曝光一些Pwn2Own級別的漏洞,分享很多經典文章,還開源了不少Fuzzer工具,連ppt都做得非常工整,具有獨特風格,哪怕沒logo,你看一眼都能猜出是他們寫的。具備牛X的技能能力,又樂分享,這點是比較難得的。

Attacking Edge Through the JavaScript Just-In-Time compiler

一直以來,chakra被曝的漏洞非常多,導致微軟最終還是放弃了。

從今年開始,微軟將打算把Edge的Chakra引擎改用Google Chromium引擎,估計最近這兩個月就會發佈,以後就可能沒什麼人再搞Chakra內核了。

這議題裡面講了很多chakra的js對象記憶體結構等基礎知識,重點講了JIT優化編譯器的漏洞原理與利用技巧,整個ppt有120頁,很多。

我沒搞過chakra,未來可能也用不上了,有興趣的同學可以看下,作者把exploit程式碼也公佈了,我已附在本文的打包資料裡面。

Coverage-Guided USB Fuzzing with Syzkaller

搞過Linux/Android內核漏洞挖掘的人,應該都知道Syzkaller這款神器,發現超過2500個內核bug,它是基於程式碼覆蓋率+API調用範本來Fuzzing內核的工具,對於發現崩潰的漏洞,還能自動生成C程式碼幫助複現,是由Google的DmitryVyukov開發的,已在Github上開源多年(https://github.com/google/syzkaller)。

這次作者用syzkaller fuzz USB驅動共發現了80+個bug,它先開啟kcov去收集程式碼覆蓋率資訊,寫了兩個usb操作的描述範本(vusb.txt用來生成usb消息,vusb_ids.txt用於選取與USB設備驅動相匹配的USB ID清單),ppt裡面有連結,所有的usb fuzzer程式碼都已經嵌入到syzkaller項目裡面了

整個syzkaller的使用過程就是先去尋找內核的攻擊面,然後構造api調用範本,剩下交由syzkaller基於程式碼覆蓋驅動的管道去Fuzzing,有點類似api fuzzing。只是這裡作者又寫了個USB內核模塊,方便通過用戶層發送USB消息去測試。

作者還專門搞了個樹莓派來重現漏洞,演示通過USB去讓Windows/Linux系統崩潰。

FuzzIL: Guided Fuzzing for JavaScript Engines

這議題最大的亮點在於:自定義一套中間語言IL,通過IL可以翻譯成JS程式碼,然後通過變異IL來生成JS程式碼,與以往基於JS語法範本生成程式碼的管道不同。

直接通過一行行删除IL的管道來驗證是否崩潰或產生新路徑,以此用來精簡樣本。

整個Fuzzing過程如下:

作者未來會在github上開源(https://github.com/googleprojectzero/fuzzilli),拭目以待。

結語

點擊”閱讀原文“可獲取議題的打包資料,除上述推薦的議題資料外,還有3個議題,包括”Bypass_Windows_Defender_ASR“、”macOS-How to Gain Root with CVE-2018-4193“,以及”OSX Privileged Helper Tool“,有興趣的同學自行下載閱讀。