Apple XNU核心緩衝區溢位預警
報告編號:B6-2018-110101
報告來源:360-CERT
報告作者:360-CERT、360-NirvanTeam
更新日期:2018-11-01
0x00 事件背景
2018-10-31 lgtm團隊的Kevin Backhouse在lgtm blog上釋出了Apple XNU 核心在處理異常ICMP報文時候 觸發的緩衝區溢位的一些細節分析,目前作者已經實現可以在同一區域網內使任意受影響的裝置直接重啟,並提及會在之後直接放出驗證poc。
0x01 影響版本
Apple iOS+11/">iOS 11 及以下: 全裝置
Apple macOS High Sierra, 10.13.6及以下: 全部裝置
Apple macOS Sierra, 10.12.6及以下: 全部裝置
Apple OS X El Capitan 全版本: 全部裝置
0x02 修復建議
Apple iOS 11 及以下 (更新到 iOS 12)
Apple macOS High Sierra, 10.13.6及以下: 全部裝置 (安裝安全更新 2018-001)
Apple macOS Sierra, 10.12.6及以下: 全部裝置 (安裝安全更新 2018-005)
Apple OS X El Capitan 全版本: 全部裝置 (截至目前Apple尚未釋出patch,建議更新至高版本)
0x03 漏洞驗證
傳送資料包之前
傳送資料包之後
0x04 漏洞觸發點
位於公佈XNU原始碼 bsd/netinet/ip_icmp.c:339
m_copydata(n, 0, icmplen, (caddr_t)&icp->icmp_ip);
根據作者描述該程式碼是在函式icmp_error中,該函式的目的是生成錯誤型別的錯誤資料包以響應錯誤的資料包ip,它會遵從ICMP協議傳送一個錯誤的訊息
導致錯誤的資料包的header包含在ICMP訊息中,因此在第339行呼叫m_copydata的目的是將錯誤資料包的header複製到生成ICMP訊息中,但問題在於沒有校驗該header是否會超過被拷貝緩衝區的大小,進而導致緩衝區溢位。
目標緩衝區是一個mbuf。mbuf是一種資料型別,用於儲存傳入和傳出的網路資料包。 在此程式碼中,n是傳入資料包(包含不受信任的資料),m是傳出的ICMP資料包。 我們會看到,icp是指向m的指標。m在第294行或第296行分配:
if (MHLEN > (sizeof(struct ip) + ICMP_MINLEN + icmplen)) m = m_gethdr(M_DONTWAIT, MT_HEADER); /* MAC-OK */else m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
在第314行,mtod用於獲取m的資料指標
icp = mtod(m, struct icmp *);
mtod只是一個巨集,所以這行程式碼不會檢查mbuf是否足以容納icmp結構。 此外,資料不會複製到icp,而是複製到icp-> icmp_ip,它與icp的偏移量為+8位元組。
作者並沒對XNU核心進詳細的除錯 基於作者在原始碼中看到的,作者認為m_gethdr建立了一個可以容納88個位元組的mbuf,對m_getcl不太確定。 根據作者實際實驗,發現當icmplen> = 84時會觸發緩衝區溢位。
總結
從上述作者所提及的,該漏洞要利用起來還很困難。icmp的資料包的構造也並不詳盡。復現尚有難度。360CERT建議大家儘快升級裝置軟體版本,以免遭受漏洞影響。
0x05 時間線
2018-08-09 提交漏洞至apple安全團隊
2018-09-17 iOS 12 釋出. 漏洞被修復.
2018-09-24 macOS Mojave 釋出. 漏洞被修復.
2018-10-30 apple官方釋出漏洞宣告
2018-10-31 lgtm團隊釋出部分細節
2018-11-01 360CERT釋出預警
0x06 參考連結
- CVE-2018-4407" target="_blank" rel="nofollow,noindex">lgtm 官方blog
- Apple 安全更新
宣告:本文來自360CERT,版權歸作者所有。文章內容僅代表作者獨立觀點,不代表安全內參立場,轉載目的在於傳遞更多資訊。如需轉載,請聯絡原作者獲取授權。