何衛(wèi)國,黃金金,李 軍,李雨勵(lì),饒金濤
(成都三零嘉微電子有限公司,四川 成都 610041)
目前,嵌入式系統(tǒng)中廣泛使用Flash 存儲(chǔ)器存儲(chǔ)系統(tǒng)啟動(dòng)引導(dǎo)文件等重要數(shù)據(jù)[1]。Flash 存儲(chǔ)器具有不易失、功耗低、可靠性好以及容量大等優(yōu)勢,但很容易受到攻擊被竊取敏感信息或被惡意篡改,如冷啟動(dòng)攻擊和側(cè)信道攻擊等,造成系統(tǒng)的安全可靠性降低,關(guān)鍵信息泄露。因此,如何有效應(yīng)對(duì)外部的安全攻擊至關(guān)重要。
在軟件層面,文獻(xiàn)[2]基于JFFS2 設(shè)計(jì)了符合Flash 物理特性的加密文件系統(tǒng),完成數(shù)據(jù)的加密任務(wù)。常用的加密文件系統(tǒng)包括CFS、EFS 等,都工作在Linux 平臺(tái)或Windows 平臺(tái),而不是針對(duì)嵌入式系統(tǒng)設(shè)計(jì)。如果直接移植到嵌入式系統(tǒng),會(huì)大大降低嵌入式系統(tǒng)的性能。根據(jù)NAND Flash 的物理特性,該文基于JFFS2 設(shè)計(jì)了一種EJFFS 加密文件系統(tǒng),在確保數(shù)據(jù)安全的同時(shí),保證NAND Flash的讀寫速率。
在硬件層面,文獻(xiàn)[3]使用CPLD 實(shí)現(xiàn)了Flash存儲(chǔ)器的加密,在處理器和Flash 總線之間串聯(lián)了一塊CPLD,對(duì)Flash 地址、數(shù)據(jù)進(jìn)行處理。CPLD是可編程器件,非常適合完成各類算法和組合邏輯,通過在線編程功能可以靈活使用不同算法。文獻(xiàn)[4]在嵌入式系統(tǒng)存儲(chǔ)器數(shù)據(jù)加密技術(shù)的基礎(chǔ)上,提出了一種地址加擾安全防護(hù)措施,通過使用比特置換網(wǎng)絡(luò)實(shí)現(xiàn)地址加擾,保證了地址加擾的實(shí)時(shí)性。由于處理器的初始化代碼與處理器型號(hào)相關(guān),特定型號(hào)的處理器其初始化代碼相對(duì)固定,因此很容易被攻擊者探知。通過對(duì)系統(tǒng)初始化過程中寫入存儲(chǔ)器的地址進(jìn)行加擾,可以有效保護(hù)系統(tǒng)程序的安全。文獻(xiàn)[5]使用AES-GCM 實(shí)現(xiàn)加密算法和數(shù)據(jù)完整性算法,建立了一種片外訪存加密認(rèn)證機(jī)制,將存儲(chǔ)器劃分為1 kB 大小的頁面,每個(gè)頁面生成一個(gè)128 bit 的認(rèn)證碼。嵌入式系統(tǒng)讀取外部存儲(chǔ)器時(shí),會(huì)將讀出密文生成的認(rèn)證碼與保存的認(rèn)證碼對(duì)比,如果不一致,說明數(shù)據(jù)被篡改。還有一些文獻(xiàn)使用其他的加密算法如LBlock、KLEIN 等實(shí)現(xiàn)安全存儲(chǔ)[6-7]。AMD 為了抵御冷啟動(dòng)、Bus Snooping 等攻擊,也提出了硬件內(nèi)存加密機(jī)制SME 與SEV[8],基于原有的內(nèi)存控制器,將密鑰放在內(nèi)存控制器上,對(duì)內(nèi)存進(jìn)行寫操作、讀操作時(shí),內(nèi)存控制器對(duì)數(shù)據(jù)進(jìn)行加解密。
本文設(shè)計(jì)實(shí)現(xiàn)了一種Flash 安全存儲(chǔ)控制器,以數(shù)據(jù)加密和混亂地址映射來防止攻擊者從存儲(chǔ)器入手攻擊關(guān)鍵信息,并對(duì)Flash 存儲(chǔ)器進(jìn)行分區(qū),通過認(rèn)證機(jī)制控制用戶訪問Flash 存儲(chǔ)器。
圖1 為Flash 安全存儲(chǔ)控制器的總體結(jié)構(gòu),主要包括流控模塊、加解密模塊、地址加擾模塊及訪問控制模塊。
各個(gè)模塊的功能如下。
(1)流控模塊:接收總線信號(hào),判斷操作區(qū)域的訪問權(quán)限,完成數(shù)據(jù)在各個(gè)模塊之間的流動(dòng) 控制。
(2)加解密模塊:對(duì)Flash 中的存儲(chǔ)數(shù)據(jù)提供加密服務(wù),保證Flash 存儲(chǔ)數(shù)據(jù)的保密性。這樣即使攻擊者讀取Flash 存儲(chǔ)器的內(nèi)容,在沒有密鑰的情況下也無法獲取存儲(chǔ)數(shù)據(jù)的信息。
(3)地址加擾模塊:對(duì)讀、寫操作的地址進(jìn)行加擾,混亂數(shù)據(jù)的存儲(chǔ)位置,進(jìn)一步提升存儲(chǔ)數(shù)據(jù)的保密性。
(4)訪問控制模塊:對(duì)Flash 存儲(chǔ)器進(jìn)行分區(qū),控制不同等級(jí)用戶的訪問范圍;對(duì)Flash 中的受保護(hù)區(qū)域?qū)嵭姓J(rèn)證保護(hù)機(jī)制,用戶只有認(rèn)證通過才能對(duì)受保護(hù)區(qū)域進(jìn)行讀、寫操作。
圖1 Flash 安全存儲(chǔ)控制器總體結(jié)構(gòu)
為了保證Flash 的訪問速率,本文的加解密模塊由國密SM4 算法實(shí)現(xiàn)。SM4 算法是一種分組算法,加解密速度快且邏輯簡單較易實(shí)現(xiàn),非常適合作為Flash 存儲(chǔ)數(shù)據(jù)的加解密算法。SM4 的運(yùn)算流程是先輸入密鑰進(jìn)行密鑰擴(kuò)展,后輸入數(shù)據(jù)進(jìn)行加解密處理。本文在一次密鑰擴(kuò)展后會(huì)將擴(kuò)展結(jié)果保存,后續(xù)如果密鑰不更換則不需要密鑰擴(kuò)展過程。這樣可以將SM4 運(yùn)算時(shí)間縮短一半,進(jìn)一步提升Flash的訪問速率。
讀、寫操作流程分別如圖2、圖3 所示。
圖2 寫操作流程
圖3 讀操作流程
當(dāng)流控模塊識(shí)別到總線發(fā)出寫操作時(shí),首先判斷寫操作地址所在區(qū)域是否開放訪問權(quán)限,如果開放,將寫地址送入地址加擾模塊,將寫數(shù)據(jù)送入加解密模塊進(jìn)行加密,之后將處理好的地址和數(shù)據(jù)按照Flash 接口協(xié)議送入Flash 存儲(chǔ)器。當(dāng)流控模塊識(shí)別到總線發(fā)出讀操作,也要首先判斷讀操作地址所在區(qū)域是否具有訪問權(quán)限。如果有,則將加擾后的地址送入Flash 存儲(chǔ)器,等待Flash 發(fā)出讀回的數(shù)據(jù),然后將數(shù)據(jù)送入加解密模塊進(jìn)行解密,再送回總線接口。
在一些應(yīng)用場景中,F(xiàn)lash 中存儲(chǔ)的數(shù)據(jù)具有不同的密級(jí)。不同等級(jí)的用戶可訪問的數(shù)據(jù)范圍不同。為了實(shí)現(xiàn)不同等級(jí)用戶的訪問控制,本文在Flash 控制器中加入了分區(qū)訪問控制邏輯。將Flash存儲(chǔ)器空間劃分為多個(gè)區(qū)域,并將用戶分成兩級(jí),包括普通用戶和管理員用戶。普通用戶針對(duì)某一區(qū)域進(jìn)行認(rèn)證,如果認(rèn)證通過,則獲得該區(qū)域的訪問權(quán)限。管理員用戶通過認(rèn)證,則獲得所有區(qū)域的訪問權(quán)限。
如圖4 所示,F(xiàn)lash 空間被劃分為認(rèn)證數(shù)據(jù)區(qū)和多個(gè)主存儲(chǔ)區(qū)。認(rèn)證數(shù)據(jù)區(qū)用來保存所有主存儲(chǔ)區(qū)的相關(guān)信息,包括認(rèn)證值、當(dāng)前錯(cuò)誤認(rèn)證的次數(shù)、被允許的錯(cuò)誤認(rèn)證次數(shù)等。如果普通用戶針對(duì)某一區(qū)域的錯(cuò)誤認(rèn)證次數(shù)超過被允許的錯(cuò)誤認(rèn)證次數(shù),則該區(qū)域的訪問權(quán)限會(huì)被鎖死,用戶無法再通過認(rèn)證獲得訪問權(quán)限,需要通過管理員認(rèn)證來解鎖。如果管理員用戶的錯(cuò)誤認(rèn)證次數(shù)超過被允許的錯(cuò)誤認(rèn)證次數(shù),則全片鎖死。
圖4 Flash 分區(qū)
普通用戶的認(rèn)證過程描述如下。
(1)用戶發(fā)出口令后,首先判斷當(dāng)前錯(cuò)誤認(rèn)證的次數(shù)是否超過被允許的錯(cuò)誤認(rèn)證次數(shù),如果不超過則進(jìn)入流程(2),如果超過則當(dāng)前區(qū)域的訪問權(quán)限鎖死,用戶無法操作當(dāng)前區(qū)域;
(2)將用戶口令與認(rèn)證值進(jìn)行比較,如果完全一致,則獲得當(dāng)前區(qū)域的訪問權(quán)限,如果不一致則進(jìn)入流程(3);
(3)錯(cuò)誤認(rèn)證的次數(shù)增加,獲取當(dāng)前區(qū)域的訪問權(quán)限失敗。
首次認(rèn)證時(shí),用戶使用設(shè)定好的認(rèn)證初始值作為口令進(jìn)行認(rèn)證。認(rèn)證成功后,用戶可以將認(rèn)證初始值改成僅用戶知曉的值,從而有效保護(hù)用戶的數(shù)據(jù)安全。
測試環(huán)境基于某嵌入式SoC 芯片原型系統(tǒng),模擬用戶的認(rèn)證流程和對(duì)Flash 的讀寫流程來驗(yàn)證Flash 安全存儲(chǔ)控制器的功能。實(shí)驗(yàn)環(huán)境如圖5 所示。
(1)未認(rèn)證情況下向主存儲(chǔ)區(qū)發(fā)送寫請(qǐng)求,控制器拒接了此次寫請(qǐng)求,數(shù)據(jù)未被寫入Flash;向主存儲(chǔ)區(qū)發(fā)送讀請(qǐng)求,控制器拒接了此次讀請(qǐng)求。
(2)認(rèn)證失敗后向主存儲(chǔ)區(qū)發(fā)送寫請(qǐng)求,控制器拒接了此次寫請(qǐng)求,數(shù)據(jù)未被寫入Flash;向主存儲(chǔ)區(qū)發(fā)送讀請(qǐng)求,控制器拒接了此次讀請(qǐng)求。
(3)認(rèn)證成功后向主存儲(chǔ)區(qū)發(fā)送寫請(qǐng)求,控制器允許了此次寫請(qǐng)求,密文數(shù)據(jù)被寫入Flash,且寫入地址為加擾后地址;向主存儲(chǔ)區(qū)發(fā)送讀請(qǐng)求,控制器允許了此次讀請(qǐng)求,讀出數(shù)據(jù)為正確的明文。
(4)認(rèn)證失敗超過限定次數(shù)后,管理員發(fā)送口令且認(rèn)證成功,向主存儲(chǔ)區(qū)發(fā)送寫請(qǐng)求,控制器允許了此次寫請(qǐng)求,密文數(shù)據(jù)被寫入Flash,且寫入地址為加擾后地址;向主存儲(chǔ)區(qū)發(fā)送讀請(qǐng)求,控制器允許了此次讀請(qǐng)求,讀出數(shù)據(jù)為正確的明文。
測試結(jié)果表明,F(xiàn)lash 安全存儲(chǔ)控制器能夠?qū)崿F(xiàn)分區(qū)訪問控制,且數(shù)據(jù)在Flash 存儲(chǔ)區(qū)中以加擾加密狀態(tài)存儲(chǔ)??梢愿鶕?jù)用戶制定的用戶策略設(shè)定部分主存儲(chǔ)區(qū)不需認(rèn)證即可訪問,形成開放區(qū)和敏感區(qū),使應(yīng)用范圍更加靈活。目前,本設(shè)計(jì)已經(jīng)應(yīng)用于實(shí)際產(chǎn)品中并流片完成,證明了本設(shè)計(jì)的可用性和實(shí)用性。
圖5 實(shí)驗(yàn)環(huán)境
本文設(shè)計(jì)實(shí)現(xiàn)了一種Flash 安全存儲(chǔ)控制器,在通用Flash 控制器工作原理的基礎(chǔ)上添加加解密模塊和加擾模塊,將Flash 存儲(chǔ)空間劃分為多個(gè)分區(qū),實(shí)現(xiàn)對(duì)不同等級(jí)用戶的訪問權(quán)限的控制,最后通過實(shí)際測試驗(yàn)證了控制器功能。該Flash 安全存儲(chǔ)控制器完全由硬件實(shí)現(xiàn),對(duì)Flash 訪問速率影響相對(duì)較小,且訪問過程安全可靠,提高了系統(tǒng)的安全防護(hù)能力,可在很多平臺(tái)推廣應(yīng)用。