來源 | 最后一個bug
Bootloader是嵌入式系統的“第一道門檻”——從MCU上電復位到應用程序跳轉執行,它承擔著硬件初始化、時鐘配置、外設使能以及應用鏡像加載等核心職責。
然而在實際產品中,Bootloader面臨的遠不止“把代碼跑起來”這么簡單:外部SPI Flash中的固件可能被篡改、OTA升級包可能在傳輸中損壞、甚至未經簽名的惡意程序可能被注入執行。
作為嵌入式工程師,我們必須在Bootloader層面構筑足夠健壯的安全防線——既要保證鏡像完整性校驗的可靠性,又要權衡簽名認證中的密鑰管理與存儲安全。
本文將逐一拆解鏡像校驗、數字簽名、內存保護與只讀存儲這四種安全機制的設計思路與實現細節。
image校驗我們也常叫鏡像校驗,Bootloader程序可以對從外部存儲器中讀取的應用程序鏡像進行校驗,以確保其完整性和正確性,常見的鏡像校驗方式包括CRC、哈希值等。當然你如果想簡單一點使用求和檢驗也是可行的,將應用程序鏡像中每個字節的值相加,得到一個校驗和。Bootloader程序將計算得到的校驗和與預先存儲在應用程序鏡像中的校驗和進行比較,如果兩者相等,說明應用程序鏡像沒有被篡改,校驗和的優點是計算簡單,缺點當然就是校驗能力有限,更易受攻擊。而相比求和校驗,CRC等是一種更加可靠和安全的校驗方式,它可以檢測出更多的錯誤,并且不易受攻擊。在STM32中,CRC校驗可以使用硬件或軟件實現。硬件CRC校驗可以使用STM32的CRC模塊,直接對應用程序鏡像進行校驗,速度快、精度高。軟件CRC校驗則需要Bootloader程序自行實現CRC算法,速度較慢,但也可以得到較好的校驗效果。如果校驗通過,則可以加載應用程序鏡像;如果校驗失敗,則應該拒絕加載應用程序鏡像,并給出相應的提示。鏡像校驗是可以保證從外部存儲器中讀取的應用程序是可信的,避免惡意程序的注入和攻擊。如果鏡像校驗失敗,Bootloader程序可以拒絕加載應用程序鏡像,避免惡意程序的注入。簽名認證并不是一個加密和解密的過程,它是一種數字簽名技術。數字簽名是一種用于確保電子文檔的完整性和認證性的技術,它使用密鑰對(公鑰和私鑰)來生成和驗證簽名。1、生成簽名:文檔的發送者使用私鑰對文檔進行哈希運算,然后使用私鑰對哈希值進行加密,生成簽名。2、驗證簽名:文檔的接收者使用公鑰對簽名進行解密,得到哈希值,然后對文檔進行哈希運算,得到另一個哈希值。接收者比較這兩個哈希值,如果相等,則說明文檔沒有被篡改,并且簽名是可信的。需要注意的是,數字簽名技術依賴于密鑰對的安全性,私鑰需要妥善保管,防止泄露和丟失,公鑰需要預置在Bootloader程序中,確保其可信和安全。簽名認證需要使用一組密鑰對,包括私鑰和公鑰。開發者使用私鑰對應用程序進行簽名,Bootloader程序使用公鑰進行認證。如果簽名認證失敗,Bootloader程序可以拒絕加載應用程序鏡像。在STM32的Bootloader中,內存保護是一種重要的安全機制,可以保護Bootloader程序和其他重要的代碼和數據不被應用程序覆蓋、修改或篡改。內存保護通常使用硬件或軟件實現。在STM32中,硬件內存保護可以使用CPU的內存保護單元(MPU)實現,軟件內存保護可以使用內存管理單元(MMU)或軟件實現的保護機制,具體使用哪種需要看資源情況。硬件內存保護可以將MCU的內存空間劃分為若干個區域,并為每個區域配置不同的訪問權限。Bootloader程序可以將應用程序加載到特定的區域中,防止應用程序覆蓋或修改Bootloader程序和其他重要的代碼和數據。硬件內存保護的優點是速度快、可靠性高,缺點是配置復雜,需要占用一定的硬件資源。軟件內存保護可以使用MMU或軟件實現的保護機制,但一般有MMU單元的都屬于微處理器了,而微控制器。MMU是一種硬件單元,用于將虛擬地址映射到物理地址,并可以配置不同的訪問權限。軟件實現的保護機制可以在Bootloader程序中實現一些保護代碼,用于檢測和防止應用程序的篡改和攻擊。軟件內存保護的優點是靈活性高,缺點是速度較慢,可靠性較低。內存保護可以保護Bootloader程序和其他重要的代碼和數據不被應用程序覆蓋、修改或篡改。在實現內存保護時,需要注意區域劃分、加載位置、訪問權限、保護代碼等方面的問題。只讀存儲器(ROM)通常是一種非易失性存儲器,具有讀取快、安全可靠、不易受攻擊等優點。將Bootloader程序放在只讀存儲器中,可以保證Bootloader程序的完整性和安全性,防止惡意程序的注入和攻擊。只讀存儲器也可以是MCU的Flash、ROM等。值得注意的是,Bootloader程序的安全機制應該根據實際的應用場景和需求進行設計和實現。安全機制的增加會增加系統的復雜性和開發成本,因此應該在安全性和可用性之間進行權衡。------------ END ------------
嵌入式開發之DeepSeek-V4-Flash 接入 Codex配置步驟