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

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

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

樹莓派使用的 ARM1176等內(nèi)核中推測的缺失使我們免于漏洞攻擊

5RJg_mcuworld ? 2018-01-15 11:27 ? 次閱讀

------ 【導(dǎo)讀】------

在一篇恐慌中給你一點(diǎn)安全感。樹莓派,我們不一樣!

過去幾天,對 Meltdown 和 Spectre 安全漏洞的討論甚囂塵上。該漏洞影響了所有的現(xiàn)代英特爾處理器,Spectre 還影響了 AMD 處理器和 ARM 內(nèi)核。Spectre 漏洞使得攻擊者可以繞過軟件檢查讀取當(dāng)前地址空間中的任意位置數(shù)據(jù);Meltdown 漏洞使得攻擊者可以讀取操作系統(tǒng)核地址空間的任意位置數(shù)據(jù)(用戶程序通常不可訪問該數(shù)據(jù))。這兩種漏洞皆通過邊信道攻擊(side-channel attack)利用很多現(xiàn)代處理器都有的性能特征(緩存和推測執(zhí)行)泄漏數(shù)據(jù)。近日,樹莓派創(chuàng)始人 Eben Upton 稱樹莓派不受這些漏洞的影響,并撰文詳解其原因。

谷歌 Project Zero 團(tuán)隊(duì)發(fā)現(xiàn)的漏洞分別被稱為「Meltdown」和「Specter」。這些漏洞允許惡意程序從其它程序的內(nèi)存中竊取信息,這意味著惡意程序可以監(jiān)聽密碼、賬戶信息、密鑰及理論上存儲在進(jìn)程中的任何內(nèi)容。

其中,「Meltdown」影響英特爾處理器,它打破了用戶應(yīng)用程序和操作系統(tǒng)之間最基本的隔離。這種攻擊允許程序訪問其它程序和操作系統(tǒng)的內(nèi)存,這可能導(dǎo)致數(shù)據(jù)泄露。而「Spectre」除了能影響英特爾處理器外,還能影響 AMD 與 ARM 架構(gòu)的大量處理器,這意味著除服務(wù)器與個(gè)人電腦以外,智能手機(jī)等終端設(shè)備也會受到影響,幾乎所有現(xiàn)代計(jì)算機(jī)處理器均無法幸免。它打破了不同應(yīng)用程序之間的隔離,這意味著,攻擊者可以使用惡意程序來獲取被隔離的私有數(shù)據(jù)。

英特爾近日表示,在未來數(shù)周內(nèi)將有軟件補(bǔ)丁發(fā)布。盡管大多數(shù) PC 用戶不會受到影響,但安全補(bǔ)丁會導(dǎo)致處理器 0-30% 的運(yùn)算速度下降。

根據(jù)Eben Upton所述,大量類似樹莓派的廉價(jià)計(jì)算設(shè)備可能同樣也不會受到兩種安全漏洞的影響,包括很多低端安卓手機(jī)

本文介紹現(xiàn)代處理器設(shè)計(jì)的一些概念,使用簡單的 Python 程序解釋這些概念,比如:

t = a+b u = c+d v = e+f w = v+g x = h+i y = j+k

盡管你的計(jì)算機(jī)處理器不會直接執(zhí)行 Python,但這里的語句足夠簡單,大致相當(dāng)于簡單的機(jī)器指令。本文不詳述過多處理器設(shè)計(jì)中的重要細(xì)節(jié)(主要是 pipelining 和寄存器重命名),它們對理解 Spectre 和 Meltdown 的工作原理不太重要。

想全面了解處理器設(shè)計(jì)和現(xiàn)代計(jì)算機(jī)架構(gòu),可參閱 Hennessy 和 Patterson 的經(jīng)典著作《Computer Architecture: A Quantitative Approach》。

什么是標(biāo)量處理器?

最簡單的現(xiàn)代處理器每次循環(huán)執(zhí)行一個(gè)指令,我們稱之為標(biāo)量處理器。上述示例在標(biāo)量處理器上需要執(zhí)行六次循環(huán)。

樹莓派 1 和樹莓派 Zero 中使用的 Intel 486 和 ARM1176 都是標(biāo)量處理器。

什么是超標(biāo)量處理器?

