衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

meltdown產(chǎn)生的主要原因是CPU的投機(jī)執(zhí)行

Linux閱碼場(chǎng) ? 來(lái)源:未知 ? 作者:李倩 ? 2018-04-28 09:53 ? 次閱讀

1.meltdown的補(bǔ)丁:KPTI(X86和AARCH64)

meltdown產(chǎn)生的主要原因是CPU的投機(jī)執(zhí)行(speculative execution)。本質(zhì)上是硬件的漏洞,那么我們?nèi)绾螐能浖用孢M(jìn)行修復(fù)呢?

1.meltdown修復(fù)的出發(fā)點(diǎn)

在x86中,每個(gè)進(jìn)程都有一張頁(yè)表,此頁(yè)表覆蓋內(nèi)核空間+用戶(hù)空間地址,在用戶(hù)態(tài)執(zhí)行時(shí),頁(yè)表中也有內(nèi)核空間的地址映射,所以才使得用戶(hù)空間非法訪問(wèn)內(nèi)核空間地址的代碼被投機(jī)執(zhí)行(之后才收到page fault)。那么,修復(fù)漏洞最簡(jiǎn)單有效的軟件手段就是讓CPU運(yùn)行在用戶(hù)態(tài)的時(shí)候,頁(yè)表不覆蓋內(nèi)核空間地址。

所以,為了修復(fù)漏洞,添加一張頁(yè)表,使用戶(hù)態(tài)一張頁(yè)表,內(nèi)核態(tài)一張頁(yè)表,每次從用戶(hù)態(tài)切換到內(nèi)核態(tài)時(shí)也切換頁(yè)表。但在用戶(hù)態(tài)運(yùn)行時(shí)完全不覆蓋內(nèi)核地址也不可行,因?yàn)榘l(fā)生中斷、系統(tǒng)調(diào)用和異常時(shí),需要切入和換出內(nèi)核空間,切入和換出接口的地址是內(nèi)核空間的。所以,用戶(hù)態(tài)的頁(yè)表覆蓋修改為用戶(hù)態(tài)+內(nèi)核態(tài)跳轉(zhuǎn)(trampoline),一旦系統(tǒng)調(diào)用發(fā)生,接口代碼負(fù)責(zé)立即將頁(yè)表切換成完整的覆蓋用戶(hù)態(tài)+內(nèi)核態(tài)的頁(yè)表;從系統(tǒng)調(diào)用中出來(lái)時(shí),再切換回覆蓋用戶(hù)態(tài)+內(nèi)核態(tài)跳轉(zhuǎn)的頁(yè)表。如下圖所示:

可以看出,修復(fù)meldown后,如果應(yīng)用中系統(tǒng)調(diào)用很多,運(yùn)行時(shí)不斷的發(fā)生中斷,每次用戶(hù)態(tài)與內(nèi)核態(tài)切換時(shí)就要完成頁(yè)表的切換,開(kāi)銷(xiāo)會(huì)很大,性能也會(huì)下降。

在AARCH64中,本來(lái)就是兩張頁(yè)表,硬件上存在TTBR0,TTBR1兩個(gè)寄存器,TTBR0中填的頁(yè)表只覆蓋用戶(hù)空間,TTBR1中填的頁(yè)表只覆蓋內(nèi)核空間。但AARCH64仍然存在meltdown的漏洞,因?yàn)門(mén)TBR1仍然是覆蓋整個(gè)內(nèi)核空間的,在用戶(hù)態(tài)切換到內(nèi)核空間時(shí)仍然可以投機(jī)訪問(wèn)到內(nèi)核空間的所有地址。

所以在AARCH64中修復(fù)meltdown漏洞,采取類(lèi)似x86的方法,讓TTBR1中填的頁(yè)表不覆蓋全部的內(nèi)核地址空間,引入第三張頁(yè)表(trampoline),也被TTBR1指向,但此頁(yè)表只指向中斷、系統(tǒng)調(diào)用、異常切入和換出內(nèi)核的代碼,在切換用戶(hù)態(tài)/內(nèi)核態(tài)時(shí)修改TTBR1的指向即可。如下圖所示:保證在user模式(EL0)運(yùn)行時(shí),沒(méi)有一張頁(yè)表可以覆蓋整個(gè)內(nèi)核空間的地址。

2.內(nèi)核與用戶(hù)交界點(diǎn)的安全性問(wèn)題

i.為什么要檢查地址范圍?access_ok?

應(yīng)用程序有無(wú)數(shù)種方法可以偽造一個(gè)指向內(nèi)核態(tài)的指針,所以?xún)?nèi)核在訪問(wèn)用戶(hù)數(shù)據(jù)時(shí)存在一系列安全問(wèn)題。

