0
本文作者: 木子 | 2020-07-03 16:02 |
在疫情防控常態(tài)化的背景之下,為了“停課不停學(xué)”,眾多高校紛紛開(kāi)啟了網(wǎng)課模式。近日,支付寶光年安全實(shí)驗(yàn)室收到清華大學(xué)網(wǎng)絡(luò)與信息安全實(shí)驗(yàn)室(NISL)的邀請(qǐng),為同學(xué)們分享在 macOS 內(nèi)核(XNU)上的攻防實(shí)戰(zhàn)思路和成果。為了讓更多聽(tīng)眾能夠遠(yuǎn)程參與,本次分享以釘釘直播的方式公開(kāi)進(jìn)行。包括實(shí)驗(yàn)室的同學(xué)在內(nèi),一共吸引了兩百多位聽(tīng)眾參與了線上公開(kāi)課交流。
下面帶讀者一起回顧一下這次分享的內(nèi)容
目前主流的操作系統(tǒng)對(duì)應(yīng)用程序區(qū)分對(duì)待,應(yīng)用不同的沙盒配置、用戶組等措施區(qū)分可執(zhí)行代碼的特權(quán)。通常系統(tǒng)代碼執(zhí)行最高權(quán)限就是操作系統(tǒng)內(nèi)核和擴(kuò)展模塊(驅(qū)動(dòng)程序)。惡意程序?yàn)榱双@得盡可能多的能力,例如隱藏自身運(yùn)行痕跡或者讀取機(jī)密信息(如鑰匙串中保存到應(yīng)用程序密碼和 iCloud 訪問(wèn)憑據(jù)等),就要想方設(shè)法從遠(yuǎn)程代碼執(zhí)行作為起點(diǎn),突破沙箱限制和用戶組限制,獲得內(nèi)核代碼執(zhí)行的權(quán)限。此類攻擊方式稱為本地權(quán)限提升(Local Escalation of Privileges)。
在以往公開(kāi)的研究當(dāng)中,無(wú)論是各種黑客破解秀還是學(xué)術(shù)論文,攻防的戰(zhàn)場(chǎng)都相對(duì)集中在內(nèi)存安全上。通過(guò)利用錯(cuò)誤的邊界檢查、對(duì)象生命周期管理等未定義行為,轉(zhuǎn)換成漏洞利用原語(yǔ),改寫(xiě)內(nèi)存中關(guān)鍵結(jié)構(gòu)的內(nèi)容實(shí)現(xiàn)高權(quán)限的任意代碼執(zhí)行。曾有論文《SoK: Eternal War in Memory》將其稱之為“永恒之戰(zhàn)”,可見(jiàn)內(nèi)存安全問(wèn)題當(dāng)下層出不窮和亟待解決的現(xiàn)狀。既然暫時(shí)不能徹底消滅漏洞,就提升攻擊門檻。操作系統(tǒng)引入了多種緩解措施(mitigation)來(lái)提升利用難度,硬件廠商也在指令集層面實(shí)現(xiàn)了控制流保護(hù)、內(nèi)存標(biāo)簽擴(kuò)展等技術(shù)進(jìn)行對(duì)抗。
但操作系統(tǒng)軟件的復(fù)雜度決定了攻擊手段不會(huì)局限在某個(gè)方面。支付寶光年安全實(shí)驗(yàn)室就向蘋(píng)果報(bào)告了 macOS 的多個(gè)邏輯漏洞,避開(kāi)所有的通用內(nèi)存防御,實(shí)現(xiàn) 100% 穩(wěn)定性的權(quán)限提升。在 macOS High Sierra(10.13.6)上從 Safari 瀏覽器的沙箱內(nèi)逃逸,然后獲取 root 權(quán)限,最終讓 XNU 內(nèi)核加載一個(gè)沒(méi)有代碼簽名的內(nèi)核擴(kuò)展,實(shí)現(xiàn)對(duì) macOS 的完全控制。本次公開(kāi)課的內(nèi)容就是詳細(xì)講解了其中攻擊內(nèi)核的部分的技術(shù)細(xì)節(jié)和啟示。
macOS 允許 root 權(quán)限的用戶安裝內(nèi)核驅(qū)動(dòng)程序,但要求驅(qū)動(dòng)程序必須經(jīng)過(guò)蘋(píng)果認(rèn)證簽名,以及在安裝后需要用戶額外確認(rèn)一次(User-Approved Kernel Extension Loading)才會(huì)激活。通過(guò)分析 XNU 的源代碼可以發(fā)現(xiàn),針對(duì)驅(qū)動(dòng)程序的簽名驗(yàn)證還有用戶確認(rèn)的邏輯實(shí)際上都在用戶態(tài)實(shí)現(xiàn)。這些進(jìn)程都必須擁有 XNU 認(rèn)可的“良民證”,即嵌入在代碼簽名中,稱之為 entitlements 的一段 XML 字符串。
只有啟用了com.apple.private.security.
kext-management 特權(quán),并擁有蘋(píng)果簽名的程序才能安裝內(nèi)核驅(qū)動(dòng)。同時(shí)macOS 默認(rèn)配置下啟用了 SIP (System Intergrity Protection),禁止注入代碼到其他進(jìn)程,即使有 root 權(quán)限也不行。系統(tǒng)內(nèi)核認(rèn)為這足以保證攻擊者無(wú)法偽造這種特權(quán),因此來(lái)自用戶態(tài)的請(qǐng)求是可信的,會(huì)直接執(zhí)行提交過(guò)來(lái)的代碼。
我們?cè)谶@種模型上找到了實(shí)現(xiàn)的漏洞。由于內(nèi)核完全信任了特定用戶態(tài)進(jìn)程,因此我們不需要攻擊 XNU 本身,而只需要在用戶態(tài)想辦法注入惡意代碼到對(duì)應(yīng)進(jìn)程,打破信任邊界即可。macOS 自帶了一些命令用于應(yīng)用程序的調(diào)試和采樣,其具有 com.apple.system-task-ports 特權(quán),可以繞過(guò) SIP 訪問(wèn)受限制的系統(tǒng)進(jìn)程。如果被采樣的進(jìn)程是 swift 編寫(xiě)的,為了還原程序上下文堆棧的符號(hào)信息,系統(tǒng)會(huì)在特定的目錄下搜索 swift 相關(guān)的動(dòng)態(tài)鏈接庫(kù)并載入。搜索路徑有四個(gè)備選,優(yōu)先級(jí)最高的路徑受到系統(tǒng)保護(hù)無(wú)法修改。但我們給進(jìn)程強(qiáng)制添加一個(gè) sandbox,禁止其訪問(wèn)系統(tǒng)自帶的合法路徑,就會(huì)強(qiáng)迫其走備選的代碼分支,從環(huán)境變量 DEVELOPER_DIR 控制的目錄中載入任意代碼,造成運(yùn)行庫(kù)劫持。
但這一步又遇到了一個(gè)問(wèn)題。iOS / macOS 為了防御動(dòng)態(tài)庫(kù)劫持,使用了一種名為 Library Validation 的手段,即動(dòng)態(tài)載入運(yùn)行庫(kù)之前會(huì)檢查其代碼簽名是否來(lái)自蘋(píng)果或者同一開(kāi)發(fā)者。我們?cè)谂f的 macOS 系統(tǒng)上找到了對(duì)應(yīng)程序,但是不帶 Library Validation 的版本,成功觸發(fā)這一代碼劫持漏洞。有了用戶態(tài)任意注入代碼的權(quán)限之后,通過(guò)注入代碼到管理內(nèi)核驅(qū)動(dòng)的服務(wù)進(jìn)程,竊取其 com.apple.private.security.
kext-management 特權(quán),成功欺騙 XNU 內(nèi)核執(zhí)行了沒(méi)有任何代碼簽名的模塊。
運(yùn)行任意一個(gè) swift 程序
從舊版本(El Capitan)macOS 系統(tǒng)中復(fù)制一個(gè)沒(méi)有保護(hù)的 symbols 命令
釋放一個(gè)惡意的 libswiftDemangle.dylib 到任意目錄
調(diào)用 sandbox_init_with_parameters 添加沙箱配置,取消當(dāng)前進(jìn)程對(duì)系統(tǒng)自帶 libswiftDemangle.dylib 的訪問(wèn)權(quán)限
設(shè)置當(dāng)前進(jìn)程的 DEVELOPER_DIR 環(huán)境變量,指向惡意的路徑
執(zhí)行 symbols 命令對(duì) swift 程序采樣,觸發(fā)代碼劫持漏洞,載入惡意的動(dòng)態(tài)鏈接庫(kù)
使用這個(gè) symbols 的調(diào)試特權(quán)附加到 kextd 進(jìn)程,注入最后階段的攻擊載荷
使用 kextd 提交驅(qū)動(dòng)程序的特權(quán)向 XNU 內(nèi)核注入無(wú)簽名的擴(kuò)展,實(shí)現(xiàn)用戶態(tài) root 權(quán)限到內(nèi)核任意代碼執(zhí)行
在這個(gè)攻擊鏈條中最重要的突破口實(shí)際上是利用了代碼動(dòng)態(tài)庫(kù)劫持,將惡意代碼注入到合法的進(jìn)程中,從而繞過(guò)基于代碼簽名的信任邊界。蘋(píng)果在 macOS Mojave 之后強(qiáng)制啟用了 Hardened Runtime 機(jī)制,即將 Library Validation 驗(yàn)證機(jī)制的啟用條件從 opt-in 改成了 opt-out,默認(rèn)全部開(kāi)啟。針對(duì)從老版本系統(tǒng)復(fù)制“可信”程序的問(wèn)題,蘋(píng)果在新的 AppleMobileFileIntegrity 驅(qū)動(dòng)中硬編碼了進(jìn)程采樣工具的標(biāo)識(shí)符,即不再信任舊版本的程序。此外針對(duì)任意進(jìn)程調(diào)試,蘋(píng)果引入了一個(gè)新的 com.apple.system-task-ports.safe 特權(quán),以限制舊版程序的能力。目前,此問(wèn)題已經(jīng)得到修復(fù)。
不過(guò)最關(guān)鍵的 XNU 驅(qū)動(dòng)驗(yàn)證上仍然保留了用戶態(tài)驗(yàn)證的策略。同時(shí) kextd 進(jìn)程還加入了 com.apple.security.cs.allow-unsigned-executable-memory 特權(quán),也就是仍然執(zhí)行無(wú)簽名的代碼,給漏洞利用提供了方便。假設(shè) kextd 之后出現(xiàn)進(jìn)程間通信的漏洞,能夠接管控制流,仍有可能通過(guò)用戶態(tài)特殊進(jìn)程的任意代碼執(zhí)行來(lái)攻擊內(nèi)核。
通常攻擊操作系統(tǒng)內(nèi)核,大量的研究和案例大體都是類似的思路,即通過(guò) syscall 或者平臺(tái)特定的內(nèi)核調(diào)用機(jī)制(如 XNU 的 IOKit),觸發(fā)內(nèi)存訪問(wèn)違例,篡改系統(tǒng)內(nèi)核的結(jié)構(gòu)甚至劫持控制流,從而獲得更高的代碼執(zhí)行權(quán)限。與以往的研究相比,這次分享的案例具有鮮明的特點(diǎn):
完全沒(méi)有利用常規(guī)的內(nèi)存安全問(wèn)題,嚴(yán)格意義上甚至沒(méi)有攻擊 XNU 本身,而是濫用了其信任邊界
從舊版本的操作系統(tǒng)中復(fù)制具有合法蘋(píng)果代碼簽名,同時(shí)允許加載第三方代碼的程序,進(jìn)一步突破信任模型
原本作為系統(tǒng)安全防線的沙箱機(jī)制,在特定條件下卻變成了漏洞利用的重要條件,“以子之盾攻子之盾”。
這次線上分享除了這一套原創(chuàng)漏洞和利用之外,還簡(jiǎn)單介紹了 Psychic Paper、以及 phoenhex&qwerty team 在Pwn2Own 2019 所用的內(nèi)核漏洞等來(lái)自其他安全研究員的案例。網(wǎng)絡(luò)安全專業(yè)的同學(xué)在做研究時(shí)通常更喜歡去解決一些普適性的問(wèn)題,有時(shí)會(huì)忽視這種平臺(tái)特性相關(guān)的設(shè)計(jì)缺陷。而在實(shí)戰(zhàn)應(yīng)用中,這種類型的漏洞有時(shí)能以更低的成本實(shí)現(xiàn)攻擊的目的。
支付寶光年安全實(shí)驗(yàn)室
隸屬于支付寶安全實(shí)驗(yàn)室。通過(guò)對(duì)基礎(chǔ)軟件及設(shè)備的安全研究,達(dá)到全球頂尖破解能力,致力于保障螞蟻金服及行業(yè)金融級(jí)基礎(chǔ)設(shè)施安全。因發(fā)現(xiàn)并報(bào)告行業(yè)系統(tǒng)漏洞,數(shù)十次獲得Google、Apple等國(guó)際廠商致謝。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。