压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

CVE-2017-7368:高通聲卡驅(qū)動中的條件競爭漏洞分析

作者:啟明星辰ADLab

一、前言

最近,在進(jìn)行Android源碼審計的時候,發(fā)現(xiàn)了存著于高通聲卡驅(qū)動中的一個條件競爭漏洞CVE-2017-7368(CNVD-2017-10809,CNNVD-201704-037)。雖然審計的源碼稍微有點過時,谷歌在六月份已經(jīng)修復(fù)了該漏洞,但是整個漏洞發(fā)現(xiàn)的過程和漏洞的分析還是比較有意義的。本文首先介紹高通聲卡的攻擊面和攻擊向量,然后詳細(xì)分析該漏洞成因,最后給出POC。

二、攻擊面和攻擊向量

Android是基于Linux的移動操作系統(tǒng),其基本架構(gòu)如下圖:

其中,驅(qū)動位于Linux內(nèi)核層,驅(qū)動程序是一個軟件組件,可以讓操作系統(tǒng)和設(shè)備彼此通信。驅(qū)動程序會創(chuàng)建一些接口,允許用戶從 ? ? ? ? 用戶空間訪問,以便控制硬件。如果驅(qū)動程序中存著漏洞,用戶就可以從用戶權(quán)限提升到內(nèi)核權(quán)限,也就是root權(quán)限。

Linux驅(qū)動程序一般會在/dev目錄下創(chuàng)建一些文件,然后用戶可以打開這些文件,通過ioctl函數(shù)控制硬件。其中,聲卡創(chuàng)建的文件在/dev/snd目錄下,如下圖:

聲卡驅(qū)動一般是由第三方廠商實現(xiàn),如果采用高通的芯片,那么聲卡驅(qū)動就是由高通提供,而第三方廠商的代碼更容易出現(xiàn)一些安全漏洞。因此高通的聲卡驅(qū)動是一個非常好的攻擊面,ioctl函數(shù)就是這個攻擊面的攻擊向量。

三、漏洞分析

出現(xiàn)漏洞的代碼位于sound/soc/msm/qdsp6v2/msm-lsm-client.c:

用戶空間通過打開/dev/snd/目錄下的對應(yīng)文件,然后設(shè)置ioctl函數(shù)的cmd參數(shù)為SNDRV_LSM_REG_SND_MODEL_V2,就會進(jìn)入這塊代碼。

問題主要出現(xiàn)在767行和775行,第767行驅(qū)動程序為ptrd->lsm_client分配snd_model_v2.data_size長度的內(nèi)核空間,然后將snd_model_v2.data(用戶空間數(shù)據(jù))拷貝到分配的內(nèi)核空間里。其中,snd_model_v2是用戶空間傳入的參數(shù),snd_model_v2.data_size和snd_model_v2.data都是用戶可以控制的,ptrd->lsm_client是一個全局變量。這段代碼如果單線程執(zhí)行,并不存在什么問題,分配了snd_model_v2.data_size長度的內(nèi)核空間,并從用戶空間拷貝對應(yīng)長度的用戶空間數(shù)據(jù),不會出現(xiàn)越界。但這里的ptrd->lsm_client是一個全局變量,如果多線程運(yùn)行,就會出現(xiàn)一些問題。

這里,我們假設(shè)有兩個線程,線程A和線程B。

1、假設(shè)線程A請求分配2000個字節(jié)的空間,這時內(nèi)核執(zhí)行到767行為ptrd->lsm_client分配了2000字節(jié),ptrd->lsm_client的長度為2000,這時線程A掛起,執(zhí)行線程B。

2、線程B請求分配1000個字節(jié)的空間,這時內(nèi)核執(zhí)行到767行為ptrd->lsm_client分配了1000字節(jié),ptrd->lsm_client的長度為1000,這時線程B掛起,執(zhí)行線程A。

3、線程A繼續(xù)執(zhí)行到775行,進(jìn)行數(shù)據(jù)拷貝,此時ptrd->lsm_client的長度已經(jīng)變成了1000,而線程A并不知情,依然拷貝2000個字節(jié)到ptrd->lsm_client,這時就會出現(xiàn)一個堆的溢出。

但是,這種情況并不一定會出現(xiàn),只有一定的概率出現(xiàn)。不過,如果請求的次數(shù)足夠多,這種情況就會出現(xiàn)。

漏洞修補(bǔ)方案比較簡單,增加一個鎖即可。

四、poc構(gòu)造

分析清楚漏洞的成因之后,就可以進(jìn)行POC的構(gòu)造。首先,打開/dev/snd下對應(yīng)的文件。

然后,構(gòu)造兩個snd_model_v2結(jié)構(gòu)體,一個的data_size設(shè)置為2000,另一個設(shè)置為1000。

最后,開啟兩個線程不斷循環(huán)的進(jìn)行請求,即可觸發(fā)該漏洞。

五、總結(jié)

條件競爭的漏洞目前很難fuzz出來,只能靠安全人員的代碼審計,所以這類漏洞還是會有很多。并且Android的碎片化導(dǎo)致安全更新很難全部部署到所有的手機(jī)上,仍有大量的手機(jī)面臨著漏洞的風(fēng)險。

上一篇:Pengex通過系統(tǒng)盤瘋狂傳播 攻擊所有主流殺軟

下一篇:Metinfo 5.3.17 前臺SQL注入漏洞分析