TECH ARTICLE

【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 6CAN High(ISO 15765-4)
Pin 14CAN 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 串接,從找到端點到完成盤點全程自動化:

01

ISO-TP 端點探索

IsotpScan 找出 CAN 匯流排上的 ISO-TP 端點與定址、Padding 設定。

02

OBD 協定確認

ObdProtocolTest 確認端點是否支援 OBD,產生 ObdIsotpEndpoint。

03

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.3ECU 回應任意測試儀送出的服務 08 TID,一則未認證的診斷訊息即可請求控制車上系統CWE-306

6. 法規與標準對應

法規 / 標準對應內容
UNECE R1557.3.6 型式認證前須以測試驗證資安措施的有效性
UNECE R1567.2.1.2.2 要求 RXSWIN 必須能透過標準介面(OBD 連接埠)讀取;ObdScan 的服務 09 盤點可顯示有哪些軟體識別資料可讀(不驗證 RXSWIN 內容正確性)
GB 44495-20246.6 以測試驗證資安措施;7.1.4.1 車輛外部介面(含診斷介面)須實施存取控制,禁止未授權存取
ISO/SAE 21434Clause 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 洽詢。