偶然看到了一篇這樣的推送,但是感覺作者沒有說清楚,所以自己琢磨了好一會兒才弄懂,現在寫來說說自己的通俗理解,meltdown(熔斷)原理和這個類似,網上有很多的詳解,大家可以去看我們知道,cpu的速度提公升發展非常快,而且又發展出多核的cpu技術,但是從記憶體中讀取指令的速度遠遠小於cpu的執行指令速度,為了提高cpu執行指令的速度,在cpu的內部加上了快取,來存放記憶體中某一塊有很大概率在下次要被執行指令,快取也分為一級(l1)、二級快取(l2)(cpu每個核都有)、**快取(l3)(多核共享)。
如果在一段程式中有這樣一段**
int judge =
114514
;void
foo(
int x)
}int
main()
foo(
11451444);
//此時傳入的11451444大於了judge
}
judge被放在了記憶體中,每次foo()函式被呼叫執行的時候,都要從記憶體中拿到judge的值和x進行比較,但是從記憶體中拿到judge的值的過程是很慢的,但是主函式中調取了foo()函式100次,每次都比judge小,所以cpu會對foo()函式的if分支進行**優化,在下次呼叫foo()函式時,cpu**傳入的x比judge小,先把要執行的**做了,並把資料放到快取中,等到取到judge的時候再把x和judge做判斷,如果x確實比judge小,那麼cpu就會從快取中把之前等待取judge時候存好的資料直接拿出來,如果x比judge大,cpu就會丟棄當前的狀態,重新恢復到執行if分支前的狀態,但是放在快取中的資料不會刪除!!!
參考上面github上spectre的源**
// 首先定義了乙個secret資料
char
*secret =
"the secret data"
;// array1_size放在記憶體中
unsigned
int array1_size =16;
uint8_t array1[
160]=;
uint8_t array2[
256*
512]
;void
victim_function
(size_t x)
其實array1初始化的資料我們不用管,這裡我們用到了乙個原理,如果讓:
size_t x =
(size_t)
(secret -
(char
*)array1)
;
那麼x就是array1位址和secret位址之間的差值,畫乙個圖理解一下:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-fcgchspa-1589872108577)(c:\users\asus\desktop\1.jpg)]
那麼x = 0x546789 - 0x123456 = 0x333333,那麼這時候通過陣列array1去訪問secret首位址中的值就可以這樣
value_type val = array1[x]
;// 那麼val的值就是array1的首位址加上偏移量0x333333(也就是0x456789)出的資料
// 當然,這樣訪問超出了陣列array1的大小
// 正常的**cpu會報異常越界訪問並停止,但是通過**分支的快取機制可以做到這一點!
size_t visit =
0x555555
- array1;
// 呼叫victim_function
victim_function((
int)visit)
;
獲取核心位址0x555555處的值
馬上給Meltdown和Spectre漏洞打補丁
元旦之後的第乙個工作日可謂是驚喜不斷,4號就傳來了 google project zero 等團隊和個人報告的 meltdown 和 spectre 核心漏洞的訊息,首先簡單介紹一下這兩個核心漏洞。meltdown 打破了使用者應用程式和作業系統之間最基本的隔離,這種攻擊允許程式訪問其他程式和作業系...
CPU多級快取
l1 cache是cpu第一級快取,分為資料快取和指令快取.以幫伺服器cpu的l1快取的容量通常在21 4906kb.l2 cache由於l1級快取記憶體容量限制,為了再次提高cpu的運算速度在cpu外部放置已高速儲存器,即二級快取。l3 cache現在都是內建的,而他可以進一步降低記憶體延遲,同時...
CPU 快取學習
1 cpu快取描述 對於密集型應用提高cpu處理速度。核心提公升快取利用 2.理解cpu架構 l3 記憶體是共享,l2 l1 分開資料與指令 cpu獨享 大約時鐘週期l14 l212 l330 記憶體100 我的電腦3.3ghz 1個時鐘週期大約0.33納秒。如果cpu操作的資料或指令都在快取中則直...