1. 程式人生 > >曲速未來 披露:由macOS NFS客戶端中的緩衝區溢位引起的核心RCE

曲速未來 披露:由macOS NFS客戶端中的緩衝區溢位引起的核心RCE

區塊鏈安全諮詢公司 曲速未來 訊息:有安全人員在Apple的macOS作業系統核心中發現的幾個堆疊和堆緩衝區溢位。Apple將這些漏洞歸類為核心中的遠端程式碼執行漏洞,因此它們非常嚴重。攻擊者可能會利用它們遠端入侵Mac。或者,通過物理訪問計算機,攻擊者可以作為訪客使用者登入(無需密碼),然後使用這些漏洞提升其許可權並控制計算機。

 

這些漏洞存在於客戶端NFS實現中,用於將網路驅動器(如NAS)安裝到Mac的檔案系統中。

 

嚴重程度和緩解

 

這些漏洞已在Android版本10.13.6中得到修復,Apple於2018年7月9日釋出了該版本。Apple要求安全人員不要透露漏洞,直到另行通知為止。這就是他們所說的:

NFS被廣泛使用,特別是在大型企業中,它用於共享驅動器和聯網的主目錄。但它也用於家庭NAS裝置,通常用作媒體伺服器。在macOS中,安裝NFS共享不需要特殊許可權,因此任何使用者都可以觸發漏洞,甚至是訪客帳戶(不需要密碼)。此外,許多計算機(尤其是企業環境中的計算機)配置為在啟動時自動掛載NFS共享。這意味著這些漏洞至少有兩個攻擊媒介:

  1. 這些漏洞可能被用於在使用NFS檔案管理器的公司中快速傳播病毒。要做到這一點,攻擊者需要在檔案管理器上安裝惡意版本的NFS伺服器軟體,或者找到一種方法將惡意檔案管理器放在網路上並開始攔截某些NFS流量。
  2. 這些漏洞可用於獲取升級的許可權。例如,有人可能以guest使用者身份登入,然後發出單行命令連線到惡意NFS伺服器(可能是Internet上的任何位置),並在計算機上獲得核心級訪問許可權。

 

Apple分配了五個CVE,因為程式碼包含多個類似的錯誤:CVE-2018-4259,CVE-2018-4286,CVE-2018-4287,CVE-2018-4288和CVE-2018-4291。為避免意外洩露任何可能未修復的錯誤,所以只寫關於Apple工作概念驗證漏洞的兩個漏洞。

概念驗證漏洞利用

 

安全人員編寫了一個概念驗證漏洞,它用0覆蓋4096位元組的堆記憶體並導致核心崩潰。還可以改變利用率來發送儘可能多的資料。任何大於128位元組的數字都會觸發堆緩衝區溢位。也完全控制了寫入的位元組值。因此,儘管PoC只破壞了核心,但可以合理地假設可以使用這些緩衝區溢位來實現遠端程式碼執行和本地許可權提升。

漏洞

 

安全人員編寫PoC的兩個漏洞是在這個看似無害的程式碼行中(nfs_vfsops.c:4151):

這行程式碼的目的是fh從nmrepNFS伺服器傳送回Mac的回覆訊息()中讀取檔案控制代碼()。檔案控制代碼是NFS共享上的檔案或目錄的不透明識別符號。NFSv3中的檔案控制代碼最多為64個位元組,NFSv4中的檔案控制代碼最多為128個位元組(搜尋FHSIZE)。fhandle_tXNU中的型別有足夠的空間容納128位元組的檔案控制代碼,但是他們忘記檢查nfsm_chain_get_fh巨集中的緩衝區溢位:

由於巨集的大量使用,這段程式碼很難遵循,但它的作用實際上非常簡單:它從訊息中讀取一個32位無符號整數(FHP)->fh_len,然後直接從訊息中讀取該位元組數(FHP)->fh_data。沒有邊界檢查,因此攻擊者可以使用他們選擇的任何位元組序列覆蓋任意數量的核心堆。被覆蓋的檔案控制代碼的記憶體在nfs_socket.c:1401中分配。

安全人員寫的PoC for的第二個錯誤是nfsm_chain_get_opaque巨集中的整數溢位:

此程式碼使用nfsm_rndup巨集圓LEN高達4的倍數,但它使用的原始值LEN的呼叫bcopy。如果值LEN是0xFFFFFFFF然後加入在nfsm_rndup將溢位和的值rndlen將是0。這意味著與比較(NMC)->nmc_left會成功,bcopy將與被呼叫0xFFFFFFFF作為大小引數。這當然會導致核心崩潰,因此它只能用作拒絕服務攻擊。

使用QL查詢錯誤

 

QL的一大優勢是能夠找到已知錯誤的變種。今年早些時候,就有安全人員在Apple的NFS無盤啟動實現中發現了兩個漏洞,CVE-2018-4136和CVE-2018-4160。該查詢旨在查詢bcopy可能具有使用者控制的大小引數的呼叫,該引數可能為負。一個簡單的變化是查詢bcopy使用者控制源緩衝區的呼叫。這樣的呼叫可能很有趣,因為它們將使用者控制的資料複製到核心空間中。

上面的查詢相當簡單,因為它查詢對bcopy從mbuf核心空間複製資料的任何呼叫。只要正確檢查size引數的邊界,這樣的呼叫就沒有錯。然而事實證明,很大一部分結果是nfsm_chain_get_fh巨集的使用,它不進行任何邊界檢查。因此,儘管此查詢很簡單,但它發現了許多重要的安全漏洞。在其當前形式中,即使修復了錯誤,查詢仍將繼續報告相同的結果。最好改進查詢,以便在有適當的邊界檢查時不會報告結果。

實現邊界檢查的常用方法是這樣的:

還寫了這個謂詞來檢測上面的模式:

它使用Guards庫來查詢在受控制的控制流位置中使用的大小表示式guard。然後它使用globalValueNumber庫來檢查條件本身是否出現相同大小的表示式。該GlobalValueNumbering庫使謂詞能夠檢測非平凡大小表示式的相等性,如下所示:

最後,它使用一個名為的實用程式relOpWithSwapAndNegate來檢查size表示式是否小於限制。它使謂詞也能處理這樣的場景:

有時實現邊界檢查的另一種方式是通過呼叫min,如此謂詞所檢測到的:

然後將這兩個謂詞組合如下:

請注意,習慣lowerBound確保不存在負整數溢位的可能性。唯一剩下要做的就是checkedSize在isSink方法中使用,以減少誤報的數量。這是完成的查詢:

 

總結

 

區塊鏈安全諮詢公司 曲速未來 表示:與大多數其他開源專案不同,XNU無法在LGTM上查詢。這是因為LGTM使用Linux工作程式來構建專案,但XNU只能在Mac上構建。即使在Mac上,XNU也非常容易構建。

 

本文內容由 曲速未來 (WarpFuture.com) 安全諮詢公司整理編譯,轉載請註明。 曲速未來提供包括主鏈安全、交易所安全、交易所錢包安全、DAPP開發安全、智慧合約開發安全等相關區塊鏈安全諮詢服務。