很明顯,加速標(biāo)量處理器的方式就是提高其時(shí)鐘頻率(clock speed)。但是,我們很快就到達(dá)處理器內(nèi)部邏輯門運(yùn)行的極限;因此處理器設(shè)計(jì)人員開始尋找一次性處理多件事情的方式。

有序超標(biāo)量處理器檢查收到的大批指令,嘗試在一個(gè) pipeline 中一次性執(zhí)行多個(gè)指令,這取決于指令之間的依賴關(guān)系。依賴關(guān)系很重要:你或許認(rèn)為雙向超標(biāo)量處理器可以將 6 個(gè)指令配對執(zhí)行,如下所示:

t, u = a+b, c+d v, w = e+f, v+g x, y = h+i, j+k

但是這沒有作用:我們必須先計(jì)算 v 再計(jì)算 w,即第三個(gè)和第四個(gè)指令無法同時(shí)執(zhí)行。雙向超標(biāo)量處理器實(shí)際上無法找到與第三個(gè)指令配對的指令,因此,該示例將執(zhí)行四個(gè)循環(huán):

t, u = a+b, c+d v = e+f # second pipe does nothing here w, x = v+g, h+i y = j+k

超標(biāo)量處理器包括 Intel Pentium 以及樹莓派 2 和樹莓派 3 分別使用的 ARM Cortex-A7 和 Cortex-A53。樹莓派 3 的時(shí)鐘頻率只比樹莓派 2 高 33%,但性能大約是后者的 2 倍:部分原因在于 Cortex-A53 超出 Cortex-A7 的對大量指令的配對執(zhí)行能力。

什么是無序處理器(out-of-order processor)?

回到我們的示例,我們可以看到即使 v 和 w 之間存在依賴關(guān)系,我們也可以找到其他獨(dú)立的指令填補(bǔ)第二次循環(huán)中空的 pipe。無序超標(biāo)量處理器能夠打亂指令的順序(同樣受限于指令之間的依賴關(guān)系)以保持每個(gè) pipeline 都處于忙碌狀態(tài)。

無序處理器可以有效交換 w 和 x 的順序:

t = a+b u = c+d v = e+f x = h+i w = v+g y = j+k

允許執(zhí)行三次循環(huán):

t, u = a+b, c+d v, x = e+f, h+i w, y = v+g, j+k

無序處理器包括 Intel Pentium 2(以及大部分后續(xù) Intel 和 AMD x86 處理器,除了一些 Atom 和 Quark 設(shè)備)和很多近期的 ARM 處理器,如 Cortex-A9、-A15、-A17、-A57。

什么是分支預(yù)測器(branch predictor)?

上述示例是直線式代碼塊。真正的程序不是這樣的:他們還包括正向分支(用于實(shí)現(xiàn)條件運(yùn)算,如 if 語句)、反向分支(用于實(shí)現(xiàn) loop)。分支可能是無條件的(通常被采用),也可能是有條件的(是否采用取決于計(jì)算值)。

獲取指令時(shí),處理器可能遇到依賴于計(jì)算值的條件分支(而該值目前尚未計(jì)算出)。為了避免停頓,處理器必須猜測下一個(gè)要獲取的指令:內(nèi)存順序(對應(yīng)未采用分支)或分支目標(biāo)(對應(yīng)采用分支)上的下一個(gè)指令。分支預(yù)測器通過收集某一個(gè)分支之前被采用頻率的相關(guān)統(tǒng)計(jì)數(shù)據(jù),幫助處理器猜測該分支是否被采用。

現(xiàn)在分支預(yù)測器非常復(fù)雜,可以生成非常準(zhǔn)確的預(yù)測。樹莓派 3 的額外性能部分是由于 Cortex-A7 和 Cortex-A53 之間分支預(yù)測的改進(jìn)。但是,攻擊者也可以通過執(zhí)行精心設(shè)計(jì)的一系列分支,誤訓(xùn)練分支預(yù)測器作出較差的預(yù)測。

什么是推測?

重排序順序指令(reordering sequential instruction)是一種恢復(fù)指令級別并行化的強(qiáng)大方法,但是由于處理器變得更寬(能夠一次執(zhí)行三個(gè)或四個(gè)指令),保證所有 pipeline 處于忙碌狀態(tài)變得更難了。因此,現(xiàn)代處理器提高了推測能力。推測執(zhí)行可以處理并不需要的指令:這樣就可以保證 pipeline 處于忙碌狀態(tài),如果最后該指令沒有被執(zhí)行,我們只需要放棄結(jié)果就可以了。

