Gallia:一款針對汽車安全的可擴展滲透測試框架
關于Gallia
Gallia是一款專注于汽車安全的可擴展滲透測試框架,該工具可以對整輛汽車執行滲透測試,而且甚至可以還可以單獨對車輛ECU進行測試。目前,Gallia主要針對的是UDS接口,并利用了模塊化的設計分別實現了日志記錄和歸檔功能。作為一個通用接口,日志記錄功能實現了可重復的測試,并支持后續處理任務。
工具架構
下圖顯示的是Gallia的內部模塊以及運行機制:

工具依賴
Linux>= 5.10
Python>= 3.9
poetry (可選,用于開發)
dumpcap (可選,WireShark組件)
Python依賴組件可以在項目的pyproject.toml文件中查看。
掃描模式
常規的UDS掃描通常包含下列步驟:
1、在相關設備上搜索ECU:發現掃描;
2、在找到的ECU上搜索UDS服務:服務掃描;
3、在發現的UDS服務中搜索UDS標識符:標識符掃描;
4、針對其他特定服務的掃描:例如內存掃描、模糊測試等;
發現掃描
發現掃描特定于底層傳輸,如DoIP或ISO-TP。這個想法是制定一個有效的UDS Payload。正常工作的Payload是1001,這也是DiagnosticSessionControl服務所要求的。該請求可以讓ECU修改DefaultSession。DiagnosticSessionControl服務和DefaultSession是始終可用的,因此這個Payload是最佳選擇。除此之外,1003這個Payload也可以使用,因為很多ECU在啟用ExtendedDiagnosticsSession(會話ID為0x03)時會提供聲音反饋。
ECU的尋址由底層傳輸協議提供,大多數情況下有兩個地址:測試器地址和ECU地址。發現掃描的基本思想是使用固定的測試器地址將有效的UDS Payload發送到所有有效的ECU地址。當收到有效應答時,說明找到了ECU。
服務掃描
服務掃描在UDS協議級別運行,UDS提供了幾個稱為服務的節點。每個服務都有一個標識符和一個特定的參數列表,掃描過程是使用固定Payload去請求所有可能的服務。Payload不必是特定的;它可以是空的,也可以是全零。一些ECU在接收到無效Payload時可能表現得不是很穩定。
為了識別可用的服務,工具使用了反向匹配機制。根據UDS標準,當請求未實現的服務時,ECU會使用錯誤代碼serviceNotSupported或serviceNotSupportedInActiveSession進行回復。因此,每個以不同錯誤代碼響應的服務都被認為是可用的。
標識符掃描
標識符掃描在UDS協議級別運行,更具體地說,它在特定UDS服務的級別上運行。大多數UDS服務需要標識符作為輸入參數。比如說,ReadDataByIdentifier服務需要為請求的資源輸入數據標識符。為了找出特定服務的可用標識符,工具引入了標識符掃描。
為了識別可用的數據標識符,工具使用了反向匹配機制。根據UDS標準,當請求未實現的服務時,ECU將使用錯誤代碼serviceNotSupported或serviceNotSupportedInActiveSession進行回復。如果ECU響應serviceNotSupported、serviceNotSupportedInActiveSession、subFunctionNotSupported、subFunctionNotSupportedInActiveSession或requestOutOfRange中的任何一個,則認為標識符不可用。
一些服務(如RoutineControl)也提供了一個子功能,可以使用相同的技術發現子函數參數,但反向匹配的錯誤代碼不同。為了發現可用的子功能,以下錯誤代碼表示該子功能不可用:serviceNotSupported、serviceNotSupportedInActiveSession、subFunctionNotSupported或subFunctionNotSupportedInActiveSession。
每個以不同錯誤代碼響應的標識符或子功能都被視為可用。
工具安裝
Arch Linux
paru -S gallia
手動安裝
pip install gallia
工具使用
$ gallia simple-dtc --target "isotp://can0?src_addr=0x123&dst_addr=0x312&tx_padding=0xaa&rx_padding=0xaa" read