什么是secure boot
secure boot是指確保在一個(gè)平臺(tái)上運(yùn)行的程序的完整性的過程或機(jī)制,。secure boot會(huì)在固件和應(yīng)用程序之間建立一種信任關(guān)系,。在啟用secure boot功能后,未經(jīng)簽名的固件或程序?qū)⒉荒苓\(yùn)行在該設(shè)備上,。
通過這種方式,,可以保護(hù)操作系統(tǒng)免受惡意攻擊,。secure boot一般使用公鑰/私鑰來驗(yàn)證固件和應(yīng)用程序的簽名是否合法。
為什么需要secure boot
嵌入式設(shè)備啟動(dòng)一般從bootrom開始,,逐級加載spl,,uboot,linux,,應(yīng)用程序,。
該流程中由bootrom開始,逐級通過spl,、uboot以啟動(dòng)linux操作系統(tǒng),。
我們假設(shè)spl、uboot和linux鏡像都被保存在flash上,,則在啟動(dòng)時(shí),,各級啟動(dòng)程序都需要從flash中加載下一級啟動(dòng)鏡像,其流程示意圖如下:
如果以上流程未執(zhí)行secure boot,,則flash中的鏡像一旦被惡意攻擊者替換掉,,那么最終系統(tǒng)上將會(huì)運(yùn)行被攻擊者篡改過的固件。
假設(shè)linux和rootfs被替換掉以后,,那么啟動(dòng)后整個(gè)系統(tǒng)都將掌握在攻擊者的手里,。從而導(dǎo)致在操作系統(tǒng)之上構(gòu)建的所有安全機(jī)制都形同虛設(shè)。
secure boot預(yù)備知識
ARMv8分為Secure World和Non-Secure World(Normal World),,四種異常級別從高到低分別為EL3,,EL2,EL1,,EL0,。
EL3具有最高管理權(quán)限,負(fù)責(zé)安全監(jiān)測和Secure World和Normal World之間的切換,。
EL2主要提供了對虛擬化的支持,。
EL1是一個(gè)特權(quán)模式,能夠執(zhí)行一些特權(quán)指令,,用于運(yùn)行各類操作系統(tǒng),,在Secure World則是secure OS(如TEE)。
EL0是無特權(quán)模式,,所有APP應(yīng)用都在EL0,。
啟動(dòng)流程
上圖中的BL1,BL2,,BL31,,BL32,,BL33分別對應(yīng)如下功能:
BL1
BL1是信任鏈的根所在,一般是固化在芯片內(nèi)部的一段代碼,,叫做bootrom,具有最高的執(zhí)行權(quán)限EL3,在 CPU 出廠時(shí)就被寫死了。
bootrom通常會(huì)被映射到它專屬的一塊內(nèi)存地址中,但是如果你嘗試向這塊地址寫入內(nèi)容,,一般都會(huì)出錯(cuò)。
芯片上電或復(fù)位后,,bootrom的代碼會(huì)從固定位置加載BL2來初始化sram,,在BL2 驗(yàn)簽通過后會(huì)跳轉(zhuǎn)到BL2 ,以保證可信任執(zhí)行,。
BL2
BL2和BL1一樣,,也是運(yùn)行在EL3特權(quán)級別的,不同的是BL2在flash中的一段可信安全啟動(dòng)代碼,,它的可信建立在BL1對它的驗(yàn)證,,主要完成一些平臺(tái)相關(guān)的初始化,比如對ddr的初始化等,。
在完成初始化后尋找BL31或者BL33進(jìn)行執(zhí)行,;如果找到了BL31則不會(huì)繼續(xù)調(diào)用BL33,如果沒有BL31則BL33必須有,。
BL31
BL31作為EL3最后的安全堡壘,,它不像BL1和BL2是一次性運(yùn)行的。如它的runtime名字暗示的那樣,,它通過SMC指令為Non-Secure持續(xù)提供設(shè)計(jì)安全的服務(wù),,在Secure World和Non-Secure World之間進(jìn)行切換。它的主要任務(wù)是找到BL32,,驗(yàn)簽,,并運(yùn)行BL32。
BL32
BL32是所謂的secure os,,在ARM平臺(tái)下是 ARM 家的 Trusted Execution Environment(TEE)實(shí)現(xiàn),。OP-TEE 是基于ARM TrustZone硬件架構(gòu)所實(shí)現(xiàn)的軟件Secure OS。
一般在BL32會(huì)運(yùn)行OPTee OS + 安全app,,它是一個(gè)可信安全的OS運(yùn)行在EL1并在EL0啟動(dòng)可信任APP(如指紋信息,移動(dòng)支付的密碼等),,并在Trust OS運(yùn)行完成后通過SMC指令返回BL31,,BL31切換到Non-Seucre World繼續(xù)執(zhí)行BL33。
BL32 在不同的平臺(tái)有不同的實(shí)現(xiàn),,Intel 的叫做 Software Guard Extensions(SGX),,AMD 的叫做 Platform Security Processor(PSP)
BL33
到了BL33這里就是Normal Wrold了,運(yùn)行的都是非安全固件,,也就是我們常見的UEFI firmware或者u-boot,,也可能是直接啟動(dòng)Linux kernel,。
啟動(dòng)BL1,BL2,,BL31,,BL32則是一個(gè)完整的ATF信任鏈建立流程(ARM Trusted Firmware),像常見的PSCI(Power State Coordination Interface)功能則是在ATF的BL31上實(shí)現(xiàn),。
最后一張圖完整展示整個(gè)調(diào)用流程:
消息摘要算法和加密算法
消息摘要算法
消息摘要又稱為數(shù)字摘要,。它是一個(gè)唯一對應(yīng)一個(gè)消息或文本的固定長度的值,它由一個(gè)單向Hash加密函數(shù)對消息進(jìn)行作用而產(chǎn)生,。
如果消息在途中改變了,,則接收者通過對收到消息的新產(chǎn)生的摘要與原摘要比較,就可知道消息是否被改變了,。因此消息摘要保證了消息的完整性,。
消息摘要采用單向Hash函數(shù),將需加密的明文"摘要"成一串固定位數(shù)(如128bit)的密文,,這一串密文亦稱為數(shù)字指紋(Finger Print),,它有固定的長度,且不同的明文摘要成密文,,其結(jié)果總是不同的,,而同樣的明文其摘要必定一致。
這樣這串摘要便可成為驗(yàn)證明文是否是“真身”的“指紋”了,。
消息摘要具有不可逆性,,在消息摘要生成過程中,會(huì)丟失很多原文的信息,,而且無法找回,。一個(gè)好的摘要算法,是極難產(chǎn)生Hash碰撞的,,也就是找到另一段明文經(jīng)計(jì)算后產(chǎn)生相同的摘要,。
常用的消息摘要算法有MD5,SHA,,MAC等,。在secure boot中,一般使用sha128,,sha256,、sha512等算法作為完整性算法。
對于任意長度的消息,,sha256都會(huì)產(chǎn)生一個(gè)256位的哈希值,,稱作消息摘要。這個(gè)摘要相當(dāng)于是個(gè)長度為32個(gè)字節(jié)的數(shù)組,,通常有一個(gè)長度為64的十六進(jìn)制字符串來表示,,其中1個(gè)字節(jié)=8位,,一個(gè)十六進(jìn)制的字符的長度為4位。
來看一個(gè)具體的例子:
TrustChain
這句話經(jīng)過哈希函數(shù)sha256后得到的哈希值為:
3a6fed5fc11392b3ee9f81caf017b48640d7458766a8eb0382899a605b41f2b9
總體上,,sha256與MD4,、MD5以及HSA-1等哈希函數(shù)的操作流程類似,有了消息摘要算法后,,我們就可以通過它驗(yàn)證鏡像的完整性,,從而很容易地就能把被篡改的鏡像給識別出來。
加解密算法-RSA
RSA加密是一種非對稱加密,??梢栽诓恢苯觽鬟f密鑰的情況下,完成解密,。這能夠確保信息的安全性,,避免了直接傳遞密鑰所造成的被破解的風(fēng)險(xiǎn)。
RSA算法是由一對密鑰來進(jìn)行加解密的過程,,分別稱為公鑰和私鑰,。兩者之間有數(shù)學(xué)相關(guān),該加密算法的原理就是對一極大整數(shù)做因數(shù)分解的困難性來保證安全性,。通常個(gè)人保存私鑰,,公鑰是公開的(可能同時(shí)多人持有)。
下面以一個(gè)例子說明RSA簽名的過程,。
戰(zhàn)場上,,B要給A傳遞一條消息,內(nèi)容為某一指令,。
RSA簽名的過程如下:
?。?)A生成一對密鑰(公鑰和私鑰),私鑰不公開,,A自己保留,。公鑰為公開的,任何人可以獲取,。
?。?)A用自己的私鑰對消息加簽,形成簽名,,并將加簽的消息和消息本身一起傳遞給B,。
(3)B收到消息后,,在獲取A的公鑰進(jìn)行驗(yàn)簽,如果驗(yàn)簽出來的內(nèi)容與消息本身一致,,證明消息是A回復(fù)的,。
在這個(gè)過程中,,只有2次傳遞過程,第一次是A傳遞加簽的消息和消息本身給B,,第二次是B獲取A的公鑰,。
即使都被敵方截獲,也沒有危險(xiǎn)性,,因?yàn)橹挥蠥的私鑰才能對消息進(jìn)行簽名,,即使知道了消息內(nèi)容,也無法偽造帶簽名的回復(fù)給B,,防止了消息內(nèi)容的篡改,。
trustzone & ATF & OPTEE
trustzone
TrustZone是ARM針對消費(fèi)電子設(shè)備設(shè)計(jì)的一種硬件架構(gòu),它對ARM的擴(kuò)展,,其實(shí)只是增加了一條指令,一個(gè)配置狀態(tài)位(NS位),以及一個(gè)新的有別于核心態(tài)和用戶態(tài)的安全態(tài),。其目的是為消費(fèi)電子產(chǎn)品構(gòu)建一個(gè)安全框架來抵御各種可能的攻擊。
TrustZone在概念上將SOC的硬件和軟件資源劃分為安全(Secure World)和非安全(Normal World)兩個(gè)世界,,所有需要保密的操作在安全世界執(zhí)行(如指紋識別,、密碼處理、數(shù)據(jù)加解密,、安全認(rèn)證等),,其余操作在非安全世界執(zhí)行(如用戶操作系統(tǒng)、各種應(yīng)用程序等),,安全世界和非安全世界通過一個(gè)名為Monitor Mode的模式進(jìn)行轉(zhuǎn)換,,如圖1:
處理器架構(gòu)上,TrustZone將每個(gè)物理核虛擬為兩個(gè)核,,一個(gè)非安全核(Non-secure Core, NS Core),,運(yùn)行非安全世界的代碼;和另一個(gè)安全核(Secure Core),,運(yùn)行安全世界的代碼,。
兩個(gè)虛擬的核以基于時(shí)間片的方式運(yùn)行,根據(jù)需要實(shí)時(shí)占用物理核,,并通過Monitor Mode在安全世界和非安全世界之間切換,,類似同一CPU下的多應(yīng)用程序環(huán)境。
不同的是多應(yīng)用程序環(huán)境下操作系統(tǒng)實(shí)現(xiàn)的是進(jìn)程間切換,,而Trustzone下的Monitor Mode實(shí)現(xiàn)了同一CPU上兩個(gè)操作系統(tǒng)間的切換,。
OPTEE
OPTEE是一個(gè)通常運(yùn)行在 Secure World EL1 權(quán)限中的內(nèi)核程序,比較常見的是基于開源的 ARM Trusted Firmware 進(jìn)行擴(kuò)展修改的,,別的實(shí)現(xiàn)還有基于 Little Kernel 的,,以及一些芯片廠家自己的實(shí)現(xiàn)。
它的主要作用是給 Secure World 中運(yùn)行的程序提供一個(gè)基本的系統(tǒng)內(nèi)核,實(shí)現(xiàn)多任務(wù)調(diào)度,、虛擬內(nèi)存管理,、System Call 回調(diào)、硬件驅(qū)動(dòng),、IPC 通訊等等,。
ATF
TF(Trusted Firmware)是ARM在Armv8引入的安全解決方案,為安全提供了整體解決方案,。它包括啟動(dòng)和運(yùn)行過程中的特權(quán)級劃分,,對Armv7中的TrustZone(TZ)進(jìn)行了提高,補(bǔ)充了啟動(dòng)過程信任鏈的傳導(dǎo),,細(xì)化了運(yùn)行過程的特權(quán)級區(qū)間,。
TF實(shí)際有兩種Profile,對ARM Profile A的CPU應(yīng)用TF-A,,對ARM Profile M的CPU應(yīng)用TF-M,。我們一般接觸的都是TF-A,又因?yàn)檫@個(gè)概念是ARM提出的,,有時(shí)候也縮寫做ATF(ARM Trusted Firmware),。
ATF帶來最大的變化是信任鏈的建立(Trust Chain),整個(gè)啟動(dòng)過程包括從EL3到EL0的信任關(guān)系的打通,。
ATF的啟動(dòng)流程包括5個(gè)單獨(dú)的啟動(dòng)階段,,在不同的異常級別運(yùn)行,如下表所示,。
TrustZone,,ATF,OPTEE 這三者有什么關(guān)系呢,?
TrustZone是一種架構(gòu),,支持ATF的硬件。ATF是軟件,,包含bl2 + bl31 + bl32 + bl33,,bl32=optee-os,bl33=u-boot,。
secure boot啟動(dòng)流程
信任鏈的構(gòu)建
由于操作系統(tǒng)啟動(dòng)時(shí)可能需要多級啟動(dòng)鏡像,,而只要其中任意一級鏡像未執(zhí)行secure boot流程,則其后的所有鏡像實(shí)際上都是不可信的,。典型的例子如下:
以上例子中bootrom驗(yàn)證了spl鏡像,,若spl未驗(yàn)證uboot鏡像,則一旦uboot鏡像被替換以后,,那么攻擊者就可以控制后面所有的啟動(dòng)流程,。如被替換的uboot可以從其它位置加載非法的linux鏡像,而在該linux鏡像中任意植入后門等。
因此,,secure boot需要建立安全啟動(dòng)的信任鏈,,在啟動(dòng)流程中,每一級鏡像都由其前級鏡像執(zhí)行合法性驗(yàn)證,。
這樣只要保證第一級鏡像是合法的,那么第二級鏡像的合法性由第一級鏡像保證,,第三級鏡像的合法性由第二級鏡像保證,。從而像鏈條一樣將整個(gè)啟動(dòng)流程的信任鏈連接起來,最終保證整個(gè)系統(tǒng)是可信的,。
由于信任鏈建立流程中,,鏡像合法性是由其前級鏡像驗(yàn)證的,那么第一級鏡像的合法性如何保證呢,?既然無法由前級鏡像為其背書,,那么按照慣例,軟件沒辦法解決的問題自然就需要硬件上馬了,。
我們知道rom是一種只讀存儲(chǔ)器,,它只能被編程一次且內(nèi)容在其后不能被再次更改。因此若在SOC內(nèi)部集成一片ROM,,并在芯片生產(chǎn)時(shí)就將第一級啟動(dòng)鏡像刷到這塊ROM中,,那么也就保證了它是可信的,這也是現(xiàn)代SOC的普遍做法,。一般SOC在出廠時(shí)就已經(jīng)在rom固定區(qū)域中集成了bootrom鏡像,,每次芯片啟動(dòng)時(shí)都會(huì)從bootrom開始執(zhí)行。
鏡像校驗(yàn)方式
下面我們介紹一種常見的鏡像簽名和校驗(yàn)方法,。
使用hash算法計(jì)算鏡像的hash值用私鑰將hash值簽名后,,將簽名的結(jié)果一起打進(jìn)鏡像中,存放在特定位置,。上電后拿到公鑰,,將存儲(chǔ)在鏡像中特定位置的hash解密。將解密的hash值與設(shè)備中當(dāng)前計(jì)算的hash值做對比,,二者一致則校驗(yàn)通過,。
總結(jié)
以上就介紹了secure boot相關(guān)的基本概念和框架,希望大家能對secure boot有更加深刻的理解,。secure boot的具體實(shí)現(xiàn)方案各個(gè)廠家都有所差別,,但原理都是相同的。下一篇文章將介紹一種主流的開源的secure boot的實(shí)現(xiàn)方案,。
更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<
電子技術(shù)應(yīng)用專欄作家 嵌入式與Linux那些事
原文鏈接:https://mp.weixin.qq.com/s/HbM1gI2DqB60DvVwJ7aegg