您好,登錄后才能下訂單哦!
這篇文章給大家介紹Apple XNU內核緩沖區溢出預警實例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
2018-10-31 lgtm團隊的Kevin Backhouse在lgtm blog上發布了Apple XNU 內核在處理異常ICMP報文時候觸發的緩沖區溢出的一些細節分析,目前作者已經實現可以在同一局域網內使任意受影響的設備直接重啟并提及會在之后直接放出驗證poc.
Apple iOS 11 及以下: 全設備
Apple macOS High Sierra, 10.13.6及以下: 全部設備
Apple macOS Sierra, 10.12.6及以下: 全部設備
Apple OS X El Capitan 全版本: 全部設備
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,建議更新至高版本)
發送數據包之前
發送數據包之后
位于公布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時會觸發緩沖區溢出。
關于Apple XNU內核緩沖區溢出預警實例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。