今天的文章會探討一個 Heap 的攻擊 — Forging Chunk。這種攻擊方法主要利用了釋放後仍然能夠操作已釋放記憶體的特性,進行惡意修改,最後再透過不當操作將伺機構造的區塊重新分配給程序使用。
在深入探討 Forging Chunk 攻擊時,我們會接觸到兩個關鍵的概念:fd(forward pointer)和 bk(backward pointer)。這兩個指標對於管理釋放區塊非常重要,因為它們決定了 Chunk 如何在記憶體中鏈接起來,並且是攻擊者偽造 Chunk 時的主要目標。
當記憶體區塊被釋放後,它並不會被立即清理掉,而是會被插入到一個 freelist 中。這個 freelist 是一個雙向鏈表,其中每個 Chunk 都有兩個指標:
當一個區塊被釋放時,分配器會將它插入 freelist 中。
在 Forging Chunk 中,攻擊者的目標是通過修改釋放區塊的 fd 和 bk,插入一個偽造的 Chunk,使分配器錯誤地分配這個偽造的 Chunk,進而達到任意程式執行或覆蓋重要資料。這個過程分為兩步:
修改 fd 和 bk
在 Chunk 被釋放後,攻擊者可以通過某些漏洞,訪問並修改該區塊的 fd 和 bk。通常,攻擊者會將 fd 指向一個偽造的 Chunk 地址,而將 bk 設置為對應的鏈接點,這樣分配器就會誤以為這個偽造的 Chunk 是 freelist 中的一部分
再次請求記憶體分配
當程式再一次請求記憶體時,分配器會從 freelist 中挑選適當大小的 Chunk 進行分配。由於 Chunk A 的 fd 已經被修改,分配器會回傳這個偽造的 Chunk位址給程式。