今天的文章將介紹一種早期常見的攻擊手法——Unlink Exploit,這是一種利用 Heap 中 fd 和 bk 指標漏洞進行的攻擊技術。
當程式執行 free 釋放記憶體時,釋放的 chunk 會被標記為空閒,並被加入到 bin 中,以便稍後再次分配或合併。當需要從 bin 中移除 chunk 時,會修改 Double-linked list 中的前後指標(fd 和 bk),將相鄰的兩個空閒區塊合併,此為 Unlink 的過程
以一個 chunk P 為例,它的 fd 和 bk 指標分別指向前一個和後一個空閒 chunk。Unlink 的操作如下:
攻擊者可以利用此操作,實現任意記憶體寫入。首先先找到一個可以控制的 chunk,並修改其內部指標。接下來,構造一個偽造的 chunk,並將其 fd 和 bk 指向特定的記憶體位置。
以下為 chunk 在執行 unlink 之前與之後的變化。
釋放前:
chunk1 (fd) -> chunk2 -> next_chunk
| | |
v v v
NULL <-- (bk) <-- (bk) <--
chunk1 和 chunk2 是連接在雙向鏈結中的兩個空閒 chunk。在此鏈結中,chunk1 的 fd 指向 chunk2,而 chunk2 的 bk 則指向 chunk1。
釋放後:
chunk1 -> chunk1 - 3
| |
v v
NULL <-- (bk) <--
在 unlink 執行後,系統會更新 fd 和 bk 指標,使得 chunk2 被移除鏈結,並將 chunk1 的指標更新為 chunk1 - 3。攻擊者可利用此過程修改 heap 中的資料。
為了避免 Unlink 的操作被攻擊,現在都會有基本的防護機制,如下: