新款iPhone SE開售前夕,iOS被曝存在八年的0day漏洞 |
來(lái)源:聚銘網(wǎng)絡(luò) 發(fā)布時(shí)間:2020-04-24 瀏覽次數(shù): |
信息來(lái)源:Freebuf
近日,安全研究人員發(fā)現(xiàn)iPhone和iPad自帶的默認(rèn)郵件應(yīng)用程序MobileMail 和Maild存在兩個(gè)正在被在野利用的嚴(yán)重漏洞,而且至少在兩年前就已經(jīng)開始監(jiān)視用戶了。 這兩個(gè)漏洞允許遠(yuǎn)程攻擊者秘密獲取蘋果設(shè)備的控制權(quán),只要向已經(jīng)登錄郵件賬號(hào)的用戶設(shè)備發(fā)送電子郵件即可。這可能會(huì)使超過(guò)5億部iPhone容易受到黑客的攻擊。同時(shí),iPad也存在這一問(wèn)題。
舊金山的一家手機(jī)安全取證公司ZecOps在周三發(fā)布的一份報(bào)告中表示,在2019年末調(diào)查一起客戶網(wǎng)絡(luò)攻擊事件時(shí),發(fā)現(xiàn)了該問(wèn)題。ZecOps創(chuàng)始人Zuk Avraham表示,他發(fā)現(xiàn)證據(jù)顯示,這一漏洞至少在六起網(wǎng)絡(luò)入侵事件中被利用。
Zuk推特聲明 該漏洞是存在于蘋果自帶郵件應(yīng)用程序中的MIME庫(kù)中的遠(yuǎn)程代碼執(zhí)行漏洞,首先是因?yàn)樵浇鐚懭脲e(cuò)誤,其次是堆溢出問(wèn)題。 盡管兩個(gè)電子郵件都是在處理郵件時(shí)觸發(fā)的,但是第二個(gè)漏洞更為嚴(yán)重一些,因?yàn)槠淇梢詫?shí)現(xiàn)“零點(diǎn)擊”利用,無(wú)需任何用戶交互。
報(bào)告中還提及疑似遭受攻擊的目標(biāo):
八年零日漏洞在野利用據(jù)研究員表明,兩個(gè)漏洞存在iPhone 和iPad多個(gè)版本中長(zhǎng)達(dá)8年,可以追溯到iOS6,甚至影響了當(dāng)前的iOS 13.4.1,常規(guī)版本尚且沒(méi)有補(bǔ)丁更新。 更讓人擔(dān)憂的是,多個(gè)攻擊者組織長(zhǎng)期利用這些漏洞(至少在野零日攻擊中利用了2年最早可追溯到2018年1月)。 研究人員說(shuō):“目前公布的攻擊數(shù)據(jù)有限,但是至少有6個(gè)組織或者個(gè)體遭受攻擊,影響力還是很大的。盡管ZecOps沒(méi)有發(fā)現(xiàn)攻擊的幕后黑手,但是我們了解到至少有一個(gè)“雇傭組織”在銷售該漏洞利用,并將電子郵件地址作為唯一標(biāo)識(shí)符。 此外,對(duì)于蘋果用戶本身來(lái)說(shuō)是很難意識(shí)到黑客的入侵的,因?yàn)樗麄冊(cè)讷@取用戶遠(yuǎn)程操控之后,可以立即刪除惡意電子郵件。
除了郵件使用速度的短暫下降以外,用戶沒(méi)法發(fā)現(xiàn)任何的異常行為。成功的漏洞利用是讓黑客在MobileMail 或者M(jìn)aild 應(yīng)用程序中執(zhí)行惡意代碼,并竊取、修改或者刪除郵件。
然而,想要完全操控設(shè)備,黑客還需要一個(gè)助手,即單獨(dú)的內(nèi)核漏洞(比如無(wú)法修補(bǔ)的Checkm8漏洞)。盡管目前研究人員還沒(méi)有發(fā)現(xiàn)黑客使用的惡意軟件細(xì)節(jié),但是郵件的漏洞和內(nèi)核漏洞結(jié)合使用來(lái)監(jiān)控他們的目標(biāo)用戶也不是沒(méi)有可能。 當(dāng)心!目前尚無(wú)可用補(bǔ)丁研究人員在兩個(gè)月前發(fā)現(xiàn)這次的在野利用攻擊,并將其報(bào)告給蘋果安全團(tuán)隊(duì)。 截至發(fā)文,只有iOS13.4.5 beta版本在上周發(fā)布,包含了這兩個(gè)漏洞的安全補(bǔ)丁。
而數(shù)百外的iPhone 和iPad用戶還需等待下一次的軟件安全補(bǔ)丁更新。與此同時(shí),強(qiáng)烈建議蘋果用戶不要使用設(shè)備內(nèi)置的郵件應(yīng)用程序。 漏洞詳情ZecOps發(fā)現(xiàn),在MIME庫(kù)中的執(zhí)行MFMutableData,沒(méi)有對(duì)系統(tǒng)調(diào)用ftruncate()進(jìn)行錯(cuò)誤檢查,這會(huì)導(dǎo)致越界寫入。研究人員找到了一種無(wú)需等待系統(tǒng)調(diào)用ftruncate失敗即可觸發(fā)OOB-Write的方法。此外,他們還發(fā)現(xiàn)可以遠(yuǎn)程觸發(fā)的堆溢出。 事實(shí)上,這兩種漏洞都是遠(yuǎn)程觸發(fā)的。 OOB寫入錯(cuò)誤和堆溢出錯(cuò)誤都是由于相同的問(wèn)題而發(fā)生的:未正確處理系統(tǒng)調(diào)用的返回值。 遠(yuǎn)程錯(cuò)誤可以在處理下載電子郵件時(shí)觸發(fā),在這種情況下,電子郵件將無(wú)法完全下載到設(shè)備上。
事故取證分析用戶經(jīng)歷的部分崩潰(多次崩潰中的一部分)如下。 崩潰指令是stnp x8, x9, [x3],這意味著價(jià)值x8,并x9已寫入x3并墜毀由于訪問(wèn)無(wú)效的地址0x000000013aa1c000,其存儲(chǔ)在x3。 Thread3Crashed: 0 libsystem_platform.dylib 0x000000019e671d88_platform_memmove+88 0x19e671d84 b.ls0x00008da8 0x19e671d88 stnpx8,x9,[x3] 0x19e671d8c stnpx10,x11,[x3, #16] 0x19e671d90 addx3,x3, 0x20 0x19e671d94 ldnpx8,x9,[x1] 1 MIME 0x00000001b034c4d8-[MFMutableData appendBytes:length:]+ 356 2 Message 0x00000001b0b379c8-[MFDAMessageContentConsumer consumeData:length:format:mailMessage:]+ 808
為了找出導(dǎo)致流程崩潰的原因,來(lái)看一下MFMutableData的實(shí)現(xiàn)。 下面的調(diào)用樹取自部分崩潰日志。 -[MFDAMessageContentConsumer consumeData:length:format:mailMessage:] | +-- -[MFMutableData appendData:] | +-- -[MFMutableData appendBytes:length:] | +-- memmove() 通過(guò)分析MIME庫(kù), -[MFMutableData appendBytes:length:] 偽代碼如下:
崩潰發(fā)生之前,已執(zhí)行以下調(diào)用堆棧: -[MFDAMessageContentConsumer consumeData:length:format:mailMessage:] | +-- -[MFMutableData appendData:]| +-- -[MFMutableData appendBytes:length:]| +-- -[MFMutableData setLength:]| +-- -[MFMutableData _flushToDisk:capacity:]| +-- ftruncate() 如果數(shù)據(jù)大小達(dá)到閾值,則使用文件來(lái)存儲(chǔ)實(shí)際數(shù)據(jù),當(dāng)數(shù)據(jù)更改時(shí),應(yīng)相應(yīng)更改映射文件的內(nèi)容和大小。-[MFMutableData _flushToDisk:capacity:]在內(nèi)部調(diào)用系統(tǒng)調(diào)用ftruncate()來(lái)調(diào)整映射文件的大小。 以下是-[MFMutableData _flushToDisk:capacity:] 的偽代碼:
ftruncate詳情主頁(yè): ftruncate() andtruncate() cause thefilenamedbypath,orreferencedbyfildes,tobe truncated (orextended)tolengthbytesinsize.Ifthefilesizeexceedslength,anyextradataisdiscarded.Ifthefilesizeissmallerthanlength, thefileisextendedandfilledwithzerostothe indicatedlength. The ftruncate()formrequires thefiletobeopenforwriting.RETURNVALUESAvalueof0isreturnedifthecallsucceeds.Ifthecallfails a-1isreturned,andtheglobalvariableerrno specifies theerror. 主頁(yè)顯示:“If the call fails a -1 is returned, and the global variable errno specifies the error.”這意味著在某些情況下,此系統(tǒng)調(diào)用將無(wú)法截?cái)辔募⒎祷劐e(cuò)誤代碼。 然而,一旦系統(tǒng)調(diào)用ftruncate失敗,無(wú)論如何_flushToDisk會(huì)繼續(xù)進(jìn)行,這意味著在appendBytes()函數(shù)中映射文件大小沒(méi)有延伸并無(wú)法執(zhí)行達(dá)到memmove(),這導(dǎo)致MMAP文件的OOB寫入。 尋找另一個(gè)觸發(fā)因素崩潰是由于系統(tǒng)調(diào)用ftruncate()失敗引起的,是否意味著除了等待系統(tǒng)調(diào)用失敗之外什么也不能做? 再來(lái)看一下-[MFMutableData _flushToDisk:capacity:]函數(shù)。
在[b]行中所見,檢查flush在調(diào)用ftruncate()之前標(biāo)志是否為true。這意味著,如果可以將flush在第[a]行將標(biāo)志設(shè)置為false ,則ftruncate()根本不會(huì)執(zhí)行。 如果有人在調(diào)用-[MFMutableData appendData:]之前調(diào)用-[MFMutableData setLength:](set flush to 0), ftruncate() won’t be executed due to flush==0),將會(huì)得到類似的結(jié)果。 將此OOB Write與其他漏洞或控制內(nèi)存布局的方法結(jié)合使用,可以遠(yuǎn)程觸發(fā)此漏洞,例如,通過(guò)控制選擇器。
盡管這確實(shí)是一個(gè)應(yīng)修補(bǔ)的漏洞,但我們懷疑它是由攻擊者試圖利用以下漏洞而觸發(fā)的。 第二個(gè)漏洞:MFMutable中的遠(yuǎn)程堆溢出研究人員繼續(xù)調(diào)查可疑的遠(yuǎn)程事件,并確定同一區(qū)域存在另一個(gè)漏洞。 回溯可以如下所示: -[MFDAMessageContentConsumer consumeData:length:format:mailMessage:] | +-- -[MFMutableData appendData:] | +-- -[MFMutableData appendBytes:length:] | +-- -[MFMutableData _mapMutableData] 在分析代碼流時(shí),研究人員確定了以下內(nèi)容:
易受攻擊的函數(shù)的偽代碼如下: 系統(tǒng)調(diào)用mmap失敗時(shí),- [MFMutableData_mapMutableData:]調(diào)用函數(shù)MFMutableData__mapMutableData___block_invoke
偽代碼MFMutableData__mapMutableData___block_invoke如下,它分配了一個(gè)大小為8的堆內(nèi)存,然后用分配內(nèi)存替換data->bytes指針。
執(zhí)行-[MFMutableData _mapMutableData:]完之后,進(jìn)程繼續(xù)執(zhí)行-[MFMutableData appendBytes:length:],將數(shù)據(jù)復(fù)制到分配內(nèi)存時(shí)導(dǎo)致堆溢出。 -[MFMutableDataappendBytes:length:] { int length = [selflength]; //... bytes =self->bytes; if(!bytes){ bytes = [self_mapMutableData];//Might be a data pointer of a size8heap } copy_dst = bytes + length; //... platform_memmove(copy_dst, append_bytes, append_length);//It used append_length to copy the memory, causing an OOB writingina small heap } append_length是來(lái)自流式傳輸?shù)臄?shù)據(jù)塊的長(zhǎng)度。由于這MALLOC_NANO是一個(gè)可預(yù)測(cè)的內(nèi)存區(qū)域,因此可以利用此漏洞。 攻擊者無(wú)需耗盡內(nèi)存的每一個(gè)最后一位就可以使mmap失敗,因?yàn)閙map需要一個(gè)連續(xù)的內(nèi)存區(qū)域。 復(fù)現(xiàn)根據(jù)mmap操作說(shuō)明,在MAP_ANON was specified and insufficient memory was available時(shí)mmap會(huì)失敗。 mmap失敗是正常情況,理想情況下,電子郵件夠大就不可避免地會(huì)發(fā)生。但是,可以使用其他可耗盡資源的技巧來(lái)觸發(fā)漏洞。這些技巧可以通過(guò)多方面,比如RTF和其他格式來(lái)實(shí)現(xiàn)。 可能影響可利用性的另一個(gè)重要因素是硬件規(guī)格:
較舊的設(shè)備具有較小的物理RAM和較小的虛擬內(nèi)存空間,因此不必耗盡RAM的每一位來(lái)觸發(fā)此錯(cuò)誤,當(dāng)無(wú)法在可用虛擬內(nèi)存中找到給定大小的連續(xù)內(nèi)存空間時(shí),mmap將失敗。 目前已經(jīng)確定MacOS不會(huì)同時(shí)受到這兩個(gè)漏洞的攻擊。 在iOS 12中,觸發(fā)漏洞更容易,數(shù)據(jù)流傳輸是在同一過(guò)程中完成的,因?yàn)槟J(rèn)郵件應(yīng)用程序(MobileMail)會(huì)處理更多的資源,從而耗盡了虛擬內(nèi)存空間(尤其是UI)的分配渲染,而在iOS 13中,MobileMail將數(shù)據(jù)流傳遞到后臺(tái)進(jìn)程maild。它把資源集中在解析電子郵件上,從而降低了虛擬內(nèi)存空間意外用完的風(fēng)險(xiǎn)。 遠(yuǎn)程復(fù)現(xiàn)由于MobileMail / maild并未明確設(shè)置電子郵件大小的最大限制,因此可以設(shè)置自定義電子郵件服務(wù)器并發(fā)送具有幾GB純文本的電子郵件。iOS MIME /消息庫(kù)在流傳輸數(shù)據(jù)時(shí)將數(shù)據(jù)平均分成大約0×100000字節(jié),因此完全可以不下載整個(gè)電子郵件。 請(qǐng)注意,這只是如何觸發(fā)此漏洞的一個(gè)示例。攻擊者無(wú)需為了觸發(fā)此漏洞而發(fā)送此類電子郵件,使用多種方式,比如RTF或其他格式等技巧,可以使用標(biāo)準(zhǔn)大小的電子郵件實(shí)現(xiàn)相同的目標(biāo)。 披露時(shí)間表
|