汽車網路安全基礎:UDS刷寫詳細流程,威脅及防禦 (2025-01-13)
Local Backup
UDS 刷寫流程
刷寫流程圖
1 刷寫前(設定刷寫網路)
刷寫前,刷寫工具讀取ECU 的Boot 軟體版本號(F180)、軟體版本(F188)、 VIN(F190)、 硬體版本(F191),根據從ECU 取得到的相關資訊到刷寫資料庫中尋找對應的升級檔。維修店代碼或診斷設備序號(F198)、刷寫日期(F199)在刷寫啟動時寫入,用於追溯先前的刷寫操作。
刷寫準備階段需要確認待刷寫控制器的相關版本信息, 設定刷寫網路等。這個階段在整車各控制器的應用程式中執行, 此階段, 使用功能位址向網路上的各控制器發出診斷請求進行網路設定。
1.1 切換到擴展模式(10 03)
1.2 檢查刷寫前提條件(31 01 XX XX)
整車廠通常會定義一些控制器刷寫的前提條件,例如車速要低於3km/h等,這一步就可以檢查刷寫前提條件是否滿足。不同的OEM/Tier1可能有不同的檢查條件。常見的前置條件如下,
具體實作上,使用31服務執行檢查程式條件的例程routine,如條件不滿足(例如車速過高等),則退出刷寫。
1.3 停用故障碼儲存功能(85 02)
1.4 停止發送一般通訊封包(28 01 01 XX XX)
2 刷寫中(認證&下載資料)
刷寫中先進行身份認證,而後可以寫入指紋,然後執行刷寫擦除內存,向指定地址下載固件,並檢查寫入是否正確。
2.1 切換到程式設計會話(10 02)
2.2安全存取-請求種子(27 01)
2.3 安全存取-發送與驗證Key(27 02)
診斷設備收到種子後,將種子作為輸入,使用雙方已知的演算法,計算得到Key。然後使用子功能發送秘鑰將計算得到的秘鑰發送給ECU。 ECU使用相同的演算法計算出秘鑰並與收到的值進行對比,相同則認證通過。
如果連續多次認證失敗,安全存取會暫停服務一段時間。每認證失敗一次,ECU安全存取失敗計數器就會加1。當錯誤次數達到3次後,將收到0x36(嘗試次數超限)的否定回應碼,並延遲10秒。 10秒之內請求會收到0x37(延遲時間未到)的否定回應碼,10s之後才能再次發起認證請求。
2.4 寫入指紋(2E XX XX YY YY ...)
2.5 擦除記憶體(31 01 FF 00 XX XX YY YY)
2.6 請求下載(34 XX YY ZZ ZZ AA AA)
傳送軟體至ECU前需要指定寫入的位址和資料的大小。
刷寫設備使用34 請求下載服務向ECU 指定刷寫起始位址和刷寫資料的大小, 請求下載($34) 服務指定的記憶體從起始到結束應該是連續的。如果不是連續的,刷寫設備應該為每個要刷寫的資料塊發送一個單獨的請求。
34 資料格式識別碼 位址和長度格式標識記憶體位址記憶體大小
2.7 傳輸資料(36 XX YY YY ...)
2.8 請求傳輸退出(37)
2.9 檢查儲存空間(31 01 02 02)
2.10 檢查程式設計依賴(31 01 FF 01)
2.11 ECU復位(11 01)
3 刷寫後(還原網路)
3.1 切換到擴展模式(10 03)
3.2 啟用發送一般通訊封包(28 00 01 XX XX)
3.3 各ECU 恢復故障碼的偵測(85 01)
3.4 ECU 回到預設模式(10 01)
安全威脅
安全存取演算法
安全存取演算法一般採用對稱加密演算法,通常還是簡單的移位演算法,演算法強度較低。
故障注入:演算法大部分主機廠自己設計實現的,演算法本身的安全性很少驗證。使用故障注入等方式存在被繞過認證的可能。
洩漏: 主機廠/供應商代碼、企標等在網路上外洩。
易被逆向: seed2key 一般以so 檔案存在,對韌體、診斷儀中的庫檔案逆向得到安全存取演算法。
Key
安全常量
除了演算法本身以外,最重要的就是安全常數。安全常數通常為4個位元組。
安全常數硬編碼:安全常數硬編碼在so庫中,逆向安全存取演算法得到安全常數。
預設:使用預設的安全常數,在滲透測試中曾多次遇到,0xc541a9是最常見的安全常數。
使用相同常數:使用同一種演算法的ECU依賴不同的安全常數來保障安全性。不會因為一個模組演算法和常數分析出來之後,直接影響到另外一個模組上。此外,同一車型同一類型ECU的常量通常相同,很少有實現一機一密的。
種子
種子可預測:某車型中的種子是基於時間產生,取得到Mask後,能夠預測到後續的種子。預測種子能夠縮減破解的時間。
static uint32 UDS_GenerateSeed(void)
{
uint32 u32LocalSeedValue;
u32LocalSeedValue = STM0_TIM0.U;
u32LocalSeedValue ^= UDS_ku32LocLevel01;
u32LocalSeedValue = ( u32LocalSeedValue << 7 ) | ( u32LocalSeedValue >> 24 );
return u32LocalSeedValue;
}
種子隨機性:種子隨機性較弱,多次要求出現相同種子的情況。
固定種子:每次取得到的種子相同,這使得爆破出Key成為了可能。
種子恢復:ECU復位後種子相同,每認證一次後復位一次,能夠有效降低爆破的數量級。
安全防護Bypass
拒絕服務
竊聽獲取韌體
非法刷寫
軟體付費繞過
防禦
使用非對稱演算法: 使用29服務取代27服務,29服務支援非對稱演算法,安全性能夠得到很大的提升。即使演算法洩露,也不會造成影響。
安全常數採用安全儲存:自行實現的對稱加密演算法安全常數通常硬編碼在so庫中,容易被逆向出。安全常量應採用安全存放。
演算法邏輯安全: ECU復位後,產生的種子每次都一樣,應避免採用類似缺陷的演算法;敏感功能都受到安全存取保護。
安全配置:Key 的有效長度能夠有效防禦暴力破解等;刷寫前置條件健全,在特定條件下方能執行刷寫流程。
安全啟動:應用程式安全啟動,當安全存取被突破後,拒絕啟動刷入經過篡改的韌體。
安全傳輸:韌體採用加密傳輸,請求下載資料傳輸標識指明為加密傳輸,並對應使用加密韌體。
監測:偵測潛在的攻擊,及時阻斷。
還原:偵測到被竄改,透過備份、雲端等資訊恢復。
參考
ISO14229 Unified diagnostic services (UDS) — Part 1
XXXX ECU刷新規範
車連網安全事件時間軸
汽車安全
Bootloder開發方案(基於UDS)
-
UDS診斷服務基礎篇之27
CANoe中使用CAPL刷寫流程詳解(Trace圖解)
-
SREC (file format) - Wikipedia
Intel HEX file format
Intel HEX - Wikipedia
us-18-Milburn-There-Will-Be-Glitches-Extracting-And-Analyzing-Automotive-Firmware-Efficiently