各浏览器抗uaf机制
? ? ?今年中旬,微軟針對(duì)旗下ie瀏覽器中大量出現(xiàn)的uaf漏洞,對(duì)ie瀏覽器的安全機(jī)制進(jìn)行了一個(gè)大幅度的升級(jí),其中主要體現(xiàn)為隔離堆及延遲釋放兩個(gè)機(jī)制,頓時(shí)又將uaf漏洞的利用向上提升了一個(gè)大坎,
但是類似的對(duì)抗uaf的機(jī)制在firefox以及chrome中已有類似的實(shí)現(xiàn),本文就各個(gè)瀏覽器的該機(jī)制做一個(gè)小總結(jié)。
ie
Isolated Heap(隔離堆)
dom樹對(duì)象以及supporting對(duì)象的對(duì)象空間在隔離的堆中被分配,該堆位于默認(rèn)堆的低地址,該堆的句柄保存于一個(gè)全局變量中,對(duì)于該堆的內(nèi)存分配涉及到兩個(gè)函數(shù)
_MemIsolatedAlloc
_MemIsolatedAllocClear
其中分配時(shí)會(huì)通過對(duì)HeapAlloc函數(shù)中標(biāo)記參數(shù)HEAP_ZEAR_MEMORY的設(shè)置,使的新分配的對(duì)象空間清零,但是該機(jī)制只是針對(duì)部分的對(duì)象使用(好在只是部分)。
delay free(延遲釋放)
struct MemoryProtector{
void * BlockArray; //指向一個(gè)結(jié)構(gòu)體數(shù)組,該結(jié)構(gòu)體保存了所有被延遲釋放元素的大小和地址
DWORD TotalSize; //此值就是所有被延遲釋放的對(duì)象的總大小,即閥值。
DWORD NumberOfUsed;
bool Sorted; //標(biāo)記暫時(shí)不知道具體含義
DWORD unknow;
DWORD unKnow;
DWORD StackHighAddress;
DWORD EnableReclaim;
}
具體的實(shí)現(xiàn)函數(shù)
MemoryProtection::CMemoryProtector::ProtectedFree
所謂的延遲釋放就是指瀏覽器中釋放的對(duì)象在釋放時(shí)并不是真正意義上的釋放,該函數(shù)會(huì)將這些無用對(duì)象(首先清零),并將這些無用的對(duì)象連接到st_ProtecFreeManageHeap對(duì)象中,直到所有延遲對(duì)象的
總大小到達(dá)一定閥值是在進(jìn)行處理(此時(shí)依賴于TotalSize的值)。當(dāng)所有的延遲對(duì)象到達(dá)閥值之后也并沒有馬上進(jìn)行釋放操作,而是調(diào)用了一下兩個(gè)函數(shù)
MemoryProtection::CMemoryProtector::MarkBlocks
MemoryProtection::CMemoryProtector::ReclaimUnmarkeBlock
其中在函數(shù)MarkBlocks中會(huì)掃描棧中是否存在對(duì)這些延遲釋放對(duì)象的引用,如果存在則對(duì)該元素進(jìn)行標(biāo)記。
在函數(shù)ReclaimUnmarkeBlock中完成釋放(有標(biāo)記的不釋放)。
firefox
Frame Poisoning機(jī)制
目標(biāo):一些在頁面渲染中常用框架型的對(duì)象
作用:該類對(duì)象在釋放的時(shí)候其內(nèi)存空間會(huì)被chosenpattern(該分配對(duì)象會(huì)被回收至freelist,并優(yōu)先分配給類型相同的對(duì)象,提高了占位難度)
分配的時(shí)候支持三種類型的分配
By object ID
By frame ID
By size
對(duì)象A在空間分配的時(shí)候(此時(shí)會(huì)從freelist中優(yōu)先獲取一個(gè)空閑的內(nèi)存空間)確保該分配的空間來自于一個(gè)與A對(duì)象的類型一致的對(duì)象,當(dāng)freelist中沒有類型一致的空間是才會(huì)創(chuàng)建自動(dòng)創(chuàng)建一段空間返回。
chrome
PartitionAlloc機(jī)制
該機(jī)制管理堆的時(shí)候?qū)?duì)分成四個(gè)類型,依據(jù)申請(qǐng)對(duì)象的類型依次從中分配內(nèi)存空間。
ObjectModelPartition:保存了所有node類的子類,也大致可以理解為就是DOM tree
RenderingPartion:保存了所有渲染樹的對(duì)象
BufferPartition:保存了Web Template Framework的對(duì)象,同時(shí)也包含了一些js的類型,比如arraybuffer和stringlmpl
General Partition
在這四個(gè)分區(qū)中,又依據(jù)分配的對(duì)象的大小再次進(jìn)行了分區(qū),導(dǎo)致攻擊者在站位時(shí)必須選擇與可利用對(duì)象屬于同一分類(并且在同一類型中又要滿足同大小的分配)
其中每個(gè)分區(qū)又依照以下的規(guī)則進(jìn)行劃分,并在其中做了一些手腳。
從小到大,以此包含
bockets< superpages(0x200000)< extents < partition。
bockets 依照請(qǐng)求的大小分配出去
每個(gè)superpages的開始都有一個(gè)guard area的域用于檢測攻擊者的一系列連續(xù)讀寫操作,也就是說哪怕你費(fèi)盡心思的構(gòu)造了可全內(nèi)存都寫的數(shù)組,但是數(shù)組所在的內(nèi)存空間中卻插上了一堆檢測域(guard area)。
superpages
metadata
dataarea(0x1f8000)
guard area(reserves,inaccessible page)
轉(zhuǎn)載于:https://www.cnblogs.com/goabout2/p/4197078.html
總結(jié)
以上是生活随笔為你收集整理的各浏览器抗uaf机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言指针基础
- 下一篇: 常见浏览器兼容性问题与解决方式