危害9億安卓設(shè)備高通漏洞細(xì)節(jié)曝光(CVE-2016-3842,含POC) |
||||||||
來源:聚銘網(wǎng)絡(luò) 發(fā)布時(shí)間:2016-08-13 瀏覽次數(shù): | ||||||||
信息來源:安全客
(一)、前言
就在幾天之前,安全研究專家在高通芯片內(nèi)發(fā)現(xiàn)了一系列嚴(yán)重的Android安全漏洞,受這些漏洞影響的Android智能手機(jī)和平板電腦數(shù)量將會(huì)超過九億臺(tái)。更可怕的是,大部分受漏洞影響的Android設(shè)備可能永遠(yuǎn)都不會(huì)被修復(fù)。
據(jù)了解,安全研究專家此次曝光了四個(gè)漏洞,這一組漏洞代號(hào)為“Quadrooter”。這些漏洞存在于配備了高通芯片的Android設(shè)備中,受影響的Android系統(tǒng)版本為Android 6.0(Marshmallow)及其以下版本。攻擊者可以利用這些漏洞來獲取到目標(biāo)設(shè)備(配備了高通芯片)的完整訪問權(quán)限。
這四個(gè)安全漏洞分別為:
1. CVE-2016-2503:該漏洞存在于高通芯片的GPU驅(qū)動(dòng)程序中,谷歌公司在2016年7月份的安卓安全公告中正式宣布成功修復(fù)了此漏洞。
2. CVE-2016-2504:該漏洞存在于高通芯片的GPU驅(qū)動(dòng)程序中,谷歌公司在2016年8月份的安卓安全公告中正式宣布成功修復(fù)了此漏洞。
3. CVE-2016-2059:該漏洞存在于高通芯片的內(nèi)核模塊中,公司于今年四月份就已經(jīng)修復(fù)了該漏洞。
4. CVE-2016-5340:該漏洞同樣存在于高通芯片的GPU驅(qū)動(dòng)程序中,該漏洞目前已成功修復(fù)。
攻擊者只需要開發(fā)一個(gè)簡(jiǎn)單的惡意軟件,然后將惡意軟件發(fā)送給目標(biāo)用戶。一旦惡意軟件成功安裝,攻擊者就能夠直接獲取到感染設(shè)備的root訪問權(quán)限。
我們?cè)谙旅孢@份列表中列出了當(dāng)前較為熱門的幾款受影響設(shè)備,雖然還有很多其他的移動(dòng)設(shè)備同樣會(huì)受到上述漏洞的影響,但是由于相關(guān)設(shè)備的數(shù)量過于龐大,所以我們?cè)诖藷o法一一列舉。
-Samsung Galaxy S7、Samsung S7 Edge
-Sony Xperia Z Ultra
-OnePlus One、OnePlus 2、OnePlus 3
-Google Nexus 5X、Nexus 6、Nexus 6P
-Blackphone 1、Blackphone 2
-HTC One、HTC M9、HTC 10
-LG G4、LG G5、LG V10
-New Moto X(Motorola)
-BlackBerry Priv
(二)、漏洞概述
2016年8月份的Nexus安全公告對(duì)這一漏洞(CVE-2016-3842)進(jìn)行了評(píng)估,感興趣的讀者可以點(diǎn)擊這里閱讀這份安全公告。
細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn)了,這個(gè)漏洞似乎分配到了兩個(gè)CVE編號(hào)。這也就意味著,將會(huì)出現(xiàn)一個(gè)修復(fù)補(bǔ)丁將會(huì)同時(shí)修復(fù)兩個(gè)漏洞的情況,請(qǐng)大家不要驚訝。
另外一個(gè)漏洞就是前言所提到的CVE-2016-2504,該漏洞的發(fā)現(xiàn)者是Adam Donenfeld。
我對(duì)漏洞CVE-2016-2504進(jìn)行了分析,但是我無法找出這兩個(gè)CVE漏洞之間的區(qū)別,所以我推測(cè)這兩個(gè)漏洞描述的是同一個(gè)問題。所以在這篇文章中,我只會(huì)對(duì)我上報(bào)給谷歌公司的那個(gè)初始漏洞進(jìn)行描述。
(三)、技術(shù)細(xì)節(jié):
ioctl是設(shè)備驅(qū)動(dòng)程序中對(duì)設(shè)備的I/O通道進(jìn)行管理的函數(shù),所謂對(duì)I/O通道進(jìn)行管理,指的就是對(duì)設(shè)備的一些特性進(jìn)行控制。ioctl函數(shù)是文件結(jié)構(gòu)中的一個(gè)屬性分量,如果你的驅(qū)動(dòng)程序提供了對(duì)ioctl的支持,用戶就能在用戶程序中使用ioctl函數(shù)控制設(shè)備的I/O通道。
高通的MSM GPU驅(qū)動(dòng)程序(也被稱為kgsl驅(qū)動(dòng))提供了一個(gè)ioctl命令-IOCTL_KGSL_GPUMEM_ALLOC,這條控制命令可以允許用戶態(tài)的應(yīng)用程序分配得到GPU與主存共享的那一部分內(nèi)存空間。
在這個(gè)函數(shù)中,驅(qū)動(dòng)程序?qū)?huì)創(chuàng)建一個(gè)名為“kgsl_mem_entry”的結(jié)構(gòu)體來標(biāo)識(shí)被分配出去的那塊內(nèi)存空間。
當(dāng)某一線程向kgsl驅(qū)動(dòng)程序發(fā)送了IOCTL_KGSL_GPUMEM_ALLOC命令之后,函數(shù)“kgsl_mem_entry_attach_process”將會(huì)通過調(diào)用“idr_alloc”函數(shù)來為“kgsl_mem_entry”對(duì)象分配一個(gè)id。
但是在這個(gè)時(shí)候,可能有其他的線程會(huì)在函數(shù)“kgsl_ioctl_gpumem_alloc”的結(jié)果值還沒正常返回的情況下,就發(fā)送IOCTL_KGSL_GPUMEM_FREE_ID命令去釋放剛剛分配的結(jié)構(gòu)體對(duì)象(kgsl_mem_entry)。
這也就意味著,函數(shù)“kgsl_ioctl_gpumem_alloc”將會(huì)繼續(xù)使用這個(gè)已經(jīng)被釋放了的“kgsl_mem_entry”對(duì)象。
正如技術(shù)人員在補(bǔ)丁文件中寫到的那樣:
“如果我們過早地在idr和rb進(jìn)程樹中添加了kgsl_mem_entry指針,那么其他的線程就可以在這一對(duì)象得到創(chuàng)建函數(shù)的返回值之前,通過猜測(cè)對(duì)象ID或者GPU地址來操作這個(gè)結(jié)構(gòu)體對(duì)象了。”
實(shí)際上,“kgsl_mem_entry”對(duì)象的ID其實(shí)是非常好猜測(cè)的。你在內(nèi)核中分配的第一個(gè)entry其ID永遠(yuǎn)都為1。
(四)、概念驗(yàn)證POC
所以,你可以通過下列操作代碼來觸發(fā)這個(gè)漏洞:
運(yùn)行結(jié)果:
Poison Overwritten:
(五)、漏洞利用
在我看來,雖然攻擊者可以利用這個(gè)漏洞來進(jìn)行攻擊,但是針對(duì)該漏洞的利用技術(shù)非常不穩(wěn)定。
我很想跟大家分享一些關(guān)于這一漏洞的利用技術(shù),但是說實(shí)話,我自己也沒能夠完全掌握該漏洞的利用技巧。
對(duì)于我自己而言,只有穩(wěn)定且通用的漏洞利用技術(shù)才值得花時(shí)間去開發(fā),所以我就不打算在這個(gè)漏洞上花費(fèi)太多的時(shí)間和精力了。
為了避免在漏洞利用的過程中出現(xiàn)內(nèi)核崩潰的情況,你需要在短時(shí)間內(nèi)重新為系統(tǒng)分配一個(gè)新的“mem_entry”對(duì)象(因?yàn)橹暗膶?duì)象已經(jīng)被清空了),而且至少要在分配進(jìn)程訪問“msm_iommu_map_range”地址之前完成你的對(duì)象分配操作。
在這一過程中不得不提到一項(xiàng)技術(shù),即堆噴射技術(shù)。在計(jì)算機(jī)安全領(lǐng)域中,如果想要實(shí)現(xiàn)任意代碼執(zhí)行,那么堆噴射技術(shù)(Heap Spraying)就是一種較為容易的技術(shù)實(shí)現(xiàn)手段了。在一般情況下,堆噴射代碼會(huì)試圖將自身大面積地填充至進(jìn)程的堆??臻g中,并以正確的方式將命令寫滿這部分內(nèi)存區(qū)域,以實(shí)現(xiàn)在目標(biāo)進(jìn)程的內(nèi)存中預(yù)留位置,并寫入任意的控制指令。
為了實(shí)現(xiàn)這一步操作,我嘗試了多種方法,包括采用堆噴射技術(shù)來填充內(nèi)核空間。但是我在測(cè)試之后發(fā)現(xiàn),我所采用的最佳方法其成功率也只有40%,大部分情況下內(nèi)核都會(huì)發(fā)生崩潰。我所采用的方法就是通過seccomp-bpf程序配合堆噴射技術(shù),迅速將數(shù)據(jù)內(nèi)容填充堆內(nèi)存空間。谷歌的Project Zero團(tuán)隊(duì)曾在去年的一篇文章中介紹過這項(xiàng)技術(shù),感興趣的讀者可以點(diǎn)擊這里進(jìn)行閱讀。需要注意的是,seccomp-bpf只能用于對(duì)版本為3.10的內(nèi)核進(jìn)行堆噴操作。如果我們能夠重新填充之前被意外釋放的那部分內(nèi)存空間,那么控制目標(biāo)計(jì)算機(jī)的注冊(cè)表也就是一件很簡(jiǎn)單的事情了。
在“kgsl_mem_entry”結(jié)構(gòu)體中,存在一個(gè)名為“kgsl_memdesc_ops”的結(jié)構(gòu)體指針,它可以被攻擊者完全控制:
通過重寫“kgsl_memdesc_ops”指針,并讓它指向你的ROP/JOP鏈,你就可以成功實(shí)現(xiàn)內(nèi)核代碼執(zhí)行了。
(六)、修復(fù)補(bǔ)?。?/span>
https://android.googlesource.com/kernel/msm/+/973f4134d9deb396415846f902848f0a32cb4cfa
(七)、漏洞時(shí)間軸
2016年4月25日:將該漏洞提交給谷歌公司;
2016年5月5日:谷歌公司對(duì)該漏洞進(jìn)行了評(píng)估,并將該漏洞的評(píng)級(jí)設(shè)置為“高危漏洞”;
2016年6月29日:該漏洞分配到了編號(hào)CVE-2016-3842;
2016年8月1日:2016年8月份的Nexus安全公告正式披露了該漏洞的內(nèi)容
(八)、總結(jié)
Android系統(tǒng)的安全問題真是令人頭疼的問題。再加上近期高通公司的處理器芯片頻爆漏洞,無疑是在給Android手機(jī)目前的安全現(xiàn)狀雪上加霜。
高通(Qualcomm)是一家美國的無線電通信技術(shù)研發(fā)公司,成立于1985年7月,在以技術(shù)創(chuàng)新推動(dòng)無線通訊向前發(fā)展方面扮演著重要的角色。目前,高通公司所生產(chǎn)的CPU芯片和GPU芯片已經(jīng)被廣泛應(yīng)用于各大廠商的安卓智能手機(jī)上了,考慮到如此大的用戶群體,高通公司是不是應(yīng)該加強(qiáng)產(chǎn)品的安全監(jiān)管呢?
當(dāng)然了,無論產(chǎn)品做得多么優(yōu)秀,安全問題永遠(yuǎn)都會(huì)存在。沒有折不斷的茅,也沒有攻不破的盾。也許這就是信息安全吧!
(九)、參考鏈接
1.kgsl驅(qū)動(dòng)程序中的另一個(gè)漏洞(已于2016年6月修復(fù)):
http://retme.net/index.php/2016/06/12/CVE-2016-2468.html
2.2016年8月份的Nexus安全公告:
https://source.android.com/security/bulletin/2016-08-01.html
3.Project Zero項(xiàng)目團(tuán)隊(duì)于2015年1月份發(fā)表的技術(shù)文章(涉及seccomp-bpf):
http://googleprojectzero.blogspot.jp/2015/01/exploiting-nvmap-to-escape-chrome.html
4.漏洞修復(fù)補(bǔ)?。?/span>
https://android.googlesource.com/kernel/msm/+/973f4134d9deb396415846f902848f0a32cb4cfa
5.“Quadrooter”漏洞報(bào)告(The Hacker News):
http://thehackernews.com/2016/08/hack-android-phone.html
本文由 安全客 原創(chuàng)發(fā)布,如需轉(zhuǎn)載請(qǐng)注明來源及本文地址。 |
||||||||