kernel space在訪問(wèn)user space時(shí),必須判斷user space地址的合法性:

2.為什么要做access_ok

比如,將kernel space的一個(gè)數(shù)據(jù)a存放到user space的地址b(*b =a;),但如果不做access_ok的檢查,是不能確保地址b一定是user space的,這樣就可以通過(guò)用一個(gè)kernel space的地址偽裝成user space地址的方式,將kernel space地址的內(nèi)容修改掉(*k = a)。這樣就有無(wú)數(shù)種方法將Linux Kernel攻陷,如修改代碼邏輯突破root權(quán)限等。

有很多漏洞都是誕生在kernel和user的交界點(diǎn)上,所以在交界點(diǎn)上一定要確保地址的合法性及使用copy_from/to_user。

更多安全漏洞參考:

CVE Details

https://www.cvedetails.com/product/47/Linux-Linux-Kernel

CVE-2017-5123漏洞

https://github.com/nongiach/CVE/tree/master/CVE-2017-5123

ii.copy_from/to_user等API

3.為什么要u_k copy

比如,kernel不能直接操作user space的數(shù)據(jù),而是操作copy_from_user后的kernel space的副本。如果直接操作user space數(shù)據(jù),而user space的程序是多線程的,某個(gè)線程就可以在操作user space數(shù)據(jù)過(guò)程中修改這塊數(shù)據(jù),來(lái)實(shí)現(xiàn)對(duì)內(nèi)核的攻擊。

i.阻止內(nèi)核訪問(wèn)用戶(hù)的PAN和SMAP

最保險(xiǎn)的方法是讓userspace完全不能訪問(wèn)kernel space,但這是不可行的。次安全的方法,比如硬件上提供一個(gè)開(kāi)關(guān),每次在kernel space中訪問(wèn)user space時(shí)打開(kāi),訪問(wèn)后關(guān)閉,即可把kernel space對(duì)user space的訪問(wèn)限制在copy_from/to_user這樣的API中。ARM中的PAN及x86中的SMAP即為實(shí)現(xiàn)此功能的機(jī)制。

3.內(nèi)存碎片避免

什么是碎片?

Internal fragmentation:申請(qǐng)32個(gè)字節(jié),但是buddy要給1頁(yè)-> slab。

External fragmentation : 申請(qǐng)2n連續(xù)頁(yè),但是系統(tǒng)盡管空閑內(nèi)存很多,由于非連續(xù),也無(wú)法滿足。

內(nèi)存連續(xù)的好處:一方面可服務(wù)需要連續(xù)內(nèi)存的申請(qǐng)(如CMA本身就需要連續(xù)內(nèi)存);另一方面,利用MMU支持巨頁(yè)的技術(shù),提高TLB命中率,內(nèi)存訪問(wèn)遍歷Page table的開(kāi)銷(xiāo)被減小。

早期的buddy算法不區(qū)分申請(qǐng)內(nèi)存的類(lèi)型,如下圖紅色頁(yè)面被不可移動(dòng)的頁(yè)申請(qǐng)走,如內(nèi)核中kmalloc申請(qǐng)內(nèi)存。但周?chē)芏囗?yè)都是空閑的,并且紅色的頁(yè)面一直不釋放,導(dǎo)致紅色頁(yè)面和空閑白色頁(yè)面無(wú)法合并到一起。所以,Linux后期采用將不可移動(dòng)的頁(yè)面與可移動(dòng)的頁(yè)面分開(kāi),將空閑的內(nèi)存分為可移動(dòng)(一般為用戶(hù)程序的內(nèi)存),可回收(一般為文件系統(tǒng)的緩存),不可移動(dòng)(一般為kernel的內(nèi)存)。這樣避免了不可移動(dòng)的與可移動(dòng)的頁(yè)面混合在一起,從而使可移動(dòng)的頁(yè)面能夠merge在一起,提供出更大的連續(xù)內(nèi)存。

4.分migration type的意義

如上圖所示,在每個(gè)ZONE的空閑內(nèi)存free list中,分成UNMOVABLE、MOVABLE、RECLAIMABLE類(lèi)型,分別管理,注意此三種類(lèi)型的內(nèi)存一直在動(dòng)態(tài)的變化。比如,Linux剛剛啟動(dòng)時(shí),默認(rèn)情況下內(nèi)存都是可移動(dòng)的,此時(shí)有內(nèi)核模塊調(diào)用kmalloc申請(qǐng)一頁(yè)不可移動(dòng)內(nèi)存,Linux內(nèi)核不會(huì)只從可移動(dòng)內(nèi)存中申請(qǐng)一頁(yè)作為不可移動(dòng)的,而是一次性申請(qǐng)出較大一塊內(nèi)存作為不可移動(dòng)的使用(如210個(gè)頁(yè)面),所以可移動(dòng)的則不再會(huì)被不可移動(dòng)的所污染。如果210個(gè)頁(yè)面不夠用,則再次申請(qǐng)出一塊作為不可移動(dòng)內(nèi)存使用。同時(shí),不可移動(dòng)的內(nèi)存不再使用時(shí)也會(huì)被釋放,釋放掉后仍然可再次作為可移動(dòng)的內(nèi)存(fallback)。

