曲速未來(lái) 披露:由macOS NFS客戶端中的緩沖區(qū)溢出引起的內(nèi)核RCE區(qū)塊鏈
曲速未來(lái):為Apple的macos操作系統(tǒng)內(nèi)核編寫(xiě)的自定義QL查詢發(fā)現(xiàn)了多個(gè)堆棧和堆緩沖區(qū)溢出,這些溢出可通過(guò)連接到惡意NFS文件服務(wù)器來(lái)觸發(fā)。
區(qū)塊鏈安全咨詢公司 曲速未來(lái) 消息:有安全人員在Apple的macOS操作系統(tǒng)內(nèi)核中發(fā)現(xiàn)的幾個(gè)堆棧和堆緩沖區(qū)溢出。Apple將這些漏洞歸類為內(nèi)核中的遠(yuǎn)程代碼執(zhí)行漏洞,因此它們非常嚴(yán)重。攻擊者可能會(huì)利用它們遠(yuǎn)程入侵Mac。或者,通過(guò)物理訪問(wèn)計(jì)算機(jī),攻擊者可以作為訪客用戶登錄(無(wú)需密碼),然后使用這些漏洞提升其權(quán)限并控制計(jì)算機(jī)。
這些漏洞存在于客戶端NFS實(shí)現(xiàn)中,用于將網(wǎng)絡(luò)驅(qū)動(dòng)器(如NAS)安裝到Mac的文件系統(tǒng)中。
嚴(yán)重程度和緩解
這些漏洞已在Android版本10.13.6中得到修復(fù),Apple于2018年7月9日發(fā)布了該版本。Apple要求安全人員不要透露漏洞,直到另行通知為止。這就是他們所說(shuō)的:
NFS被廣泛使用,特別是在大型企業(yè)中,它用于共享驅(qū)動(dòng)器和聯(lián)網(wǎng)的主目錄。但它也用于家庭NAS設(shè)備,通常用作媒體服務(wù)器。在macOS中,安裝NFS共享不需要特殊權(quán)限,因此任何用戶都可以觸發(fā)漏洞,甚至是訪客帳戶(不需要密碼)。此外,許多計(jì)算機(jī)(尤其是企業(yè)環(huán)境中的計(jì)算機(jī))配置為在啟動(dòng)時(shí)自動(dòng)掛載NFS共享。這意味著這些漏洞至少有兩個(gè)攻擊媒介:
這些漏洞可能被用于在使用NFS文件管理器的公司中快速傳播病毒。要做到這一點(diǎn),攻擊者需要在文件管理器上安裝惡意版本的NFS服務(wù)器軟件,或者找到一種方法將惡意文件管理器放在網(wǎng)絡(luò)上并開(kāi)始攔截某些NFS流量。
這些漏洞可用于獲取升級(jí)的權(quán)限。例如,有人可能以guest用戶身份登錄,然后發(fā)出單行命令連接到惡意NFS服務(wù)器(可能是Internet上的任何位置),并在計(jì)算機(jī)上獲得內(nèi)核級(jí)訪問(wèn)權(quán)限。
Apple分配了五個(gè)CVE,因?yàn)榇a包含多個(gè)類似的錯(cuò)誤:CVE-2018-4259,CVE-2018-4286,CVE-2018-4287,CVE-2018-4288和CVE-2018-4291。為避免意外泄露任何可能未修復(fù)的錯(cuò)誤,所以只寫(xiě)關(guān)于Apple工作概念驗(yàn)證漏洞的兩個(gè)漏洞。
概念驗(yàn)證漏洞利用
安全人員編寫(xiě)了一個(gè)概念驗(yàn)證漏洞,它用0覆蓋4096字節(jié)的堆內(nèi)存并導(dǎo)致內(nèi)核崩潰。還可以改變利用率來(lái)發(fā)送盡可能多的數(shù)據(jù)。任何大于128字節(jié)的數(shù)字都會(huì)觸發(fā)堆緩沖區(qū)溢出。也完全控制了寫(xiě)入的字節(jié)值。因此,盡管PoC只破壞了內(nèi)核,但可以合理地假設(shè)可以使用這些緩沖區(qū)溢出來(lái)實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行和本地權(quán)限提升。
漏洞
安全人員編寫(xiě)PoC的兩個(gè)漏洞是在這個(gè)看似無(wú)害的代碼行中(nfs_vfsops.c:4151):
這行代碼的目的是fh從nmrepNFS服務(wù)器發(fā)送回Mac的回復(fù)消息()中讀取文件句柄()。文件句柄是NFS共享上的文件或目錄的不透明標(biāo)識(shí)符。NFSv3中的文件句柄最多為64個(gè)字節(jié),NFSv4中的文件句柄最多為128個(gè)字節(jié)(搜索FHSIZE)。fhandle_tXNU中的類型有足夠的空間容納128字節(jié)的文件句柄,但是他們忘記檢查nfsm_chain_get_fh宏中的緩沖區(qū)溢出:
由于宏的大量使用,這段代碼很難遵循,但它的作用實(shí)際上非常簡(jiǎn)單:它從消息中讀取一個(gè)32位無(wú)符號(hào)整數(shù)(FHP)->fh_len,然后直接從消息中讀取該字節(jié)數(shù)(FHP)->fh_data。沒(méi)有邊界檢查,因此攻擊者可以使用他們選擇的任何字節(jié)序列覆蓋任意數(shù)量的內(nèi)核堆。被覆蓋的文件句柄的內(nèi)存在nfs_socket.c:1401中分配。
安全人員寫(xiě)的PoC for的第二個(gè)錯(cuò)誤是nfsm_chain_get_opaque宏中的整數(shù)溢出:
此代碼使用nfsm_rndup宏圓LEN高達(dá)4的倍數(shù),但它使用的原始值LEN的調(diào)用bcopy。如果值LEN是0xFFFFFFFF然后加入在nfsm_rndup將溢出和的值rndlen將是0。這意味著與比較(NMC)->nmc_left會(huì)成功,bcopy將與被調(diào)用0xFFFFFFFF作為大小參數(shù)。這當(dāng)然會(huì)導(dǎo)致內(nèi)核崩潰,因此它只能用作拒絕服務(wù)攻擊。
使用QL查找錯(cuò)誤
QL的一大優(yōu)勢(shì)是能夠找到已知錯(cuò)誤的變種。今年早些時(shí)候,就有安全人員在Apple的NFS無(wú)盤(pán)啟動(dòng)實(shí)現(xiàn)中發(fā)現(xiàn)了兩個(gè)漏洞,CVE-2018-4136和CVE-2018-4160。該查詢旨在查找bcopy可能具有用戶控制的大小參數(shù)的調(diào)用,該參數(shù)可能為負(fù)。一個(gè)簡(jiǎn)單的變化是查找bcopy用戶控制源緩沖區(qū)的調(diào)用。這樣的調(diào)用可能很有趣,因?yàn)樗鼈儗⒂脩艨刂频臄?shù)據(jù)復(fù)制到內(nèi)核空間中。
上面的查詢相當(dāng)簡(jiǎn)單,因?yàn)樗檎覍?duì)bcopy從mbuf內(nèi)核空間復(fù)制數(shù)據(jù)的任何調(diào)用。只要正確檢查size參數(shù)的邊界,這樣的調(diào)用就沒(méi)有錯(cuò)。然而事實(shí)證明,很大一部分結(jié)果是nfsm_chain_get_fh宏的使用,它不進(jìn)行任何邊界檢查。因此,盡管此查詢很簡(jiǎn)單,但它發(fā)現(xiàn)了許多重要的安全漏洞。在其當(dāng)前形式中,即使修復(fù)了錯(cuò)誤,查詢?nèi)詫⒗^續(xù)報(bào)告相同的結(jié)果。最好改進(jìn)查詢,以便在有適當(dāng)?shù)倪吔鐧z查時(shí)不會(huì)報(bào)告結(jié)果。
實(shí)現(xiàn)邊界檢查的常用方法是這樣的:
還寫(xiě)了這個(gè)謂詞來(lái)檢測(cè)上面的模式:
它使用Guards庫(kù)來(lái)查找在受控制的控制流位置中使用的大小表達(dá)式guard。然后它使用globalValueNumber庫(kù)來(lái)檢查條件本身是否出現(xiàn)相同大小的表達(dá)式。該GlobalValueNumbering庫(kù)使謂詞能夠檢測(cè)非平凡大小表達(dá)式的相等性,如下所示:
最后,它使用一個(gè)名為的實(shí)用程序relOpWithSwapAndNegate來(lái)檢查size表達(dá)式是否小于限制。它使謂詞也能處理這樣的場(chǎng)景:
有時(shí)實(shí)現(xiàn)邊界檢查的另一種方式是通過(guò)調(diào)用min,如此謂詞所檢測(cè)到的:
然后將這兩個(gè)謂詞組合如下:
請(qǐng)注意,習(xí)慣lowerBound確保不存在負(fù)整數(shù)溢出的可能性。唯一剩下要做的就是checkedSize在isSink方法中使用,以減少誤報(bào)的數(shù)量。這是完成的查詢:
總結(jié)
區(qū)塊鏈安全咨詢公司 曲速未來(lái) 表示:與大多數(shù)其他開(kāi)源項(xiàng)目不同,XNU無(wú)法在LGTM上查詢。這是因?yàn)長(zhǎng)GTM使用Linux工作程序來(lái)構(gòu)建項(xiàng)目,但XNU只能在Mac上構(gòu)建。即使在Mac上,XNU也非常容易構(gòu)建。
本文內(nèi)容由 曲速未來(lái) (WarpFuture.com) 安全咨詢公司整理編譯,轉(zhuǎn)載請(qǐng)注明。 曲速未來(lái)提供包括主鏈安全、交易所安全、交易所錢(qián)包安全、DAPP開(kāi)發(fā)安全、智能合約開(kāi)發(fā)安全等相關(guān)區(qū)塊鏈安全咨詢服務(wù)。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來(lái)源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來(lái)源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為T(mén)MT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。