1. 程式人生 > >CPU有個禁區,核心許可權也無法進入!

CPU有個禁區,核心許可權也無法進入!

神祕專案

我是CPU一號車間的阿Q,是的,我又來了。

最近一段時間,我幾次下班約隔壁二號車間虎子,他都推脫沒有時間,不過也沒看見他在忙個啥。

前幾天,我又去找他,還是沒看到他人,卻意外地在他桌上發現了一份檔案,開啟一看是一個代號為SGX的神祕專案,還是廠裡領導親自帶頭攻堅。

仔細看了看,原來,自從上次的攻擊事件(詳情:完了!CPU一味求快出事兒了!)發生以來,領導一直憂心忡忡,雖然當時依靠作業系統提供的辦法暫解了燃眉之急,不過治標不治本,我們自身的缺陷一直存在,保不準哪天還要翻車。

這個代號為SGX的神祕專案全稱Software Guard Extensions,志在全面改革,提升咱們CPU的安全能力。

偷聽會議

我瞬間不高興了,這麼重要的專案,居然沒找我參加?

隨即,我來到了領導的辦公室,果然他們幾個在開著祕密會議,而我就湊在一旁偷聽。

“諸位,你們都是咱們廠裡的核心骨幹,關於這次安全能力提升的事情,大家回去之後有沒有什麼想法,請暢所欲言!”,我聽到領導在講話。

核心骨幹?難道我阿Q不是核心骨幹嗎?真是氣抖冷!

沉悶了一小會兒,隔壁二號車間虎子才說到:“咱們現在不是有安全訪問級別嗎,從Ring0到Ring3,已經可以很好到隔絕應用程式的攻擊了啊”

領導搖了搖頭,“儘管如此,但是一些惡意軟體可以利用作業系統的漏洞可以獲取到Ring0的許可權,咱們現有的安全保護就蕩然無存了”

“那也是作業系統的鍋,要改進也該讓他們做啊,關我們什麼事呢?”,虎子繼續說到。

“你忘記前段時間針對咱們CPU發起的攻擊了嗎?”

此話一出,會場瞬間安靜了。就這水平,領導居然請他來不請我!

領導緩了緩,接著說到:“咱們不能總依賴作業系統的安全保護,咱們自己也得拿出點辦法。我覺得現有的安全機制不夠,作業系統漏洞頻出,很容易被攻破,咱們現在不能信任作業系統,得徹底全面的改革!”

這時,五號車間的代表說話了:“領導,我回去調研了一下,瞭解到咱們的競爭對手推出了一個叫TrustZone的技術,用於支援可信計算,號稱提供了一個非常安全的環境專門支援對安全性要求極高的程式執行,像什麼支付啊、指紋認證之類的,咱們要做的話可以參考一下”

聽完TrustZone的介紹,三號車間老哥彷彿找到了靈感,激動的說到:“有了!咱們可以在記憶體中劃出一片特殊的區域,作為最高機密的空間。將高度機密的程式程式碼和資料放在這裡面執行,再引入一種新的工作模式,咱們CPU只有在這種模式下才允許訪問這個安全空間,否則就算是有Ring0的許可權也不能訪問!”

引進一個新的工作模式,這種思路倒是很新鮮,大家紛紛議論開來。

“這個安全空間技術上要怎樣實現呢?”

“執行緒怎麼進入和退出安全空間?惡意程式進去了怎麼辦?”

“怎麼呼叫外部普通空間的函式呢?外部函式被攻擊了怎麼辦?”

“需要系統呼叫怎麼辦?中斷和異常怎麼辦?”

短短一小會兒時間,大家就七嘴八舌提了一堆問題出來···

領導給他們幾個一一分配了任務,下去思考這些問題的解決辦法,過幾天再進行討論。

在他們散會離場前,我匆忙離開了。

主動出擊

這可是個表現的好機會,要是能解決上面的問題,領導說不定能讓我加入這個專案組。

對於安全空間實現問題,既然是從記憶體上劃出來的區域,自然得從記憶體的訪問控制上做文章。我跟咱們廠裡記憶體管理單元MMU的小黑還算有些交情,打算去向他請教一番。

聽完我的需求,小黑不以為意,“就這啊,小事一樁,訪問記憶體時我會進行許可權檢查,到時候除了之前已有的檢查,再加一道檢查就可以:如果發現是要訪問安全空間的頁面,再檢查一下當前的工作模式是否正確”

其他幾個問題我也有了自己的想法,安全空間按照建立-初始化-進入-退出-銷燬的順序進行使用。