如上圖紅色行所示,比如申請(qǐng)不可移動(dòng)內(nèi)存,但此時(shí)沒(méi)有,則會(huì)先從可回收中去找,可回收中還是找不到則從可移動(dòng)中去找。

CMA比較特殊,如下圖代碼所示,可移動(dòng)的如果申請(qǐng)不到則會(huì)從CMA中去找,如果CMA中也申請(qǐng)不到,則會(huì)從fallback表中尋找內(nèi)存(上圖中綠色行所示)。

(對(duì)應(yīng)第一次課:CMA內(nèi)存在不使用時(shí),會(huì)服務(wù)于可移動(dòng)頁(yè)面的內(nèi)存申請(qǐng)。)

Linux內(nèi)核中“內(nèi)存緊湊技術(shù)”,類(lèi)似于磁盤(pán)碎片整理。當(dāng)申請(qǐng)比較大的連續(xù)內(nèi)存時(shí)或申請(qǐng)巨頁(yè)時(shí),內(nèi)核啟用Memory compaction機(jī)制,如下圖所示:紅色部分為被申請(qǐng)掉的內(nèi)存,白色的部分為空閑內(nèi)存。Memory compaction將前面的紅色部分移動(dòng)到后面的白色部分,使空閑內(nèi)存變連續(xù)。

如下圖所示,在echo 1 > compact_memory后可以看出低階的空閑內(nèi)存變少,而高階的空閑內(nèi)存變多。

總結(jié)

migrate type是anti-fragmentation:申請(qǐng)內(nèi)存時(shí)歸類(lèi),把可移動(dòng)與不可移動(dòng)的分開(kāi),屬于一種預(yù)防技術(shù)。

compaction是de-fragmentation:已經(jīng)發(fā)生碎片,做整理。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10905

    瀏覽量

    213030
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210403
  • 內(nèi)存管理
    +關(guān)注

    關(guān)注

    0

    文章

    168

    瀏覽量

    14190