推測執(zhí)行不必要的指令(以及支持推測和重排序的基礎(chǔ)架構(gòu))需要耗費(fèi)大量能源,但是在很多情況下為了獲取單線程性能的提升,這種方法是值得的。分支預(yù)測器用于選擇通過程序最可能的路徑,最大化推測獲得收益的可能性。

為了展示推測的好處,我們可以看一下另一個(gè)示例:

t = a+b u = t+c v = u+d if v: w = e+f x = w+g y = x+h

現(xiàn)在,我們具備從 t 到 u 到 v、從 w 到 x 到 y 的依賴關(guān)系,那么沒有推測的雙向無序處理器無法填充第二個(gè) pipeline。它用三次循環(huán)來計(jì)算 t、u 和 v,之后處理器知道 if 語句的主體是否被執(zhí)行,然后用三次循環(huán)來計(jì)算 w、x 和 y。假設(shè) if(由一個(gè)分支指令實(shí)現(xiàn))使用了一次循環(huán),那么該示例可以執(zhí)行四次(v 是零)或七次循環(huán)(v 不是零)。如果分支預(yù)測器表明 if 語句的主體很可能被執(zhí)行,那么推測可以有效打亂程序,如下:

t = a+b u = t+c v = u+d w_ = e+f x_ = w_+g y_ = x_+h if v: w, x, y = w_, x_, y_

因此現(xiàn)在我們有了額外的指令級別的并行來保持 pipeline 繁忙:

t, w_ = a+b, e+f u, x_ = t+c, w_+g v, y_ = u+d, x_+h if v: w, x, y = w_, x_, y_

循環(huán)計(jì)數(shù)在推測性無序處理器中變得不太明確,但是 w、x 和 y 的分支和條件更新(幾乎)是空閑的,因此上述示例幾近于執(zhí)行三個(gè)循環(huán)。

什么是緩存?

在過去,處理器速度與內(nèi)存訪問速度成正比。我的 BBC Micro(2MHz 6502),可以每 2μs(微秒)執(zhí)行一次指令,存儲周期為 0.25μs。在接下來的 35 年中,處理器已經(jīng)變的非常快,但是內(nèi)存幾乎沒變化:樹莓派 3 中的一個(gè) Cortex-A53 可以每 0.5ns(納秒)執(zhí)行一次指令,但是可能需要 100ns 才能訪問主存。

a = mem[0] b = mem[1]

需要 200ns。

但在實(shí)踐中,程序傾向于以相對可預(yù)測的方式訪問內(nèi)存,同時(shí)展示時(shí)間局部性(如果我訪問一個(gè)定位,我很可能很快再次訪問它)和空間局部性(如果我訪問一個(gè)定位,我很可能很快訪問附近的位置)。緩存利用這些屬性來降低訪問內(nèi)存的平均成本。

緩存是一個(gè)小的片上內(nèi)存,接近于處理器,存儲最近使用的位置(及其近鄰)內(nèi)容的副本,以便在隨后的訪問中可以快速獲取。借助緩存,上述示例的執(zhí)行將稍微超過 100ns:

a = mem[0] # 100ns delay, copies mem[0:15] into cache b = mem[1] # mem[1] is in the cache

從 Spectre 和 Meltdown 的角度來看,最重要的一點(diǎn)是你可以對內(nèi)存訪問的時(shí)間進(jìn)行計(jì)時(shí),你可以知道訪問的地址是在緩存之中(短時(shí))或者不在(長時(shí))。

什么是邊信道?

來自維基百科:

「邊信道攻擊是基于從密碼系統(tǒng)的物理實(shí)現(xiàn)獲得的信息的任何攻擊,而不是算法中的蠻力或理論弱點(diǎn)(相較于密碼分析學(xué))。例如,定時(shí)信息、功耗、電磁泄漏甚至聲音都可以提供額外的信息源,這些信息可被用來破解系統(tǒng)?!?/p>