建立:通過執行ECREATE指令建立一個安全空間,

初始化:通過執行EINIT指令對剛才建立的安全空間進行初始化

進入 & 退出:通過執行EENTER/EEXIT指令進入和退出安全空間,類似於系統呼叫的SYSENTER/SYSEXIT指令。提前設定好入口地址,進入安全空間後需要從指定的地方開始執行,避免外面的程式亂來。執行這兩條指令的同時CPU進行安全模式的切換。

中斷 & 異常:遇到中斷和異常,需要轉而執行作業系統核心處理程式碼,而作業系統是不能被信任的。需要執行AEX指令退出,將在安全空間執行的上下文儲存起來,以便回頭繼續執行。

系統呼叫:系統呼叫有點麻煩,需要進入作業系統核心空間,因為不能信任作業系統,同樣需要先退出安全空間,執行完系統呼叫再進來。

函式呼叫:安全空間和外部可以互相呼叫函式,普通空間呼叫安全空間函式叫ECALL,安全空間呼叫外部空間函式叫OCALL。呼叫的方式類似作業系統的系統呼叫,不同的是作業系統的函式是核心提供,安全空間的函式是應用程式自己定義的

銷燬:通過執行EREMOVE指令銷燬一個安全空間

我還給這個安全空間取了一個名字,叫:Enclave,自然而然咱們CPU的工作模式就分了Enclave模式和非Enclave模式。

記憶體加密

隨後,我把我的這些想法整理出來,來到了領導辦公室,主動申請加入SGX專案組。

領導顯然對我的到來有些意外,不過看完我準備的材料還是滿意的同意了我的申請,讓我也參與下一次的討論會,真是功夫不負有心人!

很快就到了下一次的會議,我再也不用在門外偷聽了。

會議上我的方案得到了大家的一致認可,只有八號車間的代表不以為然:“安全空間的方案是很好,但是還差一個最重要的東西,要是加上這個,那就完美了!”

“是什麼?”,大家齊刷刷的望向了老八。

“這些形形色色的攻擊方式,最終都是要讀寫記憶體資料,而他們屢屢得手的根本原因在於什麼?”,老八說到。

大家一頭霧水,不知道他想表達什麼。

“老八,你就別賣關子了,快說吧!”

老八站了起來,說到:“其根本原因就在於記憶體中的資料是明文,一旦資料洩漏就可能造成嚴重後果。而如果我們把安全空間的記憶體資料加密了呢?即便我們的防線都失守了,對方拿到的也只是加密後的資料,做不了什麼!”

老八的話如當頭一棒,我怎麼就沒往這個方向考慮。

“加密?那什麼時候解密呢?”,虎子問到。

“問得好,我建議咱們廠裡記憶體管理部門設定一個記憶體加密引擎電路MEE(memory encryption engine),對安全空間的資料進行透明的加解密,資料寫入記憶體時加密,讀入咱們CPU內部時再解密!”

虎子一聽說到:“唉,這個好,建議全面推廣,幹嘛只在安全空間用啊”

老八拍了拍虎子的頭:“說你虎,你還真虎,這玩意對效能影響不可小覷,怎麼能隨便用呢,好鋼要用到刀刃上!”

“好!老八這個建議好。我決定這個專案就由老八來牽頭!”,領導拍案而起。

散會後,虎子笑我忙活半天還是沒有當上牽頭人,我倒是很看得開,能一起參與就不錯了,學到技術才是王道~

彩蛋

SGX專案上馬後,咱們CPU的安全性有了很大的提升,然而我們花了這麼大力氣打造出的這個安全空間真的如鐵桶一般,牢不可破嗎?

預知後事如何,請關注後續精彩······

受限於故事形式,SGX技術的很多實現細節不便展開,感興趣實現原理的朋友參考閱讀下面的文章:

SGX技術的分析和研究:http://www.jos.org.cn/html/2018/9/5594.htm

Intel SGX學習:https://zhuanlan.zhihu.com/p/50894009

Intel 官方文件:https://software.intel.com/sites/default/files/article/413936/hasp-2013-innovative-instructions-and-software-model-for-isolated-execution.pdf

往期TOP5文章

太慢不能忍!CPU又拿硬碟和網絡卡開刀了!

因為一個跨域請求,我差點丟了飯碗

完了!CPU一味求快出事兒了!

雜湊表哪家強?幾大程式語言吵起來了!

一個HTTP資料包的奇幻之旅

 

&n