ARM加密庫
① j-link arm如何加密程序
這個一般要有硬體支持的,比如STM32F103這個晶元,燒到裡面以後,把加密標志位置一,如果有讀取Flash的操作,Flash內容微控制器全部自動擦除
② arm 入門需要具備那些知識
ARM+linux路線,主攻嵌入式Linux操作系統及其上應用軟體開發目標:
(1) 掌握主流嵌入式微處理器的結構與原理(初步定為arm9)
(2) 必須掌握一個嵌入式操作系統 (初步定為uclinux或linux,版本待定)
(3) 必須熟悉嵌入式軟體開發流程並至少做一個嵌入式軟體項目。
方法步驟:
1、基礎知識:
目的:能看懂硬體工作原理,但重點在嵌入式軟體,特別是操作系統級軟體,那將是我的優勢。
科目:數字電路、計算機組成原理、嵌入式微處理器結構。
匯編語言、C/C++、編譯原理、離散數學。
數據結構和演算法、操作系統、軟體工程、網路、資料庫。
方法:雖科目眾多,但都是較簡單的基礎,且大部分已掌握。不一定全學,可根據需要選修。
主攻書籍:the c++ programming language(一直沒時間讀)、數據結構-C2。
2、學習linux:
目的:深入掌握linux系統。
方法:使用linux—〉linxu系統編程開發—〉驅動開發和分析linux內核。先看深,那主講原理。看幾遍後,看情景分析,對照深看,兩本交叉,深是綱,情是目。剖析則是0.11版,適合學習。最後深入代碼。
主攻書籍:linux內核完全剖析、unix環境高級編程、深入理解linux內核、情景分析和源代。
3、學習嵌入式linux:
目的:掌握嵌入式處理器其及系統。
方法:(1)嵌入式微處理器結構與應用:直接arm原理及匯編即可,不要重復x86。
(2)嵌入式操作系統類:ucOS/II簡單,開源,可供入門。而後深入研究uClinux。
(3)必須有塊開發板(arm9以上),有條件可參加培訓(進步快,能認識些朋友)。
主攻書籍:毛德操的《嵌入式系統》及其他arm9手冊與arm匯編指令等。
4、深入學習:
A、數字圖像壓縮技術:主要是應掌握MPEG、mp3等編解碼演算法和技術。
B、通信協議及編程技術:TCP/IP協議、802.11,Bluetooth,GPRS、GSM、CDMA等。
C、網路與信息安全技術:如加密技術,數字證書CA等。
D、DSP技術:Digital Signal Process,DSP處理器通過硬體實現數字信號處理演算法。
注意:要學會舉一反多,有強大的基礎,很多東西簡單看看就能會。想成為合格的程序員,前提是必須熟練至少一種編程語言,並具有良好的邏輯思維。一定要理論結合實踐。
不要一味鑽研技術,雖然擠出時間是很難做到的,但還是要留點餘地去完善其他的愛好,比如宇宙,素描、機械、管理,心理學、游戲、科幻電影。還有一些不願意做但必須要做的!
技術是通過編程編程在編程編出來的。永遠不要夢想一步登天,不要做浮躁的人,不要覺得路途漫上。而是要編程編程在編程,完了在編程,在編程!等機會來了在創業(不要相信有奇跡發生,盲目創業很難成功,即便成功了發展空間也不一定很大)。
嵌入式書籍推薦
Linux基礎
1、《Linux與Unix Shell 編程指南》
C語言基礎
1、《C Primer Plus,5th Edition》【美】Stephen Prata著
2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)著
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux應用程序開發詳解》
Linux內核
1、《深入理解Linux內核》(第三版)
2、《Linux內核源代碼情景分析》毛德操 胡希明著
研發方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP詳解》
3、《Linux內核編程》
4、《Linux設備驅動開發》(LDD)
硬體基礎
1、《ARM體系結構與編程》杜春雷著
2、S3C2410 Datasheet
英語基礎
1、《計算機與通信專業英語》
系統教程
1、《嵌入式系統――體系結構、編程與設計》
2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明著
3、《Building Embedded Linux Systems》
理論基礎
1、《演算法導論》
2、《數據結構(C語言版)》
3、《計算機組織與體系結構?性能分析》
4、《深入理解計算機系統》【美】Randal E. Bryant David O'Hallaron著
5、《操作系統:精髓與設計原理》
6、《編譯原理》
7、《數據通信與計算機網路》
8、《數據壓縮原理與應用》
C語言書籍推薦
1. The C programming language
《C程序設計語言》
2. Pointers on C
《C和指針》
3. C traps and pitfalls
《C陷阱與缺陷》
4. Expert C Lanuage
《專家C編程》
5. Writing Clean Code
-----Microsoft Techiniques for Developing Bug-free C Programs
《編程精粹--Microsoft 編寫優質無錯C程序秘訣》
6. Programming Embedded Systems in C and C++
《嵌入式系統編程》
7.《C語言嵌入式系統編程修煉》
8.《高質量C++/C編程指南》林銳
盡可能多的編碼,要學好C,不能只注重C本身。演算法,架構方式等都很重要。
③ 有沒有支持 linux arm的加密狗市面上性價比較高的加密狗有哪些(較難破解且價格適中)
難破解價格適中,支持linux arm的,可以看看精銳5加密鎖,也可以用晶元直接接到設備上。加密安全技術深思還是可以的。
④ Arm TZ是否有定義內存加密的標准或者介面內存的加密與驗證是在之前提到的memory filter上進行的么
TZ沒有定義加解密的介面,GP TEE internal API有定義加解密的API,可以作為參考。 memory filter是用來劃分Memory的安全屬性用的,例如DDR Controller不支持TrustZone,前面可以加TZC-400,可以把memory劃分成不同region,對不同的region設置不同的安全訪問屬性。
⑤ 嵌入式系統的加密方法有哪些
Virbox Protector ARM 加密工具
功能特點
反調試
拒絕調試器對當前應用的附加操作,防止程序被惡意調試分析
快速完成加密
提供工具和命令行操作,編譯、加殼一體化快速完成
高兼容性
支持ARM32、ARM64、x86及64位多種CPU架構,支持常規的 ARM Linux 操作系統,完美支持Android4.0到最新系統
函數級保護
可對程序進行函數級的保護,實現代碼加密、代碼混淆
整體保護
實現智能壓縮及反調試功能。
安全技術
1 高級混淆加密
通過VirboxProtector,開發者能夠自由選擇保護的函數,對指定函數進行高級混淆,有效防止 IDA 反編譯,極大地增加了動態分析的難度。相比使用基於LLVM編譯器的混淆,Virbox Protector的高級混淆功能以更少的指令達到更強的保護效果,耗電量更小。
2 基於 SMC 技術的代碼加密
可以對指定函數進行代碼片加密,只有程序運行的時候才能解密,破解者無法 Dump 出整體的內存,有效防止逆向工程工具對程序進行靜態分析。
3 智能壓縮
隱藏程序中的代碼和數據,阻止 IDA PRO 等工具的反編譯,並且有效的防止了加殼後的應用體積膨脹。
⑥ arm庫哪裡來不是stm32的
STM32是具體的晶元是處理器,而ARM指的是cpu的內核是處理器核。比如S3C2410處理器是Samsung公司基於ARM公司的ARM920T處理器核,STM32也一樣,是STM使用了arm處理器核。
比如你用S3C2410晶元裸板開發,那麼你就可以用C的官方庫,如果移植了Android那麼你就可以用安卓庫。用了linux就有就可以用Linux官方庫。
⑦ ARM嵌入式系統及原理
ARM+LINUX路線,主攻嵌入式Linux操作系統及其上應用軟體開發目標: (1) 掌握主流嵌入式微處理器的結構與原理(初步定為arm9) (2) 必須掌握一個嵌入式操作系統 (初步定為uclinux或linux,版本待定) (3) 必須熟悉嵌入式軟體開發流程並至少做一個嵌入式軟體項目。 從事嵌入式軟體開發的好處是: (1)目前國內外這方面的人都很稀缺。這一領域入門門檻較高,所以非專業IT人員很難切入這一領域;另一方面,是因為這一領域較新,目前發展太快,大多數人無條件接觸。 (2)與企業計算等應用軟體不同,嵌入式領域人才的工作強度通常低一些(但收入不低)。 (3)哪天若想創業,搞自已的產品,嵌入式不像應用軟體那樣容易被盜版。硬體設計一般都是請其它公司給訂做(這叫「貼牌」:OEM),都是通用的硬體,我們只管設計軟體就變成自己的產品了。 (4)興趣所在,這是最主要的。 從事嵌入式軟體開發的缺點是: (1)入門起點較高,所用到的技術往往都有一定難度,若軟硬體基礎不好,特別是操作系統級軟體功底不深,則可能不適於此行。 (2)這方面的企業數量要遠少於企業計算類企業。 (3)有少數公司經常要碩士以上的人搞嵌入式,主要是基於嵌入式的難度。但大多數公司也並無此要求,只要有經驗即可。 (4)平台依託強,換平台比較辛苦。 興趣的由來: 1、成功觀念不同,不虛度此生,就是我的成功。 2、喜歡思考,挑戰邏輯思維。 3、喜歡C C是一種能發揮思維極限的語言。關於C的精神的一些方面可以被概述成短句如下: 相信程序員。 不要阻止程序員做那些需要去做的。 保持語言短小精幹。 一種方法做一個操作。 使得它運行的夠快,盡管它並不能保證將是可移植的。 4、喜歡底層開發,討厭vb類開發工具(並不是說vb不好)。 5、發展前景好,適合創業,不想自己要死了的時候還是一個工程師。 方法步驟: 1、基礎知識: 目的:能看懂硬體工作原理,但重點在嵌入式軟體,特別是操作系統級軟體,那將是我的優勢。 科目:數字電路、計算機組成原理、嵌入式微處理器結構。 匯編語言、C/C++、編譯原理、離散數學。 數據結構和演算法、操作系統、軟體工程、網路、資料庫。 方法:雖科目眾多,但都是較簡單的基礎,且大部分已掌握。不一定全學,可根據需要選修。 主攻書籍:the c++ programming language(一直沒時間讀)、數據結構-C2。 2、學習linux: 目的:深入掌握linux系統。 方法:使用linux—〉linxu系統編程開發—〉驅動開發和分析linux內核。先看深,那主講原理。看幾遍後,看情景分析,對照深看,兩本交叉,深是綱,情是目。剖析則是0.11版,適合學習。最後深入代碼。 主攻書籍:linux內核完全剖析、unix環境高級編程、深入理解linux內核、情景分析和源代。 3、學習嵌入式linux: 目的:掌握嵌入式處理器其及系統。 方法:(1)嵌入式微處理器結構與應用:直接arm原理及匯編即可,不要重復x86。 (2)嵌入式操作系統類:ucOS/II簡單,開源,可供入門。而後深入研究uClinux。 (3)必須有塊開發板(arm9以上),有條件可參加培訓(進步快,能認識些朋友)。 主攻書籍:毛德操的《嵌入式系統》及其他arm9手冊與arm匯編指令等。 4、深入學習: A、數字圖像壓縮技術:主要是應掌握MPEG、mp3等編解碼演算法和技術。 B、通信協議及編程技術:TCP/IP協議、802.11,Bluetooth,GPRS、GSM、CDMA等。 2010-8-21 16:46 回復 122.90.173.* 2樓C、網路與信息安全技術:如加密技術,數字證書CA等。 D、DSP技術:Digital Signal Process,DSP處理器通過硬體實現數字信號處理演算法。 說明:太多細節未說明,可根據實際情況調整。重點在於1、3,不必完全按照順序作。對於學習c++,理由是c++不只是一種語言,一種工具,她還是一種藝術,一種文化,一種哲學理念、但不是拿來炫耀得東西。對於linux內核,學習編程,讀一些優秀代碼也是有必要的。 注意: 要學會舉一反多,有強大的基礎,很多東西簡單看看就能會。想成為合格的程序員,前提是必須熟練至少一種編程語言,並具有良好的邏輯思維。一定要理論結合實踐。 不要一味鑽研技術,雖然擠出時間是很難做到的,但還是要留點餘地去完善其他的愛好,比如宇宙,素描、機械、管理,心理學、游戲、科幻電影。還有一些不願意做但必須要做的! 技術是通過編程編程在編程編出來的。永遠不要夢想一步登天,不要做浮躁的人,不要覺得路途漫上。而是要編程編程在編程,完了在編程,在編程!等機會來了在創業(不要相信有奇跡發生,盲目創業很難成功,即便成功了發展空間也不一定很大)。 嵌入式書籍推薦 Linux基礎 1、《Linux與Unix Shell 編程指南》 C語言基礎 1、《C Primer Plus,5th Edition》【美】Stephen Prata著 2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)著 3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE) 4、《嵌入式Linux應用程序開發詳解》 Linux內核1、《深入理解Linux內核》(第三版) 2、《Linux內核源代碼情景分析》毛德操 胡希明著 研發方向 1、《UNIX Network Programming》(UNP) 2、《TCP/IP詳解》 3、《Linux內核編程》 4、《Linux設備驅動開發》(LDD) 5、《Linux高級程序設計》 楊宗德著硬體基礎 1、《ARM體系結構與編程》杜春雷著 2、S3C2410 Datasheet 英語基礎 1、《計算機與通信專業英語》 系統教程 1、《嵌入式系統――體系結構、編程與設計》 2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明著 3、《Building Embedded Linux Systems》 4、《嵌入式ARM系統原理與實例開發》 楊宗德著理論基礎 1、《演算法導論》 2、《數據結構(C語言版)》 3、《計算機組織與體系結構?性能分析》 4、《深入理解計算機系統》【美】Randal E. Bryant David O''Hallaron著 5、《操作系統:精髓與設計原理》 6、《編譯原理》 7、《數據通信與計算機網路》 8、《數據壓縮原理與應用》 C語言書籍推薦 1. The C programming language 《C程序設計語言》 2. Pointers on C 《C和指針》 3. C traps and pitfalls 《C陷阱與缺陷》 4. Expert C Lanuage 《專家C編程》 5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs 《編程精粹--Microsoft 編寫優質無錯C程序秘訣》 6. Programming Embedded Systems in C and C++ 《嵌入式系統編程》 7.《C語言嵌入式系統編程修煉》 8.《高質量C++/C編程指南》林銳 盡可能多的編碼,要學好C,不能只注重C本身。演算法,架構方式等都很重要。 這里很多書其實是推薦而已,不必太在意,關鍵還是基礎,才是重中之重!!!
⑧ 基於ARM的嵌入式系統與傳統單片機系統相比性能有哪些明顯優勢
首先,ARM與傳統的單片機一樣,都是用來進行運算、控制、通訊的微處理器,都具有ALU、內部寄存器(通用寄存器、棧指針寄存器、狀態寄存器等)、地址匯流排、數據匯流排、中斷控制器等。所以說,ARM並不是什麼天外來客,在某種程度上來講,ARM也是「普通人」,傳統的單片機也並非「殘疾」。
ARM與傳統單片機的最大不同在於級指令集,傳統的單片機(如51)使用的是復雜指令集(CISC),且不具備指令流水線;ARM使用的是精簡指令集(RISC,正如ARM的全稱Advanced
RISC
Machine),而且使用了至少3級流水線。這使得ARM的製造成本和運行效率相對51有著明顯的優勢。
第三,ARM是32位機,傳統的單片機一般都是8位機。隨著信息量的增加,我們會越來越多的需要處理超過8位以上的數據。以32bit數據的加減法為例,51需要多次處理,而在ARM中只需要1個指令(數據時4Byte對齊的,一般來說都會是對齊的)。
第四,基於ARM內核的晶元種類越來越多,器外圍介面(UART/SPI/IIC/USB/CAN/BUS/LCDC),內部一般都加入了DMA,進一步提升了性能。給用戶提供了很大的選擇空間。
第五,工具和調試。ARM的編譯器相對於傳統單片機,其易用性大大加強,比較流行的編譯工具有IAR,RVCT,ADS,ARM-GCC等。另外,ARM內部集成有JTAG調試介面,可以在線調試,只需要購買於編譯器配套的Trace工具即可(IAR的J-link的,淘寶上好像有70元一個USB介面的;另外還有一種列印口的,更是便宜了)。
第六,軟體資源。基於ARM的開源軟體很多,OS類的有FreeRTOS/Linux/UCOS等。有的廠家還會提供USB/TCPIP協議棧,還有的提供特殊的庫(如觸摸按鍵的庫、加密庫等)。
⑨ arm的trustzone是怎樣保證硬體安全的
Trustzone可以追溯到十多年前,ARMv7公布的時候就有了,可惜一直沒有什麼實際應用。直到近幾年開始,才真正的有廠商開始把這個方案大規模用於晶元里。目前看到的主要有四個應用領域:
第一是無人機晶元,大疆已經走在了最前面,第二名連影子都沒看見。無人機上幾大應用,圖像傳輸,圖像處理,識別,飛控,存儲,每一塊都有安全的訴求。利用Trustzone可以做到,在晶元里流動的數據,每一步都在安全系統的控制之下,哪怕飛機被人搶去,都需要極大的代價才能拿到快閃記憶體以及內存裡面的數據。如果以後上安卓或者其他操作系統,哪怕軟體系統被黑客攻破,數據和控制還是安全的。最後,如果國家或者行業出台政策,要求實施禁飛區,那麼哪怕無人機的主人自己去修改快閃記憶體和軟體,都可以被強制接管。這些功能必須在晶元設計階段就考慮到,大疆在這方面的眼光確實比別人長遠。
第二是DRM,數字版權管理,也就是內容保護。如果國內用戶要在手機上看最新好萊塢大片,那麼播放設備必須經過一個認證,這個認證可以用trustzone來實現。國內已經在積極的推動這個事情,估計再過一段時間就可以實現了。當然,這是一把雙刃劍,肯定也有用戶反而不願買支持DRM的設備,而去看盜版。用了Trustzone本身並不限制盜版,只不過多了一個看好萊塢大片的渠道。
第三是支付。把Trustzone用於支付支付在技術上沒有困難,對晶元性能要求也不高,難的是把各個利益方擺平。銀行和運營商想把支付控制權握在自己手裡,所以會去大力推廣NFC,會去和蘋果合作。而手機支付軟體廠商,比如支付寶和微信,想通過和手機晶元和硬體廠商,把所有功能都自己的平台上實現。目前的支付大多數還是基於軟體和遠端密鑰驗證。如果有人把手機破解,那還是可以讀取到支付圖層的密碼的。而trustzone做的,就是硬體上杜絕這類情況。
第四是物聯網。物聯網的安全有好幾種做法,可以把安全檢測放在伺服器端或者末端晶元上。末端通常是一個MCU加上傳感器和互聯模塊,面積較小。用硬體trustzone實現的話,加解密和密鑰管理等功能會需要額外內模塊,可能比MCU本身都大,成本太高。但如果是附加值高的晶元就沒什麼問題。
讓我們從技術層面來定義Trustzone到底能做什麼:
1、防止操作系統被攻破後關鍵數據泄密,關鍵數據存放在特定內存區域,而那塊區域,只有安全操作系統才有可能讀到。
2、防止通過JTAG等調試介面讀到寄存器,緩存,內存或者快閃記憶體數據。
3、從晶元製造開始,最初的密鑰可以用晶元熔絲實現,往後啟動的每一步都需要最高特權級和密鑰驗證,建立信任鏈,杜絕軟體被替換或者被惡意讀取。
4、防止邊帶攻擊,比如量取內存顆粒的信號猜測數據,製造故障讓檢驗模塊停止工作,替換外圍器件,輸入特定數據確定電磁信號特徵,打開晶元直接量內部信號線等。
上一個典型的ARM SoC內部結構,在這個結構里,Trustzone做的事情是保護數據在晶元內部的安全,不允許非授權的訪問,哪怕這個訪問來自CPU。初看有些復雜,不過我們可以拆開慢慢分析。從硬體角度開始比軟體更清楚些,說不定哪天過認證的時候需要答辯,從頭到尾解釋系統安全設計。
首先,按照Trustzone的劃分,一個晶元內被劃分為安全世界和非安全世界。上圖中,中間黑色的部分是匯流排,匯流排上面是主設備,下面是從設備(主設備中的緩存是例外,這個以後說)。讀寫請求總是從主設備發往從設備的。
作為從設備,區分它是不是屬於安全世界相對簡單。如果一個從設備不存在成塊的空間映射,比如I2C或者PWM,那麼我只要在匯流排訪問它的時候,額外的加入一個管腳(取名為PROT),就可以告訴它本次訪問是不是來自安全世界。如果從設備本身是完全屬於被保護的安全世界,不接受非安全的訪問,那麼只要簡單的拒絕,返回錯誤或者無意義數據即可。同樣,如果從設備本身處於非安全世界,那麼對於安全和非安全訪問,都可以返回正確數據。還有,從設備所處於的世界,是可以動態配置的,且動態配置本身需要處在安全世界,這個以後討論。
對於塊設備,包括快閃記憶體,sram和內存等,它們的某些地址塊需要處於安全世界,其他的處於非安全世界。為了實現這一點,就需要在它們前面插入一個檢驗模塊(例如圖中左方,DDR上面的TZC400),來判斷某個地址是不是能被訪問。當地址被送到這個檢驗模塊,模塊會結合PROT管腳去查表,看看本次訪問是不是被允許,然後做相應措施。表本身和之前的動態配置一樣,必須是在安全世界裡面配置的。
至此,從設備就分析完了,是不是感覺特別簡單?還有些細節,在把主設備也講完後,我們會從系統角度來關注。
對於一般主設備,不考慮自帶的緩存時,其實和從設備也差不多,也分為安全和非安全,可以在安全世界動態配置。配置完成後,這些主設備會按照自己所處的世界,驅動PROT管腳和地址來訪問從設備,得到相應返回。不過這里的一般主設備不包括中斷控制器,系統MMU,調試模塊和處理器,接下來對這些例外模塊進行具體分析。
首先是處理器。
在上圖情況,接了CCI匯流排後,處理器接在緩存一致性埠ACE上(不明白的請參考以前的文章),它的緩存是可以被別人訪問的,並且這個訪問,是從主設備到主設備(當然,在處理器內部是從埠),不會經過匯流排送到內存,也不會經過檢驗模塊TZC400。這時就有個漏洞,通過操縱一個非安全世界的模塊,比如上圖的橙色主設備,假裝去讀一個被安全世界保護的內存地址。這個地址本來存在於內存,被TZC400保護,可是由於匯流排的監聽功能,讀請求有可能被發往處理器緩存,從而繞過保護。
為了防止這種情況,處理器在所有的頁表和緩存都做了特殊設計,加了一個標志位,標志本緩存行是否屬於安全世界。如果別的非安全世界主設備來監聽安全世界緩存行,由於安全位不同,處理器會認為這是兩個不同地址,哪怕它們的地址一致,返回緩存未命中。這樣,就不會把數據泄漏。
有人會問,這個標志位來源於頁表,改了頁表中的這一位不就可以訪問了?其實不行。因為安全世界頁表位於被保護的內存區域或者緩存,就算破解了操作系統也無法訪問。
又有人會說,那改了非安全世界的頁表中安全位,並偽造一個安全世界的地址,豈不是可以讓CPU模擬出一個訪問安全世界的傳輸,送到匯流排和TZC400?TZC400或者對端緩存一看地址和PROT管腳都是符合要求的,應該就會返回保密數據吧?想法是不錯,可是當CPU位於非安全世界時,它會忽略頁表中的安全位,所以不可能發出PROT為安全的傳輸。所以,我們可以對這點放心。
以上是別的主設備訪問處理器,那如果處理器本身處於非安全世界,有沒有可能訪問其他主設備的安全緩存?當然有。所以不要把其他主設備接到ACE埠,以免被監聽,一般主設備是不會做緩存上的安全與非安全區分的。接到ACE-Lite介面無所謂,反正設計上就無法被讀取緩存數據。
除此之外,還存在一個例外,就是GPU。在最新的ARM G71圖形處理器上,是支持雙向硬體一致性的。也就是說,GPU也可以被監聽緩存的。為了簡化設計,圖形處理器被設成永遠處於非安全世界,CPU盡管讀,不在乎,它使用另外一種機制來保護數據,以後介紹。
對處理器緩存熟悉的人可能會想到用跨緩存行的非安全變數來訪問被保護的數據。沒用的,處理器設計者早就想到這點,要不就是非對齊訪問異常(包含exclusive access的時候),要不就不會給你數據,具體到每個處理器有所不同。
還有一個漏洞沒堵上,那就是緩存維護,TLB和分支預測操作。ACE埠包含了DVM操作來維護它們,安全性如何保障?同樣的,地址中也有安全和非安全位。不過話說回來,DVM操作無非就是無效化某些緩存,分支預測和TLB項,不存在安全數據被讀取,TLB被篡改的情況。
到這里可能你會覺得有點暈,不少漏洞需要堵。我們可以回顧一下,需要記住的是各種緩存操作,通過安全標志位保護,避免漏洞。對比處理器設計者所要考慮的情況,這點漏洞不值一提。
杜絕了緩存漏洞後,還有別的隱患,比如模擬器。調試模塊可以被用來訪問各個從設備,也可以訪問和影響處理器內部資源。從設備側的防護很容易,把調試模塊當成一般的主設備處理就行。處理器內部的寄存器,緩存等資源,需要處理器從設計開始,就要為所有資源定義安全級別。被保護的資源對於來自調試模塊的未授權訪問會被禁止。只有通過安全啟動鏈,安全世界的軟體才能打開寄存器SDER,從而允許外部模擬器影響被保護的安全世界資源和處理器運行狀態,訪問被保護的資源。
那處理器內部的資源是怎麼劃分的?以ARMv8舉例,如下圖:
這幅圖相信很多人都看到過。ARMv8的處理器被分成四個特權等級,通常EL0跑用戶態程序,EL1內核,EL2虛擬機。EL0-1分為安全與非安全,EL3隻有安全世界,EL2不區分,兩個世界的切換必須經過EL3。我們談到的處理器內部資源,包括寄存器,緩存,異常,MMU,很多都會分組,組之間看不到或者低級不可訪問高級,從而保證安全。沒有分組的,比如通用寄存器,就需要軟體來維護,防止非安全世界的看到安全世界的數據。
引起安全切換的會有幾種可能:中斷和SMC指令。中斷分為如下幾種情況:
非安全世界下,在EL1或者EL0,當一個非安全中斷來臨,那麼系統沒必要切換安全狀態,作為一般中斷處理,切到EL1即可。
非安全世界下,在EL1或者EL0,當一個安全中斷來臨,那麼系統必須先切到EL3,不然就沒法做安全世界切換。
安全世界下,在EL1或者EL0,當一個安全中斷來臨,沒必要做安全世界切換,作為一般中斷處理,切到EL1即可。
安全世界下,在EL1或者EL0,當一個非安全中斷來臨,那麼系統必須先切到EL3,不然就沒法做安全世界切換。
當跳到EL3的Secure Monitor程序處理上下文切換時,IRQ/FIQ中斷屏蔽位不起作用,哪怕打開了也不會觸發,直到Secure Monitor處理完,向下跳到相應的安全世界EL1時,才會讓原來的中斷屏蔽恢復,從而觸發中斷。此時處理中斷的是安全世界的中斷程序,處於被保護的內存區域,杜絕非安全世界的程序篡改。
那怎樣觸發安全與非安全中斷呢?這在中斷控制器里有定義,早年的定義中只有FIQ可以作為安全中斷,後期的可配置,並且,相應的安全世界配置寄存器只有在處理器的安全世界中才可以訪問。
SMC指令和中斷觸發類似,只不過軟體就可以觸發,切換到Secure Monitor。這里,非安全軟體可以提出觸發請求,在通用寄存器填入參數,卻無法控制安全世界的處理程序做什麼,也依然看不到被保護內存數據。所以防止數據泄密的任務就靠安全操作系統了。
至此,安全啟動後的基本硬體防護已經完成,但如果你以為這就是Trustzone,那就錯了,精彩的在後面。
我們可以把Trustzone放到實際應用裡面看看是不是可行。以DRM舉例,如下圖:
在播放授權 視頻的時候,視頻流來自網路或者快閃記憶體,它們不需要在安全世界,因為數據本身就是加密過的。然後被解密並放到被保護內存,等待解碼。上圖中,密碼保護和解密是通過安全硬體模塊Crypto來完成的,這個我們以後再分析,先處理解密完成後的視頻流。此時有兩種方案:
第一中,非常自然的,可以把所有的過程在安全世界完成,那麼圖形處理器,視頻處理器和顯示模塊必須都工作在安全世界,能訪問安全世界的數據,才能完成工作。可這樣就帶來一個問題,那就是驅動。我們知道,圖形處理器的驅動是非常復雜的,並且手機上只存在Linux和windows下的圖形驅動,和OpenGL ES/DirectX配合。
而安全世界的操作系統(TEE,Trusted Execution Environment)是完全不兼容的安全系統,甚至有的都不支持SMP, 完全不存在可能性把圖形驅動移植上去,也沒有任何意義。這樣的話,就只能把圖形處理器從流程中挖掉,只留下相對簡單也不需要生態的視頻和顯示模塊的驅動,工作在安全世界,而GPU的輸出送到顯示模塊,由顯示模塊進行混合。
這是一種可行的方案,也確實有公司這么做。但是從長遠看,圖形處理器總是會參與到這個過程的,別的不說,只說VR和AR流行以後,要是虛擬個顯示屏出來,上面播放視頻,然後放在一個虛擬出的房間,那他們之間肯定是要進行互動的,此時顯示模塊就需要把視頻圖層送回GPU進行運算。如果GPU不在安全世界,那就會造成泄密。
為了解決上述問題,有了第二種解決方案,稱作TZMP1(Trustzone Media Protection 1),引入了保護世界的概念。
保護世界工作於非安全世界,這樣才能兼容圖形驅動。那安全怎麼辦?它需要添加四根管腳NSAID,類似於安全世界的PROT信號,只不過做了更細的劃分,使得GPU/視頻/顯示模塊要訪問被保護內存時,預先定義好了許可權。而這個許可權的設置,也是通過前文的TZC400來實現的,在安全啟動鏈中就完成。CPU的許可權通常是0,也就是最低。而顯示控制器許可權是只讀。
這樣一來,我們之前的老問題,惡意緩存監聽,又回來了。在新的A73和G71加CCI500/550匯流排系統里,可以支持雙向硬體一致性。這意味著GPU也能被監聽。這下大家都在非安全世界,緩存里的安全位不起作用,怎麼解決?這需要匯流排的配合。
ARM的匯流排CCI500/550,有一個保護模式,打開後,不光支持上文的NSAID管腳,還可以在監聽的時候,把監聽傳輸替換成緩存行無效化命令,直接讓目標把相應緩存行無效化。這樣一來,數據還是需要從內存讀取,保證安全。並且這個過程對軟體透明,無需做任何改動。
可是此時,辛辛苦苦設計的硬體一致性就完全起不到加速作用了,性能受到影響。好在運行OpenGL ES的時候,GPU是不會發出共享傳輸的,CPU也不會沒事去監聽GPU的數據。而下一代的圖形介面Vulkan,會開始使用GPU雙向一致性,那時候會有影響。還有一點不利的是,如果同時運行OpenCL和DRM,OpenCL也用不上雙向硬體一致性,必須重啟系統切換到非保護模式才行。
還有,在實際使用中,現有的TZC400作為內存保護模塊,有幾個致命的缺陷。
第一,它的配置只能在啟動時完成,無法動態改變,也就是說,一旦某塊內存給了安全世界,就無法再被非安全世界的操作系統使用,哪怕它是空閑的。在4K視頻播放時,需要分配幾百兆內存,還不止一塊。
如果一直被占著,這對於4GB內存手機來說是個沉重的負擔。怎麼解決?只能改成動態配置。此時,如果內存不夠了,非安全操作系統提請求給安全系統,讓它把暫時不用的物理內存設到非保護內存區,並定個時間收回。不過這樣一來內存分配機制就復雜了,說不定還得改內核,很危險。
如果忽視這點,繼續往下走,還會遇到第二個問題。TZC400和它的改進版最多隻能支持最小顆粒度為2MB的內存塊管理。為什麼不弄細些呢?很簡單,如果設成4KB,和系統頁大小一致,那麼4GB的物理內存就需要一百萬條目來管理。如果做成片上內存,比二級緩存還大,不現實。
而做內存映射,就和MMU一樣了,經過CPU的MMU後,數據訪問還要再穿越一次MMU,延遲顯然大。此外,這一層的MMU無法利用一二級緩存放頁表,效率極低。如果繼續保持2MB的顆粒,那麼在分配內存的時候,很快就會因為塊太大而用完。就算使用了上一節的方法,問題也沒法很好解決。這就是TZMP2V1。
在這種情況下,第三種基於虛擬機的方案就出現了。不過這個方案基本上推翻了Trustzone最初的設計意圖,我們來看下圖:
在這里,作為內存保護的TZC400完全移除,而系統MMU加了進來。內存保護怎麼做?靠物理地址重映射。先看處理器。在啟動鏈中,從EL3向EL2跳的過程時,就定義好保護內存,並且EL2,也就是虛擬機的頁表存放於保護內存,EL1的安全頁也同樣放在保護內存。
這樣,當處理器進入到EL1,哪怕通過篡改EL1非安全頁表的安全位,也最終會被映射到它所不能訪問的安全內存,從而起到保護作用。同樣的,給處於非安全世界的控制器也加上系統MMU,讓設備虛擬化,同樣可以控制安全。這就是TZMP2V2。有了系統MMU,頁表可以做成4KB大小了,也不用擔心CPU那裡穿越兩次MMU。這時候,也不用擔心惡意監聽緩存,因為所有穿過二級MMU的訪問里,安全位都是經過檢驗的的。
但是,不看別的,光是為設備加入這些系統MMU,就會增加很多面積。還有,光加MMU不夠,還要加入系統的三級甚至四級緩存,才能讓MMU效率更高,不然延遲太大。當然,如果設備使用的頁表並不很多,可以對MMU簡化,比如增大最小顆粒度,減少映射范圍,直接使用片內內存。這需要系統設計者來做均衡。對於GPU來說,要支持雙向一致性,還得考慮讓監聽傳輸通過MMU,不然功能就出問題了。
如果使用了TZMP2V2,那麼虛擬化就變成了一個切實需求。然後會發現,ARM的中斷和設備的虛擬化還很不完善。接下來我從硬體角度解釋下虛擬化。
說到虛擬化,先要解釋系統MMU。
如上圖所示,系統MMU其實很簡單,就是個二層地址轉換。第一層,虛地址到實地址,第二層,實地址到物理地址。請注意,沒有第二層轉換時,實地址等同於物理地址。這個模塊既可以兩層都打開,也可以只開一層,看情況而定。
上圖比較清楚的顯示了一層映射的過程。其中,設備發出的虛地址請求,會先經過TLB,它裡面存了以前訪問過的頁表項,如果有,就直接返回,沒有就往下走到第二步table walk。
第二步里,MMU會按照預設的多級基址寄存器,一級級訪問到最終頁表。如果MMU位於CPU內,那table walk過程中每次訪問的基址和表項,都可以存放於緩存中,大大提高效率。如果在設備上,只有內建的TLB表項,後面沒有緩存,那未命中TLB的都是訪問DDR,效率自然下降。
所以CPU和GPU等經常訪存的設備,都是自帶第一層MMU和緩存。而對於沒有內部MMU,切換頁表又不是很頻繁的設備,比如DMA控制器,可以在下面掛第一層MMU,此時驅動就簡單了,直接把應用程序看到的虛地址給DMA的寄存器就行,MMU會自己按照基地址去查找相應頁表並翻譯,把實地址送到匯流排。不然,驅動還要自己查找實地址再寫入寄存器。
我們前面說過,在TZMP1和TZMP2v1中,內存保護是靠TZC400來完成的。而到了TZMP2v2,取消了TZC400,這時靠虛擬化的二層地址映射。
二層映射的過程和一層映射基本一樣,不再詳述,但是性能問題會被放大。假設在一層中,經過四級基址查到最終頁,而在二層中,這每一級的基址查找,又會引入新的四級基址訪問。所以至少要經過4x4+4=20次訪存,才能確定物理地址。如果沒有緩存的幫助,效率會非常低。
其他可行的辦法是減少基址級數,比如linux只用了三級頁表,但即使如此,也需要3x3+3=12次查找。在包含緩存的ARM CPU上,虛擬機的效率可以做到80%以上。而二層MMU應用於設備實現設備虛擬化的時候,就需要小心設計了。
有了系統MMU,我們就有了全晶元虛擬化的基礎。那在對系統性能和成本做完平衡,採取合適的系統MMU設計之後,是不是就可以實現虛擬化,並且靠虛擬化實現安全了?沒那麼容易,還有其它問題需要考慮。
虛擬化脫胎於模擬器,就是在一個平台上模擬出另一個平台。在指令集相同的時候,沒有必要翻譯每一條指令,可以讓指令直接被硬體執行,這樣指令的效率算是得到了解決。當然,對於某些特殊指令和寄存器訪問,還是需要hypervisor處理的。接著第二個問題,訪存。
我們前面解釋過,對CPU來說,高效的虛擬化訪存,就是讓指令高效的經過兩層翻譯,而不是每次訪存都需要觸發虛擬機EL2的異常,切到Hypervisor,再得到最終物理地址。這一點在沒有缺頁異常的時候,ARM的虛擬化也已經做到了,而有缺頁異常時還是需要Hypervisor處理。再接著是設備訪存虛擬化,有了系統MMU,也可以高效做到。再就是處理器和設備中斷虛擬化。
最後,設備的虛擬化需要管理,那設備本身需要支持虛擬設備號和虛擬中斷號。更多內容請期待。