信息安全專題 | 代碼保護(1)使用STM32H7新特性保護片上代碼的機密性
談到STM32的高性能家族產(chǎn)品,大家已經(jīng)對STM32F2/F4/F7耳熟能詳。之后的STM32H7系列繼承和發(fā)展了高性能產(chǎn)品家族的特性。然鵝,如何使用STM32H7進行安全存儲、代碼保護?你造嗎?
使用STM32H7 安全用戶存儲區(qū)控制調(diào)試端口訪問、保護片上代碼安全
使用STM32H7新特性保護片上代碼的機密性包括:
調(diào)試端口連接可控:在RDP0條件下也可實現(xiàn)對調(diào)試端口的保護,上電調(diào)試接口即不可連接(具有類似RDP2的效果);比RDP2更靈活,可以由用戶代碼控制調(diào)試端口訪問權(quán)限,實現(xiàn)安全調(diào)試,并保留修改選項字節(jié)的 可能性
用戶片上Flash進一步隔離-保護敏感代碼不被木馬程序攻擊
安全STM32H7可以實現(xiàn)以下功能:安全啟動、安全用戶存儲區(qū)、安全調(diào)試

STM32H7 硬件安全特性與機制主要包括:
安全STM32H7的啟動路徑
安全STM32H7的 “安全用戶存儲區(qū)”
安全STM32H7的安全調(diào)試

安全STM32H7 啟動流程
安全STM32H7新增選項字節(jié):SECURITY、SEC_AREA
系統(tǒng)復(fù)位,裝載選項字節(jié)的過程中,如果SECURITY置位,則無論BOOT引腳電平以及 BOOTADDR選項字節(jié)的內(nèi)容,一定從位于片上系統(tǒng)Flash的RSS啟動
RSS會檢查SEC_AREA的內(nèi)容,是否已經(jīng)有指定的有效區(qū)域(有效區(qū)域是指起始地址小于 結(jié)束地址)。如果區(qū)域有效,則跳轉(zhuǎn)到它所指向的用戶Flash上的“安全用戶存儲區(qū)”執(zhí)行。如果區(qū)域無效,則按照常規(guī)啟動流程,根據(jù)BOOT引腳電平,選擇從BOOTADDR0或 BOOTADDR1指向的地址啟動
BOOTADDR0和BOOTADDR1可以填寫[0x0,0x3FFF 0000]范圍內(nèi)的任意地址。RDP2情況 下,系統(tǒng)只能從片上用戶Flash啟動。如果BOOTADDR0或者BOOTADDR1指向的不是片上 用戶Flash,系統(tǒng)會強制從0x0800 0000啟動
SECURITY=1時,系統(tǒng)復(fù)位時調(diào)試端口關(guān)閉
運行在RSS和安全用戶存儲區(qū)時,調(diào)試端口關(guān)閉

安全用戶閃存區(qū)
上電復(fù)位狀態(tài):
只要使能Security并設(shè)置了安全用戶閃存區(qū)的有效范圍,則總是跳轉(zhuǎn)到該區(qū)域的首地址運行
在這個區(qū)域(region A)內(nèi)執(zhí)行的時候,無法通過Debug連接芯片(即使RDP0狀態(tài)下)
復(fù)位和運行在region A的時候,芯片處于“安全訪問模式”

從安全用戶閃存區(qū),不使能對它的保護,直接跳轉(zhuǎn)到普通UserFlash區(qū)(region B)
處于region B的PC依舊可以訪問安全用戶閃存區(qū)(region A)內(nèi)容
在region B內(nèi)執(zhí)行的時候,仍然無法通過Debug連接芯片(即使RDP0狀態(tài)下)
運行在region B的時候,雖然不在安全用戶閃存區(qū)范圍內(nèi),仍然處于“安全訪問模式”

從安全用戶閃存區(qū),開啟對它保護后,再跳轉(zhuǎn)到普通UserFlash區(qū)(region B)
處于region B的PC無法訪問安全用戶閃存區(qū)(region A)內(nèi)容,直到下一次復(fù)位后PC在region A執(zhí)行
在region B內(nèi)執(zhí)行時,調(diào)試連接是可能的 (取決于跳轉(zhuǎn)之前應(yīng)用代碼是否人為關(guān)閉了調(diào)試端口)
運行在region B的時候,不再處于“安全訪問模式”

安全用戶閃存區(qū)的設(shè)置和撤銷
芯片出廠時選項字節(jié)的缺省設(shè)置:SECURITY=0,“安全用戶閃存區(qū)”是無效區(qū)域
設(shè)置 “安全用戶閃存區(qū)”必須在SECURITY置位之后;否則設(shè)置無效
“安全用戶閃存區(qū)”有效的情況下,或者PCROP區(qū)域有效的情況下, SECURITY的清 零無法成功;需要先把這兩種區(qū)域都設(shè)置成無效,再對SECRUITY清零
“安全用戶閃存區(qū)”的撤銷,只需要運行在RSS或“安全用戶閃存區(qū)” 的代碼,把選項字節(jié)在Flash接口中對應(yīng)的寄存器,其起始地址設(shè)置成大于結(jié)束地址,并讓選項字節(jié)生效即可
PCROP區(qū)域的撤銷,需要通過RDP降級和PCROP區(qū)域無效,同時進行才能完成

安全STM32H7 代碼保護示例
安全調(diào)試?yán)毯喗?/strong>
解壓縮軟件包,使用熟悉的IDE分別打開Boot和App兩個工程,編譯后下載
打開串口調(diào)試助手:115200波特率,8bit數(shù)據(jù)位,1bit停止位;無校驗位,無流控
STM32H753-Nucleo板:按下復(fù)位鍵,松開,程序運行;松開復(fù)位鍵時保持用戶按鍵按下;根據(jù)屏幕菜單顯示操作
使用STM32CubeProgramer 的”hotplug”和”under reset”方式嘗試連接目標(biāo)芯片,以驗證調(diào)試端口的保護效果;以及對隔離區(qū)內(nèi)容的保護





注意事項
SEC_AREA 沒有安全區(qū)時,只能由RSS來初始化;有了安全區(qū)后,運行在其中的代碼可以修改 SEC_AREA ;STM32CubeProgrammer 是無法操作SEC_AREA 成功的
SECURITY=1,IDE下載可能會失敗;要么從STM32CubeProgramer連接后,清零SECURITY;要么修改工程的復(fù)位連接方式

小結(jié)
STM32H7通過以下兩方面對片上代碼施加保護:
保護Bootloader里的敏感操作和數(shù)據(jù):Bootloader運行時,調(diào)試不可連接;執(zhí)行普通代碼時,打開調(diào)試端口;普通代碼 無法訪問Bootloader區(qū)域內(nèi)容
保護片上代碼不被普通用戶調(diào)試,僅開放給持有密鑰的特定用戶:安全用戶區(qū)里內(nèi)容可以被其他區(qū)域代碼訪問;打開調(diào)試后,安全區(qū)代碼無法被調(diào)試訪問

