安卓Stagefright高危漏洞初探
序
驚聞Stagefright曝出重大漏洞,可以造成遠程代碼執行,甚至發條彩信,就有可能入侵用戶移動設備。這聽起來可是難得一遇的大漏洞啊,作為安全人員,自然要好好扒一扒內幕了。
山重水復
從新聞來看,出于某些考慮,漏洞的發現者目前并沒有公布相關的細節,而是決定要留到BlackHat上再進行詳細的說明。也就是說,目前所知道就是Android系統的Stagefright庫存在重大安全問題,具體是什么?想知道自己去Fuzz。
雖然,看起來關于漏洞細節,并沒有任何頭緒。但是,作為安全人員,首先要堅信的一點,就是世界上沒有不透風的墻!仔細研讀漏洞的新聞稿,可以發 現,該漏洞已經提交給了Google,并且Google迅速的進行了修復。同時發現,Google也已經把漏洞相關信息交給了部分合作伙伴。看完這些,就 能確定,這漏洞目前還能扒。
既然Google針對此漏洞,已經在源碼中進行了修復。那么首先查看了Google的相關源碼提交狀態。
簡單翻閱了提交的log。發現了一些關于libstagefright安全問題的修復,但大多言簡意賅,難以確定。
柳暗花明
看起來從Google方面下手并不容易,好在Google已經將漏洞相關資料交給了合作伙伴,所以我們發現了CyanogenMod公布的一條消息。
也就是說,在CM12中已經對此漏洞進行了修復!
順藤摸瓜
隨后,我們在github上找到了CM12的提交記錄
可以看到,在CM12的最近提交中,都是對Stagefright相關漏洞的修復,根據這些修復內容,對漏洞大體上也就能有一些了解了!
抽絲剝繭
我們對部分修復方案進行了簡單分析。
Bug: 20139950
該bug的位置在frameworks/av/media/libstagefright/SampleTable.cpp文件的 SampleTable::setSampleToChunkParams函數中,從該bug的說明和修復上來看。是由于 mNumSampleToChunkOffets值太大,可能造成溢出。相關代碼如下
注意紅線標注部分。可能會造成訪問越界。從而引發安全問題。
Bug: 20139950
該bug在frameworks/av/ media/libstagefright/ESDS.cpp的ESDS::parseESDescriptor函數中。直接從描述和修復代碼中,就能看出來,是由于在解析過程中,對變量校驗不嚴格,可能造成越界訪問的問題。
Bug: 20923261
此漏洞產生于frameworks/av/media/libstagefright/MPEG4Extractor.cpp的 MPEG4Extractor::parseChunk函數中。從截圖就可以看到漏洞的全貌了。當chunk_data_size小于 kSkipBytesOfDataBox時,紅線部分就會變成一個負數,由于setData的最后一個參數類型是size_t,所以就會被解析成很大的正 數,從而造成錯誤。
其余漏洞產生原因類似,就不再一一進行描述了。
總結
概覽全部的修復代碼,發現產生漏洞的原因,都是因為對數據校驗完善造成的。此次曝光的只是Stagefright的問題。考慮到Android系 統中包含了大量的文件解析代碼,包括圖片、壓縮包、音頻、視頻等解碼庫。這些庫在解析文件過程中,對數據進行嚴格的校驗了嗎?會不會明天又會爆出音頻解碼 存在嚴重bug?這應該是值得開發者和安全從業者深思的問題。