AUTOMORPHSW Team

UDS $27 安全存取詳解:種子—金鑰流程與測試的攻防邊界

UDS $27 安全存取詳解:種子—金鑰流程與測試的攻防邊界

寫組態、刷韌體、跑危險例程——這些操作前,ECU 都會先問一句:「你有權限嗎?」問這句話的就是 0x27 SecurityAccess。它是一套挑戰—回應機制,也是診斷測試裡邊界條件最多、最值得自動化的一個服務。

本文是 UDS 是什麼 的深入篇;它與資安機制(SecOC 與 E2E)的分工是:$27 管「診斷通道的存取權」,SecOC 管「匯流排訊息的真實性」。

種子—金鑰挑戰回應流程

四步流程:種子—金鑰

  1. 測試端請求種子27 01(子功能 0x01,requestSeed)
  2. ECU 回一組隨機種子67 01 <seed>
  3. 測試端用保密演算法把種子算成金鑰送回:27 02 <key>(子功能 0x02,sendKey)
  4. ECU 用同樣的演算法驗證,通過就解鎖:67 02

奇偶數的規則值得記:奇數子功能請求種子(0x01、0x03…),偶數送金鑰(0x02、0x04…),相鄰的一對奇偶數對應一個安全等級。所以一顆 ECU 可以有多個安全等級——例如 0x01/0x02 解鎖一般寫入、0x11/0x12 解鎖刷寫,各自的金鑰演算法與權限範圍不同。

一個常被誤解的細節:如果請求種子時 ECU 回全零種子,通常代表「這個等級目前已經解鎖了」——不是出錯,是省略後續步驟。

防暴力破解:延遲與鎖定

種子—金鑰若能無限次嘗試,攻擊者暴力試金鑰只是時間問題。所以 $27 內建三道防線,也是測試的重災區:

機制行為對應 NRC
嘗試次數限制連續錯 N 次金鑰後鎖定0x36 exceededNumberOfAttempts
延遲計時(Delay Timer)鎖定後強制等待一段時間才能再試0x37 requiredTimeDelayNotExpired
開機保護有些實作要求 ECU 剛開機的一小段時間內拒絕安全存取0x22 conditionsNotCorrect

延遲計時還有個容易踩的規則:延遲期間即使送對金鑰也會被拒,而且錯誤的嘗試會重置計時。測試若沒覆蓋這條,實車上會出現「密碼明明對卻進不去」的靈異現象——其實是還在罰站。

為什麼種子每次都要不一樣

種子必須是足夠隨機、每次不同的。若種子固定或可預測,攻擊者錄一次合法的「種子—金鑰」配對就能重放——這在資安審查(見 TARA 怎麼做)裡是必查項。種子的隨機性、金鑰演算法的強度、以及演算法本身怎麼保護(不能寫死在容易被讀出的地方),構成 $27 的資安評估三角。

測試清單:正向少、反向多

$27 的測試價值幾乎都在反向案例:

正向(少)

  • 正確種子—金鑰流程,各安全等級都解鎖
  • 解鎖後對應等級的操作確實放行

反向(多,才是重點)

  • 錯誤金鑰 → 0x35 invalidKey,計數器加一
  • 連錯達門檻 → 0x36 鎖定
  • 鎖定期間再試 → 0x37,且錯誤嘗試重置計時
  • 跳過種子直接送金鑰 → 0x24 requestSequenceError
  • 開機保護期內請求 → 0x22
  • 解鎖後切換會話/逾時 → 權限是否正確失效
  • 種子隨機性:多次請求種子不應重複或可預測

「解鎖後權限何時失效」特別容易漏:切換診斷會話、0x3E TesterPresent 斷掉逾時、0x11 ECUReset 之後——這些邊界的權限重置行為,是產線與售後安全的最後一道防線。

一顆 ECU 多個安全等級 × 每個等級一套正反向 × 各種邊界時序,人工測不完也測不準——這是 $27 測試必須自動化(如 CANoe.DiVa 由診斷規格生成)的直接理由。


下一步

從安全存取的等級設計、演算法評估到自動化攻防測試,歐特莫夫(Vector Informatik 合作夥伴)協助把診斷安全建成可驗證、可稽核的證據。