與OEM Key保護(hù)機(jī)制詳解)
最近調(diào)了一塊STM32U575的板子因?yàn)楫a(chǎn)品要防抄板、又要支持售后返修時(shí)不丟校準(zhǔn)數(shù)據(jù)我研究了一下“RDP降級(jí) OEM Key保護(hù)”這套玩法。標(biāo)題里帶的這個(gè)詞組“RDP”在MCU語(yǔ)境里不是遠(yuǎn)程桌面而是Read-out Protection讀保護(hù)“OEM Key”是ST在U5系列新增的硬件級(jí)密鑰保護(hù)機(jī)制所謂降級(jí)指的是把讀保護(hù)從Level 1退回到Level 0讓調(diào)試器重新能訪問Flash。這個(gè)筆記把我的試驗(yàn)過程和踩坑點(diǎn)都整理出來(lái)了給正在做U5產(chǎn)品安全設(shè)計(jì)、或者被“RDP一降級(jí)Flash就全空”折磨過的工程師一個(gè)參考。1. 這個(gè)筆記解決什么問題1.1 從一次慘痛經(jīng)歷說(shuō)起早年在做F4系列產(chǎn)品的時(shí)候我遇到過這么一件事客戶的一臺(tái)設(shè)備運(yùn)行異常需要我遠(yuǎn)程指導(dǎo)現(xiàn)場(chǎng)的工程師接上ST-Link看一下日志和故障現(xiàn)場(chǎng)。結(jié)果現(xiàn)場(chǎng)工程師剛把RDP從Level 1降到Level 0準(zhǔn)備讀數(shù)據(jù)整片F(xiàn)lash全被擦光了。固件沒了校準(zhǔn)數(shù)據(jù)沒了最后只能返廠重刷。那次的根源就是F4等老平臺(tái)的規(guī)則很簡(jiǎn)單粗暴——RDP Level 1降到Level 0時(shí)芯片內(nèi)部強(qiáng)制觸發(fā)全片擦除沒有任何商量余地。這個(gè)設(shè)計(jì)是為了防止有人通過降級(jí)來(lái)繞過讀保護(hù)代價(jià)是正規(guī)售后也一起遭殃。STM32U5系列把這個(gè)問題解決得比較優(yōu)雅。它保留了一級(jí)降級(jí)保護(hù)的底線同時(shí)允許你在OTP區(qū)域里固化一把OEM Key。只要降級(jí)時(shí)輸入的密鑰和芯片內(nèi)部存儲(chǔ)的OEM Key匹配Flash內(nèi)容就能原封不動(dòng)保留調(diào)試器恢復(fù)訪問。如果不匹配則照舊全片擦除。這就等于給“售后解鎖”開了一條正規(guī)門同時(shí)把非法讀取的路徹底堵死。1.2 先把RDP和OEM Key的關(guān)系理清楚RDP在STM32上分為三級(jí)這個(gè)基礎(chǔ)概念值得再?gòu)?qiáng)調(diào)一遍L(zhǎng)evel 0沒有讀保護(hù)。調(diào)試口隨意訪問Flash隨便讀。Level 1禁止調(diào)試工具通過SWD/JTAG讀取Flash也禁止從RAM或System Memory啟動(dòng)來(lái)執(zhí)行代碼讀Flash。CPU內(nèi)核正常運(yùn)行不受影響。Level 2最高保護(hù)調(diào)試口徹底鎖死選項(xiàng)字節(jié)部分永久不可改沒有降級(jí)通道。在Level 1狀態(tài)下你還想用調(diào)試器調(diào)試唯一的正規(guī)退路就是降級(jí)到Level 0。老平臺(tái)降級(jí)必然擦片而U5支持“帶OEM Key的降級(jí)”其實(shí)就是給降級(jí)過程加一道密鑰校驗(yàn)密鑰對(duì)Flash保留密鑰不對(duì)Flash清空。ST這樣設(shè)計(jì)的目的也很明確既保護(hù)了廠商的固件不被輕易抄走又給了正規(guī)授權(quán)維修一個(gè)體面的入口。1.3 這個(gè)特性適合誰(shuí)、不適合誰(shuí)如果你做的是消費(fèi)類小產(chǎn)品出廠后基本不回收調(diào)試那OEM Key的意義不大老老實(shí)實(shí)開Level 1甚至Level 2就行。但如果你的產(chǎn)品包含以下幾種情況強(qiáng)烈建議研究一下這個(gè)方案設(shè)備內(nèi)置了傳感器校準(zhǔn)參數(shù)、生產(chǎn)序列號(hào)、業(yè)務(wù)密鑰等不可再生數(shù)據(jù)售后維修時(shí)不能丟產(chǎn)品支持現(xiàn)場(chǎng)升級(jí)升級(jí)失敗后需要恢復(fù)調(diào)試接口來(lái)排查但不能把整個(gè)Flash抹掉重來(lái)你希望允許售后人員在有授權(quán)的情況下打開調(diào)試口同時(shí)保證沒有密鑰的人拿到設(shè)備也讀不出固件。U5的定位就是帶TrustZone的高安全低功耗MCU選它做產(chǎn)品基本都會(huì)碰到這些安全需求。把OEM Key這個(gè)機(jī)制吃透等于給產(chǎn)品上了一道帶鑰匙的安全門。2. U5相比老芯片多了什么OEM Key的核心設(shè)計(jì)2.1 老方案為什么會(huì)“一刀切”老平臺(tái)的RDP降級(jí)策略是一個(gè)純二進(jìn)制的決定要么保護(hù)要么全擦。從安全角度講它沒毛病因?yàn)槿绻导?jí)不擦Flash攻擊者就能把Level 1的設(shè)備隨便降到Level 0然后隨便讀那讀保護(hù)形同虛設(shè)。但從工程實(shí)踐講這個(gè)策略太粗暴了它默認(rèn)所有降級(jí)操作都是惡意的結(jié)果就是正常的售后維修也被誤傷。我見過不少團(tuán)隊(duì)為了遷就這個(gè)機(jī)制干脆不開RDP Level 1導(dǎo)致固件直接被抄。也見過團(tuán)隊(duì)開了保護(hù)但維修流程極其痛苦每次返廠都要重?zé)碳儋N標(biāo)定。這兩種狀態(tài)都談不上好的產(chǎn)品設(shè)計(jì)。2.2 OEM Key是怎么工作的U5系列的OEM Key是一個(gè)固化在OTPOne-Time Programmable一次性可編程區(qū)域的機(jī)密。它有這幾個(gè)特征密鑰區(qū)域?qū)儆谝淮涡詫懭隣TP物理特性決定了只能從1寫成0不可逆所以Key一旦燒錯(cuò)了基本只能換芯片密鑰是全局性的不是每個(gè)用戶程序隨便改的它在芯片安全域里被保護(hù)起來(lái)用戶代碼實(shí)際上讀取不到原始值防止被程序反讀泄露它和RDP降級(jí)流程硬件聯(lián)動(dòng)由BootROM芯片出廠固件在復(fù)位流程中完成校驗(yàn)不是靠用戶代碼判斷。整個(gè)校驗(yàn)過程大致是這樣的芯片處于RDP Level 1同時(shí)使能了OEM Key保護(hù)。調(diào)試工具發(fā)起降級(jí)請(qǐng)求把RDP等級(jí)改為L(zhǎng)evel 0芯片復(fù)位后BootROM發(fā)現(xiàn)等級(jí)變化需要產(chǎn)生密鑰校驗(yàn)。這時(shí)調(diào)試工具必須把OEM Key的值提交上來(lái)BootROM把提交值和OTP存儲(chǔ)值逐位比對(duì)一致則跳轉(zhuǎn)到正常用戶Flash啟動(dòng)不一致則執(zhí)行全片擦除。從用戶視角看降級(jí)動(dòng)作本身和以前一樣就是寫Option Bytes后再?gòu)?fù)位。不同的是多了一步“提交密鑰”的過程CubeProgrammer、ST-LINK Utility或命令行工具都支持這個(gè)動(dòng)作。2.3 什么時(shí)候用多Bank和TrustZone要注意U5的Option Bytes比老平臺(tái)復(fù)雜得多除了RDP之外還涉及DBANK雙Bank配置、SWAP_BANK、PA13/PA14調(diào)試引腳復(fù)用等。我的建議是第一次試驗(yàn)不要碰雙Bank就用默認(rèn)單Bank配置先把OEM Key這條鏈路跑通再去研究Bank切換帶來(lái)的影響。雙Bank模式下芯片的啟動(dòng)行為和非易失性存儲(chǔ)操作會(huì)有差異OEM Key校驗(yàn)邏輯也可能跟著Option Bytes的組合變化數(shù)據(jù)手冊(cè)里這些細(xì)節(jié)寫得很細(xì)踩坑成本高沒必要一上來(lái)就挑戰(zhàn)。另外如果同時(shí)開啟了TrustZone那調(diào)試口、Flash讀寫、RDP等級(jí)還會(huì)帶上安全/非安全狀態(tài)的概念CubeProgrammer里會(huì)出現(xiàn)TZEN相關(guān)選項(xiàng)。OEM Key本身不依賴TrustZone但TrustZone一旦啟用很多操作行為和純非安全模式不一致。我的實(shí)驗(yàn)是在不啟用TrustZone的情況下完成的如果你的產(chǎn)品必須開TrustZone建議把TZEN的調(diào)試規(guī)則一起捋清楚再動(dòng)RDP。3. 動(dòng)手前準(zhǔn)備與關(guān)鍵配置解讀3.1 軟硬件環(huán)境我實(shí)驗(yàn)用的板子是NUCLEO-U575ZI-Q這是ST官方評(píng)估板板載ST-LINK算是U5系列里最容易上手的載體。軟件方面用了兩個(gè)必須的東西STM32CubeProgrammer版本建議6.4以上U5的OEM Key選項(xiàng)在老版本里確實(shí)不完整STM32CubeIDE用來(lái)寫測(cè)試代碼通過HAL接口讀取Option Bytes狀態(tài)、觸發(fā)降級(jí)復(fù)位等邏輯。你完全可以用軟件仿真或者用一塊裸板加外部ST-LINK來(lái)做但我不建議在前期用芯片本身內(nèi)部BootROM做實(shí)驗(yàn)因?yàn)橐坏㎡EM Key配置不對(duì)會(huì)有概率把芯片搞到無(wú)法連接帶板載ST-LINK的評(píng)估板至少還能用UR模式搶救一下。3.2 幾個(gè)必須提前知道的Option Bytes選項(xiàng)在CubeProgrammer的OBOption Bytes配置界面里U5會(huì)列出大量選項(xiàng)初學(xué)者很容易看懵。和本主題相關(guān)的只需要關(guān)注這幾項(xiàng)RDP Level當(dāng)前讀保護(hù)等級(jí)可切換Level 0 / Level 1 / Level 2OBKey0到OBKey7等OTP中保存OEM Key的寄存器每個(gè)32位通常8個(gè)組合成256位密鑰與OEM Key相關(guān)的鎖定開關(guān)把“寫入后鎖定”的選項(xiàng)打開防止之后被意外改寫啟動(dòng)BANK相關(guān)配置保持默認(rèn)單Bank即可。還要留意一點(diǎn)CubeProgrammer把OEM Key存儲(chǔ)在OB界面里的位置不同版本顯示的名稱有細(xì)微差別。我這份實(shí)驗(yàn)里它在“OB Key”區(qū)域但換一個(gè)版本可能在“OTP”區(qū)域下。別慌按寄存器名字找“OBKey”關(guān)鍵字或者在界面上用關(guān)鍵字搜“Key”基本能定位。3.3 我對(duì)當(dāng)前項(xiàng)目的配置規(guī)劃做實(shí)驗(yàn)之前我先明確了自己的目標(biāo)這很重要不然很容易隨手點(diǎn)設(shè)置結(jié)果把板子鎖死。我的目標(biāo)規(guī)劃是這樣出廠時(shí)芯片處于RDP Level 1固件正常跑但調(diào)試口讀不了Flash燒錄一段已知的OEM Key到OTP并鎖定售后維修時(shí)通過ST-LINK配合正確的OEM Key執(zhí)行降級(jí)到Level 0Flash內(nèi)容保留密鑰錯(cuò)誤時(shí)Flash應(yīng)當(dāng)全片擦除確保固件不被竊取。為了保證實(shí)驗(yàn)可復(fù)現(xiàn)我在Flash里預(yù)寫了幾個(gè)內(nèi)容不同的數(shù)據(jù)塊分別是0xA5、0x5A、0x3C等明顯特征值用來(lái)快速判斷降級(jí)后哪些區(qū)域被擦掉了。4. 完整實(shí)操?gòu)臒齂ey到降級(jí)驗(yàn)證4.1 階段A對(duì)照組實(shí)驗(yàn)不燒OEM Key直接降級(jí)先從最原始的方式開始目的是確認(rèn)老行為在U5上是否還保留。我先把RDP從Level 0切到Level 1然后用CubeProgrammer的“Read Unprotect”操作執(zhí)行降級(jí)。CubeProgrammer會(huì)彈出一條警告提示“可能擦除Flash”點(diǎn)擊確認(rèn)后芯片復(fù)位Flash全空讀取到的內(nèi)容全是0xFF。這個(gè)結(jié)果說(shuō)明如果沒有OEM Key信息U5的行為和老平臺(tái)完全一致降級(jí)即擦除。這一步的意義在于給后面的對(duì)照實(shí)驗(yàn)打底我能清晰地判斷出“保留Flash”的效果確實(shí)是OEM Key帶來(lái)的而不是我操作有誤。4.2 階段B燒錄OEM Key并開啟RDP Level 1接下來(lái)是正式實(shí)驗(yàn)。先把RDP切回Level 0保證調(diào)試口完全打開然后在CubeProgrammer的OB界面里找到OBKey相關(guān)的寄存器填入一組測(cè)試用的256位密鑰比如我填的是OK0 0x01234567 OK1 0x89ABCDEF OK2 0x13579BDF OK3 0x2468ACE0 OK4 0xFEDCBA98 OK5 0x76543210 OK6 0x0F1E2D3C OK7 0x4B5A6978注意這把測(cè)試Key只是演示用途真正產(chǎn)品里別用這種順序規(guī)律太強(qiáng)的值。填完以后點(diǎn)寫OBCubeProgrammer會(huì)把OBKey寫入OTP區(qū)域。這里有一個(gè)很容易被忽略的步驟寫完之后要把“OBKey鎖定”選項(xiàng)一并打開并再次寫OB。如果不鎖理論上后續(xù)還可以繼續(xù)改寫OTP安全性打了折扣鎖定之后這組Key就徹底焊死在芯片上了。然后我把RDP切到Level 1同樣寫OB。此時(shí)芯片進(jìn)入保護(hù)模式。為了確認(rèn)效果我斷開ST-LINK重新連接嘗試讀取Flash讀出來(lái)的地址全部被屏蔽或報(bào)錯(cuò)這是Level 1的典型表現(xiàn)說(shuō)明保護(hù)生效了。4.3 階段C三種降級(jí)方式逐個(gè)驗(yàn)證接下來(lái)才是關(guān)鍵環(huán)節(jié)。第一次我用正確的OEM Key降級(jí)。CubeProgrammer里選擇“Read Unprotect”操作時(shí)界面上會(huì)出現(xiàn)一個(gè)輸入密鑰的區(qū)域把剛才寫入的8個(gè)32位值逐個(gè)填進(jìn)去然后執(zhí)行。復(fù)位完成后我立刻讀Flash之前寫的0xA5、0x5A、0x3C這些特征值全部還在。也就是說(shuō)密鑰匹配時(shí)RDP從Level 1降到Level 0Flash沒有被擦除。第二次我用錯(cuò)誤的密鑰降級(jí)比如把最后一個(gè)字改成0x00000000其他值不變。CubeProgrammer同樣執(zhí)行了降級(jí)流程但復(fù)位后再讀Flash所有內(nèi)容變成0xFF全片被擦除。第三次我做了個(gè)更狠的測(cè)試在RDP Level 1下故意讓程序跑飛然后通過ST-LINK的connect under reset模式連接直接發(fā)起降級(jí)但不提供密鑰。結(jié)果是芯片照樣擦除了Flash保護(hù)邏輯被強(qiáng)制執(zhí)行。這個(gè)對(duì)照實(shí)驗(yàn)很直觀地說(shuō)明了OEM Key的真正作用它不是阻止降級(jí)而是決定降級(jí)后Flash的去留。密鑰對(duì)了解鎖成功且不丟數(shù)據(jù)密鑰錯(cuò)了或沒有密鑰解鎖成功但Flash保不住。4.4 在用戶代碼里讀取RDP狀態(tài)前面幾步都是通過CubeProgrammer操作實(shí)際產(chǎn)品中可能需要在設(shè)備端做狀態(tài)檢查比如開機(jī)自檢時(shí)確認(rèn)當(dāng)前RDP等級(jí)是否符合預(yù)期。用STM32CubeU5的HAL庫(kù)可以直接讀代碼非常簡(jiǎn)單。#include stm32u5xx_hal.h void check_rdp_status(void) { FLASH_OBProgramInitTypeDef sOBCfg; HAL_FLASHEx_OBGetConfig(sOBCfg); if (sOBCfg.RDPLevel OB_RDP_LEVEL_0) { // 未開啟讀保護(hù)注意調(diào)試口可訪問 } else if (sOBCfg.RDPLevel OB_RDP_LEVEL_1) { // 讀保護(hù)開啟調(diào)試口無(wú)法訪問Flash } else if (sOBCfg.RDPLevel OB_RDP_LEVEL_2) { // 最高保護(hù)不可回退 } }這個(gè)函數(shù)在驗(yàn)證量產(chǎn)固件是否正確燒錄時(shí)很有用。產(chǎn)品上線前可以在初始化日志里打一次RDP等級(jí)確保產(chǎn)線沒有漏設(shè)保護(hù)。另外用戶代碼也可以通過HAL接口把RDP等級(jí)往下降比如在條件滿足的情況下執(zhí)行固件自更新流程void rdp_downgrade_with_key(void) { FLASH_OBProgramInitTypeDef sOBCfg; sOBCfg.OptionType OPTIONBYTE_RDP; sOBCfg.RDPLevel OB_RDP_LEVEL_0; HAL_FLASH_Unlock(); HAL_FLASHEx_OBUnlock(); HAL_FLASHEx_OBProgram(sOBCfg); HAL_FLASHEx_OBLaunch(); }但注意代碼里無(wú)法傳入OEM Key密鑰校驗(yàn)仍然是由芯片BootROM在復(fù)位后執(zhí)行而且用戶代碼無(wú)法直接讀取OTP里的Key原文。這個(gè)設(shè)計(jì)是有意的防止惡意程序把Key讀到后通過網(wǎng)絡(luò)傳出。所以固件觸發(fā)降級(jí)時(shí)實(shí)際上是觸發(fā)了一次“需要外部輸入密鑰”的復(fù)位流程如果你在無(wú)密鑰工具輔助的設(shè)備上直接調(diào)用HAL_FLASHEx_OBLaunch大概率結(jié)果就是Flash被擦掉。這一點(diǎn)務(wù)必想清楚不要以為寫了代碼就等于拿到了密鑰。5. 原理深入降級(jí)時(shí)芯片內(nèi)部發(fā)生了什么5.1 從RDP寫入到復(fù)位校驗(yàn)的完整流程把降級(jí)過程拆開看它其實(shí)不是“擦除”或“不擦除”這么簡(jiǎn)單而是BootROM在執(zhí)行一個(gè)安全狀態(tài)機(jī)。我把我的理解整理成時(shí)間線調(diào)試工具或用戶代碼把Option Bytes中的RDP字段從Level 1改為L(zhǎng)evel 0芯片收到OB Launch命令觸發(fā)一次系統(tǒng)復(fù)位BootROM上電讀取RDP字段和OEM Key相關(guān)鎖定狀態(tài)如果檢測(cè)到“RDP等級(jí)正在從高往低變化”進(jìn)入密鑰校驗(yàn)流程調(diào)試工具必須在下一條連接命令中提交OEM KeyBootROM將提交值和OTP中固化的Key逐位比較匹配則跳轉(zhuǎn)到用戶Flash執(zhí)行啟動(dòng)允許后續(xù)調(diào)試訪問不匹配則執(zhí)行Flash全片擦除然后跳轉(zhuǎn)到空Flash狀態(tài)。第5步是整個(gè)機(jī)制的核心。它把“授權(quán)降級(jí)”從軟件邏輯層面搬到了硬件啟動(dòng)流程里任何繞過應(yīng)用代碼的手段都繞不開這一步因?yàn)檫@是BootROM的固定邏輯不是用戶代碼能改的。這也是我比較認(rèn)可ST這個(gè)設(shè)計(jì)的地方它沒有把所有安全寄托在應(yīng)用層而是放在了芯片最底層。5.2 為什么OTP一旦燒錯(cuò)Key就只能換芯片OTP存儲(chǔ)器的物理特性是每一位出廠時(shí)為1寫入操作只能把1變成0不能把0還原為1。所以當(dāng)你發(fā)現(xiàn)某一位寫錯(cuò)了想要改回來(lái)基本是不可能的。我這次實(shí)驗(yàn)里填Key的時(shí)候特別謹(jǐn)慎就是因?yàn)橐坏┌袺ey鎖定如果填錯(cuò)任何值之后無(wú)論怎么操作都無(wú)法糾正只能換一塊芯片。更惡心的是鎖定之后你可能都沒機(jī)會(huì)驗(yàn)證Key對(duì)不對(duì)直到某天售后人員拿著錯(cuò)誤Key去降級(jí)Flash直接被擦成空白你才發(fā)現(xiàn)問題。所以量產(chǎn)流程里一定要有Key校驗(yàn)環(huán)節(jié)。建議的做法是在寫Key之前先讀一遍OTP的原始值確認(rèn)全1然后再寫寫完后立即讀回比對(duì)。CubeProgrammer支持讀回OTP區(qū)數(shù)據(jù)這是個(gè)很好的自檢手段。對(duì)于大批量生產(chǎn)最好讓產(chǎn)線工具自動(dòng)生成密鑰、寫Key、讀回比對(duì)、再鎖Key一步到位不要人工手輸。5.3 設(shè)計(jì)一個(gè)產(chǎn)線友好的密鑰管理方案OEM Key在芯片里是固化的在產(chǎn)線上卻是可以生成的這就帶來(lái)一個(gè)管理問題每塊板子用同一個(gè)Key雖然管理簡(jiǎn)單但一顆芯片的Key泄露等于全線產(chǎn)品裸奔每塊板子用不同Key安全性高但產(chǎn)線要維護(hù)密鑰數(shù)據(jù)庫(kù)售后也要按序列號(hào)匹配密鑰。我見過一些團(tuán)隊(duì)的做法是同一批次產(chǎn)品用一個(gè)統(tǒng)一的OEM Key批量燒錄時(shí)從保密庫(kù)讀取產(chǎn)線不落地明文只在燒錄工具內(nèi)存中使用。密鑰一旦泄露可以靠固件遠(yuǎn)程升級(jí)換一批新的密鑰固件來(lái)緩解但OTP里舊的Key換不掉所以這種方案只適合對(duì)安全性要求不極端的產(chǎn)品。如果產(chǎn)品安全等級(jí)要求高建議把密鑰管理交給HSM硬件安全模塊或?qū)iT的密鑰管理系統(tǒng)出廠時(shí)按設(shè)備唯一ID生成密鑰并寫入同時(shí)把密鑰副本導(dǎo)入售后系統(tǒng)。這樣即使某個(gè)Key泄露影響面也只是單臺(tái)設(shè)備。當(dāng)然這樣做的成本和復(fù)雜度會(huì)高不少具體是否值得要結(jié)合產(chǎn)品形態(tài)來(lái)決定。6. 常見問題排查與經(jīng)驗(yàn)6.1 問題速查表這段整理了我這次實(shí)驗(yàn)和以往項(xiàng)目里常見的問題不一定全部發(fā)生在U5上但排查思路是通用的?,F(xiàn)象可能原因處理方法降級(jí)后Flash全空Key沒起作用沒有正確輸入OEM Key或Key未使能確認(rèn)Key已寫入OTP并鎖定確認(rèn)在降級(jí)時(shí)提交了正確密鑰降級(jí)后Flash保留但重啟后不能運(yùn)行FAP/TrustZone或啟動(dòng)Bank配置被意外改動(dòng)檢查Option Bytes里PA13/PA14、SWAP_BANK、雙Bank配置恢復(fù)到出廠前值讀保護(hù)從L1降到L0后程序跳飛校準(zhǔn)數(shù)據(jù)區(qū)保留但啟動(dòng)地址不對(duì)檢查代碼偏移確認(rèn)該降級(jí)方式不會(huì)修改用戶代碼區(qū)布局連接ST-LINK報(bào)錯(cuò)“Connection error”芯片已處于RDP Level 1或Level 2調(diào)試口受限使用connect under reset模式或先用UR模式連接后再操作寫OEM Key時(shí)發(fā)現(xiàn)OTP已有殘留值芯片被燒過多次OTP不可完全擦除只能換芯片或者接受殘留值設(shè)計(jì)專用密鑰CubeProgrammer無(wú)法識(shí)別OBKey區(qū)域版本過舊沒有U5配置文件升級(jí)CubeProgrammer確保安裝包包含U5系列支持Level 2鎖定后還想調(diào)試無(wú)解這是設(shè)計(jì)的終點(diǎn)只能換新芯片千萬(wàn)別在量產(chǎn)驗(yàn)證時(shí)開Level 26.2 幾條保命經(jīng)驗(yàn)第一永遠(yuǎn)先備份原始Option Bytes。CubeProgrammer的OB界面里可以直接導(dǎo)出當(dāng)前OB配置到文件花十秒鐘做一次備份能在你手滑配置錯(cuò)之后省下大量時(shí)間。我現(xiàn)在的習(xí)慣是每次調(diào)安全相關(guān)選項(xiàng)之前先導(dǎo)出一份等實(shí)驗(yàn)做完再對(duì)比差異。第二實(shí)驗(yàn)階段不要直接上Level 2。Level 1至少還有降級(jí)通道Level 2是真的鎖死。很多剛接觸RDP的人容易搞混以為保護(hù)等級(jí)越高越好結(jié)果把工程板鎖成磚。第三連接方式建議使用connect under reset。處于Level 1的設(shè)備調(diào)試口本來(lái)就不允許直接讀Flash但連接階段如果芯片正在跑自己的代碼ST-LINK和芯片之間可能握手不成功。用復(fù)位連接模式讓芯片停在復(fù)位狀態(tài)再發(fā)起連接是成功率最高的方式。第四遇到“降級(jí)失敗”先查密鑰鎖定狀態(tài)不要急著重復(fù)操作。有伙伴在燒Key之后沒有點(diǎn)鎖定位導(dǎo)致后續(xù)的Option Bytes寫入把Key區(qū)域的一部分改成了其他值Key已經(jīng)不正確了之后再怎么輸入原始Key也對(duì)不上。這種問題用CubeProgrammer讀回OTP區(qū)就能發(fā)現(xiàn)。6.3 一塊板子被誤鎖的搶救經(jīng)歷最后分享一個(gè)我踩過的坑。早期測(cè)試時(shí)我在一塊U5板子上開過Level 2想驗(yàn)證最高保護(hù)下到底會(huì)不會(huì)影響正常啟動(dòng)。驗(yàn)證結(jié)果是芯片運(yùn)行正常但之后我想用ST-LINK連接看日志發(fā)現(xiàn)SWD口完全沒反應(yīng)。由于Level 2下連Option Bytes都改不了這塊板子徹底淪為“只能跑不能調(diào)”的孤島。最后我只能把它當(dāng)普通運(yùn)行設(shè)備用不再嘗試調(diào)試。后來(lái)我把這塊板子上的TagAll功能測(cè)試完就扔一邊了再也不敢拿它做其他實(shí)驗(yàn)。這個(gè)經(jīng)歷教會(huì)我一個(gè)原則Level 2只適合最終產(chǎn)品不適合開發(fā)板。開發(fā)階段如果需要保護(hù)用Level 1加OEM Key就足夠了既安全又留了后路。7. 結(jié)語(yǔ)我在實(shí)際調(diào)試中最大的感受是OEM Key并不是一個(gè)“加了就安全”的開關(guān)它需要和產(chǎn)品流程配合。Key的生成、燒錄、保管、售后使用每一環(huán)都要有清晰規(guī)范否則要么Key泄露形同虛設(shè)要么Key遺失售后束手無(wú)策。我建議你把這塊板子的Key燒錄流程寫成腳本固化到產(chǎn)線工具里并且建立一把獨(dú)立的測(cè)試Key用于研發(fā)調(diào)試和量產(chǎn)Key分開管理。這樣研發(fā)和售后各用各的權(quán)限互不影響。如果你也在做U5相關(guān)的安全設(shè)計(jì)歡迎一起交流折騰經(jīng)驗(yàn)。