標籤:

CVE-2016-6187 Exploiting Linux kernel heap off-by-one 利用堆大小差一錯誤爆破Linux內核(中)

CVE-2016-6187 Exploiting Linux kernel heap off-by-one 利用堆大小差一錯誤爆破Linux內核(上)[翻譯]CVE-2016-6187 Exploiting Linux kernel heap off-by-one 利用堆大小差一錯誤爆破Linux內核(上)

Exploitation(漏洞利用)

利用該漏洞的一個優勢是我們能控制目標對象的大小(args對象大小由用戶決定)。為了利用該漏洞,對象大小應該被設置為緩存大小中的一個(如8,16,32,64,96等)。本文不會詳細介紹SLUB分配器如何工作(linux默認內核內存分配器),我們所需要知道的是為了提高效率分配器會預先分配大量相同尺寸的對象。slab是在緩存上包含同樣大小對象主要的頁。自由對象在偏移地址0(默認)處有一個「next free」的指針指向slab的下一個自由對象。

我們的方案是在同樣的一個slab放置我們脆弱的對象(A)鄰近一個自由對象(B),然後清除對象B的「next free」指針的least-significant位元組。當兩個新對象在同樣的slab上被分配,最後的對象將會被分配在靠著「next free」指針的對象A和/或者對象B。

上文情境(重疊A和B對象)是僅僅可能結局之一。目標對象「變化」的值是一個位元組(0-255)並且最終目標對象的位置會依靠在原始的「next free」指針的值和對象大小。

假設目標對象會與對象A和B重疊,我們想要控制這些對象的內容。

在一個高等級,漏洞利用程序如下:

1. n在同樣的slab上在鄰近對象B處放置脆弱對象A

2. n重寫 B中的「next free」指針的least-significant位元組

3. n在同樣的slab分配兩個新對象:第一個對象將會被放在B處,並且第二個對象將會替代我的目標對象C

4. n如果我們控制對象A和B的內容,我們可以強制對象C被分配在用戶空間

5. n假設對象C有一個能從其他地方觸發函數指針,在用戶空間或者可能的一個ROP鏈(繞過SMEP)中設置這個指針為我們的權利提升的payload。

為了執行步驟1-3,連續的對象分配能夠取得使用一個標準的堆耗盡技術。

接下來,我們需要選擇正確的對象的大小。對象比128位元組更大(例如,申請緩存256,512,1024個位元組)的話就不會在這裡起作用。(原因在於我們只能重寫一個位元組,想清楚這點很關鍵)讓我們假設起始的slab地址是0x1000(標記slab的起始地址是與頁大小一致的並且連續對象分配是相連的)。接下來的C程序列出了被給定對象大小的一個單頁的分配:

// page_align.cn#include nnint main(int argc, char **argv) {n int i;n void *page_begin = 0x1000;nn for (i = 0; i < 0x1000; i += atoi(argv[1]))n printf("%pn", page_begin + i);nn}n

查看完整版請移步看雪論壇。

[翻譯]CVE-2016-6187 Exploiting Linux kernel heap off-by-one 利用堆大小差一錯誤爆破Linux內核(中)

推薦閱讀:

iOS6 為什麼這麼多問題?
為什麼 iOS 的虛擬鍵盤使用大寫字母標示?並且不隨輸入狀態變更?
如何看待蘋果手機 12 月 2 日發生的大面積黑屏重啟轉圈故障?

TAG:iOS |