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