【dSPACE dissecto HydraVision 測試精解】
OBD-II 診斷協定與資安掃描
從 SAE J1979 協定基礎、OBD 服務與識別碼,到使用 Scapy 與 HydraVision 自動盤點 OBD 連接埠上可讀取的資料,解析 OBD 介面的資安風險與 UNECE R155、GB 44495、ISO/SAE 21434 的驗證對應。
OBD-II(On-Board Diagnostics)是法規強制要求的排放相關診斷介面,透過車上的 16 針診斷連接器對外開放。與各車廠自訂的 UDS 診斷不同,OBD-II 由 SAE J1979 / ISO 15031 標準化,同一組請求可以在不同品牌的車輛上使用——這讓它成為維修廠、檢驗站與各種 OBD 外掛裝置(Dongle)的共通語言,但同時也意味著:任何能接觸到 OBD 連接埠的人,都能在未經認證的情況下讀取車輛資料。也因此,盤點 OBD 服務能洩漏哪些資訊,是車用資安測試中的標準檢查項目。本文將介紹 OBD-II 的協定基礎,以及如何使用 Scapy 與 dSPACE dissecto HydraVision 進行自動化掃描。
1. OBD-II 協定基礎(SAE J1979)
OBD-II 支援多種實體通訊方式,但現代車輛幾乎都採用 CAN 匯流排(ISO 15765-4),本文也以 CAN 為主。OBD 的核心特性如下:
| 項目 | 說明 |
|---|---|
| 應用層標準 | SAE J1979 / ISO 15031-5:定義排放相關診斷服務與參數識別碼 |
| 傳輸層 | ISO-TP(ISO 15765-2),負責將較長的訊息分段傳送 |
| CAN 定址(ISO 15765-4) | 標準請求 ID 0x7DF(29 位元:0x18DB33F1),回應 ID 0x7E8(29 位元:0x18DAF111) |
| 服務數量 | 10 個診斷服務(Mode),主要用於讀取資料 |
| 認證機制 | 無——OBD 服務不需要 Session 切換或 SecurityAccess 即可存取 |
功能定址與實體定址:0x7DF 是功能(廣播)請求識別碼——測試儀發出一次請求,所有支援 OBD 的 ECU 都可以回應;0x7E8 則是第一個 ECU(通常是引擎控制模組)的實體回應識別碼,其他 ECU 依序使用 0x7E9~0x7EF。
1.1 OBD-II 連接器(CAN 相關腳位)
| 腳位 | 功能 |
|---|---|
| Pin 6 | CAN High(ISO 15765-4) |
| Pin 14 | CAN Low(ISO 15765-4) |
| Pin 4 / Pin 5 | 底盤接地 / 訊號接地 |
| Pin 16 | 電瓶正極(常電) |
2. OBD-II 服務與識別碼
OBD-II 以編號的服務(Service,舊稱 Mode)組織功能,部分服務再以識別碼細分要讀取的資料:
| 服務 | 功能 | 識別碼 | 資安觀點 |
|---|---|---|---|
0x01 | 即時動力系統資料(車速、轉速、水溫等) | PID | 車輛運作資料外洩 |
0x02 | 凍結畫面資料(故障發生當下的快照) | PID | 事件當下的車輛狀態外洩 |
0x03 | 已儲存的故障碼(DTC) | — | 揭露車輛故障歷史 |
0x04 | 清除故障碼與診斷資訊 | — | 會改變 ECU 狀態,可能掩蓋故障紀錄 |
0x06 | 車載監控測試結果 | MID | 系統監控資料外洩 |
0x07 | 待確認的故障碼(Pending DTC) | — | 揭露最近的異常 |
0x08 | 車載系統、測試或元件的控制 | TID | 可能觸發車上功能動作,非單純讀取 |
0x09 | 車輛資訊(VIN、校正 ID、ECU 名稱等) | IID | 車輛身分與軟體版本外洩,可用於指紋辨識 |
0x0A | 永久故障碼(Permanent DTC) | — | 揭露無法清除的故障紀錄 |
支援清單的位元遮罩:每個服務的 PID / IID 0x00、0x20、0x40…0xE0 是特殊的「支援清單」請求,回應是一個位元遮罩,標示接下來 32 個識別碼中哪些有被 ECU 支援。掃描工具會先讀取這些遮罩,再只請求 ECU 宣告支援的識別碼,大幅縮短掃描時間。
3. 使用 Scapy 操作 OBD
開源封包工具 Scapy 的車用擴充模組(scapy.contrib.automotive)完整支援 OBD,也是 HydraCore 測試框架的底層。以下逐步示範:
3.1 載入模組與建立 Socket
# 載入 OBD 與 ISO-TP 模組 load_contrib("automotive.obd.obd") load_contrib("isotp") # 建立 ISO-TP Socket,以 OBD 格式解析回應 socket = ISOTPSocket("can0", tx_id=0x7DF, rx_id=0x7E8, basecls=OBD)
3.2 查詢支援的 PID
以服務 01、PID 0x00 查詢 ECU 支援的參數清單,再依序以 0x20、0x40 查詢後續區段:
resp = socket.sr1(OBD()/OBD_S01(pid=0)) resp.show() ###[ On-board diagnostics ]### service = CurrentPowertrainDiagnosticDataResponse ###[ PID_00_PIDsSupported ]### supported_pids= PID20+PID1F+PID1C+PID15+PID13+PID11+PID0F+ PID0E+PID0D+PID0C+PID0B+PID07+PID06+PID05+ PID04+PID03+PID01 socket.sr1(OBD()/OBD_S01(pid=0x20)).show() # → PID40+PID34+PID33+PID31+PID30+PID23+PID21 socket.sr1(OBD()/OBD_S01(pid=0x40)).show() # → PID56+PID51+PID4C+PID49+PID47+PID46+PID45
注意每個回應的最後一個位元(例如 PID00 回應中的 PID20)代表「下一個區段還有支援的 PID」,掃描時就依此決定是否繼續查詢。
3.3 讀取 PID 資料與車輛資訊
# 讀取 PID 0x05:引擎冷卻液溫度 socket.sr1(OBD()/OBD_S01(pid=0x5)).show() ###[ PID_05_EngineCoolantTemperature ]### data = 41.0 deg. C # 讀取服務 09、IID 0x0A:ECU 名稱 socket.sr1(OBD()/OBD_S09(iid=0xa)).show() ###[ IID_0A_EcuName ]### count = 1 ecu_names = ['ECM\x00-EngineControl']
3.4 OBD_Scanner:自動擷取所有可用資訊
手動逐一查詢費時費力。Scapy 的 OBD_Scanner 可以自動走訪所有服務與識別碼,並產出統計報表:
load_contrib("automotive.obd.scanner") s = OBD_Scanner(socket) s.scan(timeout=10) s.show_testcases() Available data in OBD service 09 9 requests were sent, 9 answered, 0 unanswered 1 negative responses were received NRC 0x12: subFunctionNotSupported-InvalidFormat received 1 times 0x00 IID_00_Service9SupportedInformationTypes | supported_iids=IID12+IID0F+IID0A+IID08+IID06+IID04+IID02 0x02 IID_02_VehicleIdentificationNumber | vehicle_identification_numbers=['WDD1xxxxxxxxxxx11'] 0x0a IID_0A_EcuName | ecu_names=['ECM\x00-EngineControl']
報表會列出每個服務送出與回應的請求數、回應時間統計、收到的負面回應碼,以及每個識別碼實際讀到的內容——例如上例中,未經任何認證就讀出了車輛識別碼(VIN)與 ECU 名稱。
4. HydraVision 的 OBD 測試流程
HydraVision 將上述手動流程包裝成標準化的測試案例,並透過目標 Context 串接,從找到端點到完成盤點全程自動化:
ISO-TP 端點探索
IsotpScan 找出 CAN 匯流排上的 ISO-TP 端點與定址、Padding 設定。
OBD 協定確認
ObdProtocolTest 確認端點是否支援 OBD,產生 ObdIsotpEndpoint。
OBD 服務掃描
ObdScan 盤點所有未經認證即可讀取的識別碼與故障碼,並寫入結果與產出檔案。
針對整車測試,另有 VehicleObdProtocolTest 與 VehicleObdScan 等車輛層級版本,可對整車網路中探索到的 ECU 逐一執行。
4.1 ObdProtocolTest:確認端點是否支援 OBD
- 做法:(可選)先將 ECU 斷電重啟,再對 ISO-TP 端點送出一次服務 01、PID
0x00請求,等待最多 1 秒。 - 判定:收到
0x41(服務 01 的正面回應)或0x7F(負面回應)都代表端點支援 OBD——兩者都是格式正確的 OBD 回應;逾時或其他回應則判定為不支援。 - 輸出:回傳的
ObdIsotpEndpoint會成為新的 Context 項目,並記錄 RX/TX ID、延伸位址與 Padding 設定,供後續ObdScan使用。 - 定位:OBD 服務可存取本身並非弱點,因此此測試不會產生警告,而是確認「入口在哪裡」。
4.2 ObdScan:盤點可讀取的資料
ObdScan 會先將 ECU 斷電重啟,再以 Scapy OBD_Scanner 依下列順序掃描所有排放相關服務:
# ObdScan 掃描順序 01 → 02 → 06 → 08 → 09 # 先讀支援清單位元遮罩(0x00, 0x20 … 0xE0),再只請求支援的識別碼 03 → 07 → 0A # 各送一次請求,讀取已儲存/待確認/永久故障碼
- 不切換 Session、不做 SecurityAccess:整個掃描都在初始狀態下進行,反映的正是「任何人接上 OBD 就能讀到什麼」。
- 可靠的復原機制:掃描器以電源控制作為重置處理器、以
ObdIsotpEndpoint.reconnect()作為重新連線處理器,每個服務掃描之間都能讓 ECU 回到乾淨狀態。 - 結果輸出:結果摘要列出可讀取的 Parameter、Monitoring、Test 與 Information ID 數量,服務 01、02、06、08、09 的每一筆正面回應各寫成一列結果;故障碼與完整掃描狀態則保存在 JSON 與文字格式的產出檔案中。
- 判定:若有請求未獲回應,結果為
EXECUTED_WITH_WARNING——這通常代表連線中斷,而非安全發現,應先確認測試環境;沒有未回應請求且無例外時為EXECUTED_SUCCESSFUL。
5. OBD 介面的資安風險
OBD 連接埠是車輛最容易接觸的實體介面之一,常見的風險情境是一個長期插在車上的 OBD Dongle。HydraVision 的 OBD 測試案例對應了以下 UNECE R155 附件 5 威脅:
| R155 威脅 | 情境 | 相關 CWE |
|---|---|---|
| 18.3 | 透過 OBD 診斷存取作為攻擊跳板;OBD 掃描本身就是透過診斷介面發動攻擊前的偵察步驟 | CWE-419、CWE-1263 |
| 7.2 | 服務 01、02、06、09 的資料可在未經認證下被讀取 | CWE-200 |
| 19.2 | 服務 09 洩漏 VIN 與校正 ID,可用於辨識車輛與軟體版本,涉及車主隱私與車輛電子身分 | CWE-497 |
| 11.3 | ECU 回應任意測試儀送出的服務 08 TID,一則未認證的診斷訊息即可請求控制車上系統 | CWE-306 |
6. 法規與標準對應
| 法規 / 標準 | 對應內容 |
|---|---|
| UNECE R155 | 7.3.6 型式認證前須以測試驗證資安措施的有效性 |
| UNECE R156 | 7.2.1.2.2 要求 RXSWIN 必須能透過標準介面(OBD 連接埠)讀取;ObdScan 的服務 09 盤點可顯示有哪些軟體識別資料可讀(不驗證 RXSWIN 內容正確性) |
| GB 44495-2024 | 6.6 以測試驗證資安措施;7.1.4.1 車輛外部介面(含診斷介面)須實施存取控制,禁止未授權存取 |
| ISO/SAE 21434 | Clause 10 產品開發階段的弱點掃描(RQ-10-07、WP-10-07);Clause 15 TARA 的威脅情境(WP-15-03)與攻擊路徑(WP-15-04)輸入 |
| AIS 189(印度) | 7.3.6 與 Annexure D,威脅與緩解編號與 R155 相同 |
| EU CRA | 型式認證車輛不在 CRA 範圍內,但售後 OBD Dongle 與診斷轉接器仍適用,需定期測試其安全性並符合安全預設與最小攻擊面要求 |
7. 開發端防護建議
介面存取控制(M22)
只開放法規要求的排放相關資料,超出範圍的功能都需經過認證的診斷 Session。
資料最小化(M8)
以系統設計與存取控制限制可經 OBD 讀取的資料,特別是與車輛身分或車主相關的識別資訊。
訊息驗證(M10)
對會觸發控制功能的診斷訊息驗證其真實性與完整性,而非對任何格式正確的請求都照單全收。
8. 執行注意事項
-
服務 08 不是單純讀取:服務 08 用於請求控制車上系統、測試或元件,列舉其 TID 可能讓受測 ECU 執行實際動作。
-
掃描會斷電重啟 ECU:ObdScan 在掃描前與各服務掃描之間會透過電源控制重置 ECU,請確認受測對象可以安全地重複斷電。
-
未回應不等於安全發現:結果出現未回應的請求時,多半是連線中斷,應先檢查線路與匯流排狀態再重新執行。
-
僅在授權環境執行:請勿在行駛中的車輛上執行掃描,建議在台架或靜止的測試車輛上進行。
9. 捷策動能技術支援
Jotactic 捷策動能提供 dSPACE dissecto HydraVision 相關的全方位技術服務:
測試規劃
依 UNECE R155 / R156、GB 44495、ISO/SAE 21434 需求規劃診斷介面安全測試。
技術諮詢與結果判讀
協助判讀 OBD 掃描結果,評估資料外洩風險並提出改善建議。
教育訓練與 Demo
Scapy 車用模組與 HydraVision 操作教育訓練,以及客製化 Demo 專案驗證。
歡迎來電 03-6109669 或來信 info@jotactic.com 洽詢。