Spectre 和 Meltdown 屬于邊信道攻擊,通過定時(shí)來觀察緩存中是否有另一個(gè)可訪問的位置,以推斷內(nèi)存位置的內(nèi)容,這些內(nèi)容通常不應(yīng)該被訪問。

把它放在一起:

現(xiàn)在讓我們看看如何結(jié)合推測和緩存以允許類似 Meltdown 的攻擊??紤]下面這個(gè)示例,它是一個(gè)有時(shí)讀取所有非法(內(nèi)核)地址的用戶程序,并導(dǎo)致錯(cuò)誤(崩潰):

t = a+b u = t+c v = u+d if v: w = kern_mem[address] # if we get here, fault x = w&0x100 y = user_mem[x]

現(xiàn)在,假設(shè)我們可以訓(xùn)練分支預(yù)測器,使其相信 v 很可能是非零的,那么我們的無序雙向超標(biāo)量處理器就會混洗程序,像這樣:

t, w_ = a+b, kern_mem[address] u, x_ = t+c, w_&0x100 v, y_ = u+d, user_mem[x_] if v: # fault w, x, y = w_, x_, y_ # we never get here

即使處理器總是推測性地讀取內(nèi)核地址,它必須推遲產(chǎn)生的錯(cuò)誤,直到知道 v 是非零。從表面上看,這是安全的,因?yàn)椋?/p>

v 是零,所以非法讀取的結(jié)果不會被提交給 w

v 是非零,但在讀取結(jié)果被提交給 w 之前發(fā)生了錯(cuò)誤

然而,假設(shè)我們在執(zhí)行代碼之前刷新緩存,并排列 a、b、c、d 以使 v 實(shí)際上為零。現(xiàn)在第三個(gè)循環(huán)中的推測性讀取為:

v, y_ = u+d, user_mem[x_]

其將依賴非法讀取結(jié)果的第八位獲取用戶地址 0x000 或 0x100,并把地址及其近鄰加載進(jìn)緩存。由于 v 是零,推測性指令的結(jié)果將被擯棄,執(zhí)行將繼續(xù)。如果我們隨后訪問其中一個(gè)地址,就可以決定哪個(gè)地址在緩存之中。恭喜:你剛剛從內(nèi)核地址空間讀取了一個(gè)位!

真正的 Meltdown 實(shí)際上要比這更復(fù)雜(特別是,為了避免錯(cuò)誤訓(xùn)練分支預(yù)測器,作者無條件地優(yōu)先執(zhí)行非法讀取,并處理產(chǎn)生的異常),但原理是相同的。Spectre 使用相似方法來顛覆軟件陣列邊界檢查。

結(jié)論

現(xiàn)代處理器竭盡全力保持抽象,從而成為直接訪問內(nèi)存的有序標(biāo)量機(jī)器,而事實(shí)上,使用包括緩存、指令重排序和推測在內(nèi)的大量技術(shù)來提供比簡單處理器更高的性能有望成為現(xiàn)實(shí)。Meltdown 和 Spectre 就是當(dāng)我們在抽象的語境中推理安全性,然后在抽象與現(xiàn)實(shí)之間遇到細(xì)微差別時(shí)會發(fā)生的事情的實(shí)例。

樹莓派使用的 ARM1176、Cortex-A7 和 Cortex-A53 內(nèi)核中推測的缺失使我們免于此類攻擊。

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

    關(guān)注

    68

    文章

    19391

    瀏覽量

    230635
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1379

    瀏覽量

    40353
  • 漏洞
    +關(guān)注

    關(guān)注

    0

    文章

    204

    瀏覽量

    15403

原文標(biāo)題:處理器高危漏洞無人幸免?樹莓派:我們不受影響