原文標(biāo)題:郝健: Linux內(nèi)存管理學(xué)習(xí)筆記-第6節(jié)課

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    尖峰電流的形成,產(chǎn)生尖峰電流的主要原因

    尖峰電流的形成產(chǎn)生尖峰電流的主要原因尖峰電流的抑制方法
    發(fā)表于 03-16 11:57

    產(chǎn)生EMI干擾的主要原因是什么?

    產(chǎn)生EMI干擾的主要原因是什么?EMI干擾分為哪幾類(lèi)?
    發(fā)表于 04-25 09:53

    PCB加工電鍍金層發(fā)黑的主要原因是什么?

    PCB加工電鍍金層發(fā)黑的主要原因是什么?
    發(fā)表于 04-26 06:59

    噪聲產(chǎn)生主要原因是什么?如何排除噪聲?

    噪聲產(chǎn)生主要原因是什么?如何排除噪聲?
    發(fā)表于 06-04 06:13

    變換系統(tǒng)中發(fā)生腐蝕的主要原因是什么?

    變換系統(tǒng)中發(fā)生腐蝕的主要原因是什么?氨合成反應(yīng)分為哪幾種反應(yīng)?
    發(fā)表于 07-22 07:11

    電子設(shè)備誤動(dòng)作的主要原因是什么

    什么是諧波電壓?電子設(shè)備誤動(dòng)作的主要原因是什么?
    發(fā)表于 09-26 07:28

    斬波電路電流能夠連續(xù)的主要原因是什么?

    斬波電路電流能夠連續(xù)的主要原因是什么?
    發(fā)表于 05-11 17:08

    電池膨脹主要原因

    電池膨脹主要原因 不同種類(lèi)的電池,產(chǎn)生膨脹的原因是不一
    發(fā)表于 10-19 14:20 ?5711次閱讀

    電動(dòng)車(chē)電池膨脹主要原因

    電動(dòng)車(chē)電池膨脹主要原因     不同種類(lèi)的電池,產(chǎn)生膨脹的原因是不一樣的,針對(duì)
    發(fā)表于 11-11 09:27 ?7446次閱讀

    LED為什么會(huì)產(chǎn)生熱量?LED發(fā)熱的幾個(gè)主要原因是什么?

    LED為什么會(huì)產(chǎn)生熱量?LED發(fā)熱的幾個(gè)主要原因是什么? 與傳統(tǒng)光源一樣,半導(dǎo)體發(fā)光二極體(LED)在工作期間也會(huì)產(chǎn)生熱量,其多少
    發(fā)表于 11-13 10:01 ?3325次閱讀

    產(chǎn)生Congestion的主要原因

    Congestion也分為幾種情況,和前端密切相關(guān)的是Logic Congestion(更多關(guān)于后端Congetsion問(wèn)題,查看文末參考文章),主要原因是RTL設(shè)計(jì)問(wèn)題導(dǎo)致,這種問(wèn)題的現(xiàn)象從后端看上去就是Cell數(shù)沒(méi)多少,就是線密。
    的頭像 發(fā)表于 08-18 10:57 ?2100次閱讀

    錫膏焊接后PCBA焊點(diǎn)產(chǎn)生空洞的原因是什么?

    從SMT貼片加工的角度來(lái)看,空洞率是不可避免的。任何廠家也不能說(shuō)自己的貼片焊接焊點(diǎn)沒(méi)有一點(diǎn)空洞。那么空洞是怎么產(chǎn)生的呢?空洞的原因是什么?通過(guò)佳金源錫膏廠家的工程師解釋?zhuān)斩吹?b class='flag-5'>產(chǎn)生主要原因
    的頭像 發(fā)表于 09-25 17:26 ?1428次閱讀
    錫膏焊接后PCBA焊點(diǎn)<b class='flag-5'>產(chǎn)生</b>空洞的<b class='flag-5'>原因是</b>什么?

    放大電路中產(chǎn)生零點(diǎn)漂移的主要原因是什么

    放大電路中產(chǎn)生零點(diǎn)漂移的主要原因是什么? 放大電路是電子設(shè)備中常用的一種電路,用于放大信號(hào)的幅度。然而,放大電路中常常會(huì)出現(xiàn)零點(diǎn)漂移的問(wèn)題,即輸出信號(hào)在沒(méi)有輸入信號(hào)時(shí)并不為零,而是存在一個(gè)偏移值
    的頭像 發(fā)表于 02-06 15:23 ?3732次閱讀

    焊接質(zhì)量缺陷產(chǎn)生主要原因

    創(chuàng)想焊縫跟蹤小編將與大家一起探討焊接質(zhì)量缺陷產(chǎn)生主要原因。 材料選擇不當(dāng) 焊接質(zhì)量缺陷的主要原因之一是材料選擇不當(dāng)。焊接材料包括焊條、電極、焊絲、焊劑等,如果選擇的焊接材料與基材不匹配,或者焊接材料的質(zhì)量
    的頭像 發(fā)表于 05-15 09:41 ?730次閱讀
    焊接質(zhì)量缺陷<b class='flag-5'>產(chǎn)生</b>的<b class='flag-5'>主要原因</b>

    華納云:企業(yè)遷移到云端的主要原因是什么?

    企業(yè)遷移到云端的主要原因是什么?原因不止一個(gè)。削減成本通常被認(rèn)為是主要原因——但盡管通過(guò)云遷移降低成本無(wú)疑是一種誘人的可能性,但創(chuàng)新潛力才是更大的獎(jiǎng)勵(lì)。云計(jì)算通過(guò)支持企業(yè)創(chuàng)新而產(chǎn)生的價(jià)
    的頭像 發(fā)表于 09-14 17:38 ?332次閱讀
    川宜百家乐分析软件| 大发888 赌博网站大全| 百家乐官网三号的赢法| 百家乐视频计牌器| 最好的棋牌游戏大厅| 先锋百家乐官网的玩法技巧和规则 | bet365娱乐在线| 七匹狼百家乐官网的玩法技巧和规则 | 安卓水果机游戏下载| 缅甸百家乐官网网站是多少| 威尼斯人娱乐城送| 百家乐官网赌场走势图| 新全讯网xb112| 闲和庄百家乐官网娱乐场| 大发888代理充值| 闲和庄百家乐官网娱乐| 水果机游戏下载| 百家乐官网投注开户| 百家乐分享| 百家乐官网要怎么玩啊| 网络百家乐会作假吗| 百家乐官网论坛在线提供| 牌九百家乐的玩法技巧和规则 | 赌博百家乐秘笈| 百家乐官网算号软件| 伯爵百家乐娱乐| 百家乐官网2号说名书| 德州扑克冠军| 博网百家乐现金网| 平塘县| 百家乐电子发牌盒| 百家乐官网只打闲打法| 大发888官网官方下载| 模拟百家乐官网下| 外围赌球网站| 百家乐赌博经历| 澳门百家乐官网实战视频| 大发888真钱赌场娱乐网规则| 百家乐五式缆投法| 百家乐官网玩法窍门| 威尼斯人娱乐城真钱游戏|