繞過 Tesla Wall Connectors 的韌體降級棘輪機制
Tesla 對安全性的承諾通常涉及實施「安全性棘輪」(security ratchet)——一種防降級機制,可防止裝置被回滾到舊的、可能存在漏洞的韌體版本。然而,Synacktiv 最近的一項分析顯示,Tesla Wall Connector (AW-CU300) 在執行此棘輪機制的方式上存在關鍵缺陷,允許研究人員透過充電埠完全繞過它。
此漏洞突顯了韌體更新程式與啟動載入程式(bootloader)之間的基本脫節,證明了安全性僅取決於啟動鏈中最薄弱的一環。
更新機制與安全性棘輪
要理解此繞過方式,首先必須了解透過 Single-Wire CAN (SWCAN) 進行的標準更新流程。該流程涉及開啟 UDS 會話、透過 Security Access 進行身份驗證、抹除被動韌體插槽、推送新韌體,最後驗證映像檔以切換插槽。
AW-CU300 使用兩個韌體插槽:一個是主動(目前正在執行)的,另一個是被動(更新目標)的。當推送新的更新時,它會被寫入被動插槽。如果驗證成功,插槽會「翻轉」,新的韌體會在下次重新啟動時變為主動狀態。
在韌體版本 24.44.3 中,Tesla 引入了 check_image_and_antidowngrade()。此函數會解析韌體區段以獲取版本描述符 (VRSN) 和棘輪值 (VRS2)。它會將傳入的韌體的棘輪值與儲存在 Persistent Storage Manager (PSM) 中的當前棘輪值進行比較。如果傳入的版本較低,更新將被拒絕,且被動插槽會立即被抹除。
關鍵缺陷:脫節的啟動載入程式
雖然更新程式很警覺,但啟動載入程式 (boot2) 卻不然。啟動載入程式負責啟動過程的最後階段:檢查魔術標頭(magic header)、驗證每個區段的 CRC32,以及驗證 RSA 簽章以對照儲存的金鑰。
至關重要的是,啟動載入程式對安全性棘輪沒有任何概念。 它不會檢查版本號碼或棘輪值;它只關心韌體是否經過正確簽章且具有正確的 CRC。如果滿足這些條件,啟動載入程式就會執行該程式碼。
這意味著防降級保護僅由 UDS 常式 0x201 中的 switch_to_new_firmware() 函數強制執行。如果攻擊者可以將已簽章的舊韌體映像檔放入主動插槽,而未觸發該特定常式,裝置就會毫無疑問地執行它。
執行繞過
此繞過方式依賴於啟動載入程式根據分區表中的 gen_level(世代層級)來決定從哪個插槽啟動。具有最高 gen_level 的插槽會被選為主動插槽。
研究人員發現,g_boot_flags(用於識別目前啟動插槽)是在啟動時設定的,且在會話期間從不更新。這允許了一種特定的操作序列:
- 驗證目前版本: 攻擊者將有效的、最新的韌體推送至被動插槽,並呼叫常式
0x201。這會驗證映像檔並更新分區表,使該插槽獲得最高的gen_level。 - 抹除已驗證的插槽: 在不重新啟動的情況下,攻擊者再次呼叫常式
0xFF00。由於g_boot_flags尚未改變,系統會選擇同一個物理插槽作為被動插槽並抹除該有效韌體。關鍵在於,分區表保持不變;該插槽仍具有最高的gen_level。 - 注入漏洞韌體: 攻擊者將舊的、已簽章但有漏洞的韌體映像檔推送至現在已空的插槽中。
- 重新啟動: 攻擊者跳過驗證常式 (
0x201) 並觸發重新啟動 (0x202)。
重新啟動時,啟動載入程式看到包含舊韌體的插槽具有最高的 gen_level。
它驗證 RSA 簽章(因為韌體是 Tesla 官方發布的,儘管是舊版本,簽章是有效的)並執行它。
影響與緩解措施
透過將裝置回滾到版本 0.8.58,研究人員能夠重新啟用一系列的漏洞利用鏈,包括 Wi-Fi 憑證的 UDS 洩漏、透過 telnet 存取除錯殼層(debug shell),以及參數解析器中的緩衝區溢位。由於 Wall Connectors 通常連接到家庭或商業網路,一個被入侵的充電器可以作為攻擊者滲透進入內部網路的持久性立足點。
Tesla 已針對此漏洞進行了修補。為了防止類似問題,研究人員建議了幾種緩解措施:
啟動載入程式強制執行: 將棘輪檢查移入啟動載入程式,使得任何低於當前棘輪層級的韌體版本都無法被啟動。
分區無效化: 確保常式
0xFF00在抹除插槽時會使分區佈局條目無效,防止被抹除後再重寫的插槽被選為可啟動插槽。會話限制: 在更新成功後強制進行重新啟動,或在佈局已寫入後拒絕新的更新會話。
正如社群所指出的,雖然有些用戶可能將此視為重新獲得對硬體控制權(例如禁用不想要的 Wi-Fi 熱點)的方法,而從安全性的角度來看,這代表了裝置信任鏈中的一個重大漏洞。