文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    CentOS 7 ARM版正式發(fā)布,樹莓2更加豐富

    有哪些新特性和優(yōu)化。不過根據(jù)下載地址里的鏡像名稱,我們可知它支持諸多ARMv7設(shè)備,只是當(dāng)前的預(yù)編譯鏡像只有面向熱門的樹莓2、香蕉、以及CubitTruck單片機(jī)的版本。CentO
    發(fā)表于 01-11 09:48

    基于樹莓2 blacktrack的系統(tǒng)漏洞掃描

    本帖最后由 weizhizhou 于 2017-4-30 00:06 編輯 基于樹莓2 blacktrack的系統(tǒng)漏洞掃描對Linux系統(tǒng)開發(fā)有5年了,近期在blackberry2上移植把玩
    發(fā)表于 04-29 09:59

    各種硬件術(shù)語和漏洞攻擊模式

    翻譯:為什么樹莓不會受到 Spectre 和 Meltdown 攻擊
    發(fā)表于 05-09 13:05

    如何使樹莓與Arduino藍(lán)牙通信?

    樹莓三代自帶藍(lán)牙模塊 如何使樹莓與Arduino藍(lán)牙通信,Arduino采集的數(shù)據(jù)傳送到樹莓
    發(fā)表于 06-05 05:55

    用于緩解高速緩存推測漏洞的固件接口

    CVE-2017-5715,也稱為Spectre Variant 2,是某些ARM CPU設(shè)計(jì)漏洞,允許攻擊者控制受害者執(zhí)行上下文中的推測
    發(fā)表于 08-25 07:36

    推測性處理器漏洞常見問題

    以下信息提供了有關(guān)推測性處理器漏洞的常見問題解答。 你能用通俗易懂的話解釋這個(gè)問題嗎? ·這兩種攻擊都利用了現(xiàn)有的旁路技術(shù),并可能導(dǎo)致通過使用惡意軟件訪問少量數(shù)據(jù)。 ·使用這種方法并在本地運(yùn)行的惡意
    發(fā)表于 08-25 07:15

    如何用樹莓學(xué)習(xí)Linux內(nèi)核源碼?

    怎么用樹莓學(xué)習(xí)Linux內(nèi)核源碼??
    發(fā)表于 10-20 07:09

    樹莓gpio應(yīng)用

    樹莓現(xiàn)在越來越火,網(wǎng)上樹莓的資料也越來越多。樹莓源自英國,國外嵌入式開源領(lǐng)域具有良好的分享
    發(fā)表于 11-09 15:10 ?4219次閱讀

    arm開發(fā)板與樹莓有什么區(qū)別

    使用的處理器的內(nèi)核不同。樹莓使用的是ARM-M9內(nèi)核的處理器,是ARM開發(fā)板的一種。
    發(fā)表于 12-25 10:10 ?5.8w次閱讀

    樹莓與nanopi的對比

    目前市場上正在進(jìn)行一場水果大戰(zhàn),什么樹莓、香橙、香蕉,其開發(fā)者用戶都在爭先恐后的嘗試這些ARM板,然后進(jìn)行比較,事實(shí)上,還有一種Nan
    發(fā)表于 10-30 14:52 ?5.4w次閱讀

    CentOS 7 ARM 版發(fā)布:支持樹莓2/香蕉/CubieTruck

    ARM版正式發(fā)布:支持樹莓2/香蕉/CubieTruck?上周,我們報(bào)道了CentOS 7 build 1511滾動更新的消息,其中帶
    發(fā)表于 04-02 14:41 ?690次閱讀

    樹莓是什么樹莓的簡單介紹

    要想玩轉(zhuǎn)樹莓,首先得知道樹莓是什么。在本節(jié),作者將帶領(lǐng)大家揭開樹莓
    發(fā)表于 05-15 18:09 ?30次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>是什么<b class='flag-5'>樹莓</b><b class='flag-5'>派</b>的簡單介紹

    樹莓arm開發(fā)板的區(qū)別

    樹莓(Raspberry Pi)和ARM開發(fā)板都是基于ARM架構(gòu)的微型計(jì)算機(jī),但它們之間存在一些關(guān)鍵區(qū)別。 一、歷史背景 樹莓
    的頭像 發(fā)表于 08-30 15:36 ?1141次閱讀

    樹莓是x86還是arm

    樹莓(Raspberry Pi)是一款由英國樹莓基金會(Raspberry Pi Foundation)開發(fā)的微型計(jì)算機(jī)。它基于ARM
    的頭像 發(fā)表于 08-30 15:42 ?1260次閱讀

    ARM開發(fā)板與樹莓的比較

    ARM開發(fā)板和樹莓都是基于ARM架構(gòu)的單板計(jì)算機(jī),它們在教育、工業(yè)控制、物聯(lián)網(wǎng)領(lǐng)域有著廣泛的應(yīng)用。 硬件配置
    的頭像 發(fā)表于 11-05 11:11 ?572次閱讀