王 勇, 李亞菲, 陳雪鴻, 劉麗麗, 吳 旻
(1.上海電力大學, 上海 200090; 2.國家工業(yè)信息安全發(fā)展研究中心, 北京 100040;3.華電電力科學研究院有限公司國家能源分布式能源技術研發(fā)(實驗)中心, 浙江 杭州 310030)
控制器局域網(wǎng)(Controller Area Network,CAN)是串行通信協(xié)議的一種,目前包括CAN2.0A和CAN2.0B兩個版本。電池管理系統(tǒng)(Battery Management System,BMS)與充電機的通信采用CAN2.0B,具有通信速度快、距離遠,可同時連接多個CAN節(jié)點,多主控制等優(yōu)點,但協(xié)議本身存在一些安全漏洞,使得電動汽車在充電過程中面臨著一系列信息安全問題。例如:黑客故意攻擊充電樁,使充電樁無法給電動汽車正常充電;惡意竊取用戶的充電賬號、支付密碼以及充電位置等個人信息,侵犯用戶的隱私權;有些用戶可能會去篡改相關充電數(shù)據(jù),減少計費,給運營公司的利益帶來損害[1]。
針對上述問題,當前國內(nèi)外有關CAN協(xié)議的安全性研究主要包括CAN總線異常檢測、數(shù)據(jù)加密傳輸與認證、防火墻技術、安全框架研究等。
在CAN總線異常檢測領域,于赫等人[2]提出了基于信息熵及消息相對距離的車載CAN總線網(wǎng)絡異常檢測方法。張子鍵等人[3]提出了一種新的總線異常檢測算法,并設計了可以訪問CAN總線的異常檢測系統(tǒng)。張浩和楊進華[4]在仿真軟件CANoe的環(huán)境下,建立了整車單幀診斷的模型,完成了對汽車單幀診斷的仿真研究。
在數(shù)據(jù)加密傳輸與安全認證方面,趙兵等人[5]采用國密SM1加密算法,設計了一種具備安全防備功能的充電控制策略,能夠避免數(shù)據(jù)在通信過程中被非法截取或改動。趙翔等人[6]采取嵌入式系統(tǒng),采用密鑰池技術簡化加密算法,增大了電動汽車充電數(shù)據(jù)的破解難度。高德欣和梁珂[7]通過采用SHA1不可逆加密算法,將用戶信息加密存到數(shù)據(jù)庫和分賬戶權限管理中,并采用DES+RSA算法進行數(shù)據(jù)傳輸設計,增加了電動汽車充電監(jiān)控系統(tǒng)數(shù)據(jù)的安全性。
在防火墻技術研究方面,唐良等人[8]針對當前車載網(wǎng)絡中面臨的信息安全問題,設計了一種類似于防火墻功能的車載網(wǎng)關,用來過濾傳統(tǒng)以太網(wǎng)的威脅數(shù)據(jù)包。肖鵬等人[9]提出了一種針對車載信息系統(tǒng)安全的防火墻技術,在一定程度上可以避免外部網(wǎng)絡的攻擊。
在安全框架研究方面,LI H等人[10]從CAN總線以及3G網(wǎng)絡入手,構造了以防火墻、入侵檢測體系為主的電動汽車充電信息安全防備架構。H?FER C等人[11]采用隱私影響評價方法,研究了ISO 15118標準中對充電設施充電以及支付的隱私保護策略,并設計了基于匿名證書等隱私增強技術的隱私保護系統(tǒng)。FAZOUAUE M等人[12]針對ISO 15118標準中提到的POPCORN隱私保護協(xié)議,指出了其存在的問題,并給出了相應的改進措施。
上述4個方面的研究在一定程度上解決了CAN協(xié)議的通信安全問題。但在數(shù)據(jù)加密傳輸和安全認證方面仍存在一定的問題,如趙兵等人提出的國密SM1加密算法,可以防止CAN數(shù)據(jù)被非法截獲或篡改,但并不能夠抵御重放攻擊。就電動汽車充電過程中遭到的重放攻擊而言,目前研究較多的是文獻[2]提出的異常檢測方法用來檢測重放攻擊,但并未給出電動汽車充電CAN總線遭到重放攻擊時具體的防御措施。
本文針對當前存在的問題,在使用STM32F767單片機、USB-CAN轉(zhuǎn)換器和PC機實現(xiàn)了有關CAN協(xié)議的環(huán)回通信以及與PC之間的通信后,分析了CAN協(xié)議的安全性,然后采用JAVA編寫的程序模擬電動汽車的充電過程,進行重放攻擊,并通過加隨機數(shù)來有效抵御重放攻擊,以保證電動汽車充電通信過程的信息安全。
CAN總線系統(tǒng)一般由4部分組成,如圖1所示。
圖1 CAN總線系統(tǒng)結構
(1) CAN控制器 接收控制單元中微處理器發(fā)出的數(shù)據(jù),處理數(shù)據(jù)并傳給CAN收發(fā)器。
(2) CAN收發(fā)器 用于將數(shù)據(jù)發(fā)送到總線或從總線接收數(shù)據(jù)至控制器。
(3) CAN數(shù)據(jù)傳輸終端 是一個電阻,可以避免數(shù)據(jù)在線端被反射,大部分情況下為120 Ω。
(4) 兩條CAN數(shù)據(jù)傳輸線 能夠雙向傳輸數(shù)據(jù),被稱為CAN-H和CAN-L,其電位相反,但電壓總和總是為一常數(shù),可以免受外界電磁干擾,對外也無輻射。
CAN設備以封包的形式在CAN網(wǎng)絡上傳輸數(shù)據(jù),這些封包稱為幀。CAN幀指完整的CAN傳輸單元,包含仲裁ID、數(shù)據(jù)字節(jié)、確認位等。標準CAN幀格式如圖2所示。
圖2 標準CAN幀格式
(1) SOF(幀起始)位 用邏輯0表示消息開始。
(2) 仲裁ID 消息的識別碼并定義優(yōu)先級。幀有兩種格式,標準幀有11位仲裁ID,擴展幀有29位仲裁ID。
(3) DE(標識符擴展)位 區(qū)分標準幀和擴展幀。
(4) RTR(遠程傳輸請求)位 來劃分遠程幀和數(shù)據(jù)幀,邏輯0即數(shù)據(jù)幀,邏輯1即遠程幀。
(5) DLC(數(shù)據(jù)長度碼) 表示數(shù)據(jù)段包含的字節(jié)數(shù)量。
(6) 數(shù)據(jù)段 包含0~8字節(jié)的數(shù)據(jù)。
(7) CRC(循環(huán)冗余校驗) 包括15位的循環(huán)冗余校驗碼和一個隱性分隔符位。CRC段用于檢測錯誤。
(8) ACK(ACK確認)槽 正確接收消息的控制器均會在消息末尾附加一個ACK位發(fā)送。傳輸節(jié)點檢查總線上的ACK位,如未發(fā)現(xiàn)ACK位,則重新發(fā)送消息。
(9) EOF 幀結束位。
CAN總線協(xié)議是一種串行通信協(xié)議,CAN節(jié)點廣播發(fā)送數(shù)據(jù)給網(wǎng)絡中的所有節(jié)點。CAN收發(fā)器收到數(shù)據(jù)后就將其送給CAN控制器,再由CAN控制器判斷是否是所需要的信息,否則忽略它。CAN協(xié)議在數(shù)據(jù)鏈路層處理數(shù)據(jù)的流程如圖3所示。
圖3 CAN協(xié)議在數(shù)據(jù)鏈路層處理數(shù)據(jù)的過程
在剛開始設計時,CAN協(xié)議只考慮將幾個節(jié)點與可靠的網(wǎng)絡連接起來,替代之前點對點的通信系統(tǒng),減少系統(tǒng)布線的數(shù)量及復雜性,當時并沒有考慮安全性。但是現(xiàn)代汽車可以連接更多的節(jié)點,最終用戶可以輕松訪問CAN總線,這就容易引發(fā)CAN總線的安全性問題,如嗅探、重放、幀偽造和幀注入攻擊等各種安全問題。
CAN協(xié)議的特點如下。
(1) CAN總線協(xié)議是沒有認證方案的廣播協(xié)議[13]。由于接入到CAN總線的所有節(jié)點都能接收到其他某個CAN節(jié)點發(fā)送的數(shù)據(jù),故其數(shù)據(jù)容易遭到竊聽,就有可能受到重放攻擊。攻擊者有可能接入到CAN總線,接收充電樁與電動汽車電池管理系統(tǒng)互相通信的報文,然后在任意時間重放到CAN總線網(wǎng)絡中,干擾電動汽車正常的充電過程。
(2) CAN數(shù)據(jù)缺乏加密功能。該總線協(xié)議采用明文的方式傳輸數(shù)據(jù),不包含加密、認證機制,也無異常檢測系統(tǒng),雖然現(xiàn)在有不少研究者可以通過采取加密和身份認證的方法來保證CAN數(shù)據(jù)的完整性和機密性,但無法同時兼顧網(wǎng)絡的可用性。
(3) CAN總線支持多主工作。連接在CAN總線上的所有CAN節(jié)點都具有相同的訪問權限,任何一個CAN節(jié)點可以在任何時候發(fā)CAN數(shù)據(jù),但其中不包括源地址和目的地址;反之,該幀由一個全網(wǎng)唯一的仲裁ID標記。
(4) CAN總線仲裁機制容易阻塞信道。如多個節(jié)點在同一時間向總線發(fā)消息,優(yōu)先級最高(即仲裁ID最低)的節(jié)點自動優(yōu)先發(fā)送,否則必須等到總線空閑時才可再次發(fā)送消息,標識符越小優(yōu)先級越高。如果某個CAN節(jié)點持續(xù)發(fā)送高優(yōu)先級的消息,則會造成信道的阻塞,影響正常的CAN通信。
由此可知,由于CAN總線的廣播特性以及CAN幀中沒有包含發(fā)送節(jié)點的地址信息,使得CAN總線容易受到重放攻擊。電動汽車在充電過程中可能遭受重放攻擊的環(huán)節(jié)如圖4所示。
圖4 充電過程中遭到重放攻擊
圖4中,第三方攻擊者通過非法接入CAN總線,利用該總線采用廣播通信的特點,連接到CAN總線上的CAN節(jié)點可以接收由其中一個CAN節(jié)點發(fā)送的消息,并且攻擊者可以惡意地向充電樁或電動汽車重復發(fā)送之前從CAN總線接收的報文信息,從而干擾正常的充電過程,給用戶帶來不便。
本文以STM32F767單片機為主控制芯片,進行數(shù)據(jù)的采集和處理,來實現(xiàn)CAN數(shù)據(jù)的收發(fā),并通過CAN總線實現(xiàn)與PC機的數(shù)據(jù)互傳以及環(huán)回模式下的報文自發(fā)自收。通信的總體框架包括PC機、USB-CAN轉(zhuǎn)換器、CAN收發(fā)模塊電路(本文選用STM32F767單片機)3個部分。通過采用USB-CAN轉(zhuǎn)換器可以將PC機接入總線進行數(shù)據(jù)的收發(fā),能夠通過控制界面觀測從總線上收到的數(shù)據(jù),并且向總線上發(fā)送幀。PC機與STM32F767單片機上的CAN模塊通信的總體框圖如圖5所示。實驗硬件設備物理連接情況如圖6所示。
圖5 CAN模塊通信過程
圖6 實驗硬件環(huán)境搭建
在完成物理連接后,在終端電腦上安裝并運行串口助手及Embeded Debug v2.0軟件。
STM32F767單片機的開發(fā)環(huán)境采用的是Keil Software公司推出的支持JTAG調(diào)試接口的開發(fā)工具Keil u Vision5。由于flymcu暫時不支持STM32F767單片機通過串口下載代碼,所以只能通過ST_LINK仿真器將編譯無誤的程序下載至開發(fā)板上。本文通過C++編寫的程序包含系統(tǒng)及外設初始化、CAN控制器初始化、數(shù)據(jù)收發(fā)和處理部分3個部分[13],通過按鍵KEY_UP,能夠切換CAN通信的模式——環(huán)回模式(Loop Back Mode)以及正常模式(Normal Mode),通過串口助手以及Embeded Debug v2.0可以查看CAN數(shù)據(jù)的發(fā)送與接收情況。
本文通過有關CAN協(xié)議的環(huán)回通信以及與PC機之間的通信,來驗證CAN協(xié)議采用明文的方式進行數(shù)據(jù)傳輸以及CAN幀中不包含源地址和目的地址信息。
CAN總線的環(huán)回模式通信也就是進行報文的自發(fā)自收,bxCAN把發(fā)出去的報文又當做接收的報文,并保留在接收郵箱里,而沒有把報文送到CAN總線上。通過按下鍵KEY0,CAN1,CAN2模塊發(fā)送數(shù)據(jù),并在串口助手上選擇相應的串口,設置波特率為115 200 B,則可以在串口助手的界面看到CAN1和CAN2模塊均發(fā)送成功,以及發(fā)送的數(shù)據(jù),如圖7所示。
圖7 環(huán)回模式下發(fā)送數(shù)據(jù)
STM32F767單片機與PC機之間在正常模式下通信,兩個CAN節(jié)點之間的通信,可以向總線上發(fā)送消息,也可以從總線上接收消息。然而PC機并不能與總線直接相連,要通過USB-CAN轉(zhuǎn)換器才能往總線上收發(fā)數(shù)據(jù)。USB-CAN轉(zhuǎn)換器是將USB協(xié)議和CAN協(xié)議進行轉(zhuǎn)換的網(wǎng)關,也稱為PC-CAN,可以方便用戶在計算機上記錄、分析以及監(jiān)控現(xiàn)場數(shù)據(jù)CAN消息[14]。USB-CAN轉(zhuǎn)換器內(nèi)部的CAN控制器收到總線上的信號后,再經(jīng)過USB接口傳給PC機;同樣,PC機通過USB接口將數(shù)據(jù)發(fā)送給轉(zhuǎn)換器內(nèi)部的CAN控制器,然后將其發(fā)到總線上[15]。由于STM32F767單片機只有一個CAN模塊連接到了CAN總線上,因此只有一個CAN模塊可以從CAN總線上收發(fā)數(shù)據(jù)。本文選擇相應的端口號,設置波特率為115 200 B,再通過上位機軟件Embeded Debug v2.0實現(xiàn)CAN數(shù)據(jù)的收發(fā)。
通過設置發(fā)送數(shù)據(jù)的ID,8位數(shù)據(jù)以及幀的類型,可以完成PC機向開發(fā)板的通信,如圖8所示。通過按鍵KEY0,可以由開發(fā)板向PC機發(fā)送ID為0X012的8位標準CAN數(shù)據(jù)幀,如圖9所示。
圖8 PC機發(fā)送CAN數(shù)據(jù)
圖9 PC機接收CAN數(shù)據(jù)
通過對比報文傳輸界面可以發(fā)現(xiàn),CAN協(xié)議確實是通過明文進行數(shù)據(jù)傳輸,無任何的加密,并且CAN幀中無源地址和目的地址,容易遭到重放攻擊。
重放攻擊,也可稱為重播攻擊、回放攻擊,是指攻擊者利用攔截或其他手段竊取客戶端發(fā)送給服務器的數(shù)據(jù)包,然后惡意或欺騙性地將被盜數(shù)據(jù)一次又一次地發(fā)送給服務器[16]。由于重放攻擊并不需要知道監(jiān)聽的信息是什么,只要做到重復發(fā)送該數(shù)據(jù)就可以了,所以一般采用的加密和身份認證只能防止數(shù)據(jù)被監(jiān)聽,并不能防御重放攻擊。電動汽車充電過程中,遭到重放攻擊的過程如圖10所示。
圖10 重放攻擊過程
目前,大多學者研究的是電動汽車電池管理系統(tǒng)與充電樁之間的數(shù)據(jù)加密傳輸和身份認證。對數(shù)據(jù)進行加密,是為了防止數(shù)據(jù)被監(jiān)聽攻擊,其關鍵在于確保數(shù)據(jù)的安全保密性;身份認證用于判定某個身份是否真實,確定身份后才能根據(jù)不同的身份分配不同的權限,其關鍵在于用戶的真實性。兩種防御措施都不能夠抵御重放攻擊。本文在數(shù)字簽名的基礎上,提出了加隨機數(shù)防御重放攻擊的算法,其詳細步驟如下。
(1) 設置隨機數(shù)更新規(guī)則。本文采取JAVA中的new Random()函數(shù)產(chǎn)生一個長度為10的隨機數(shù),該規(guī)則可以為不同的消息設置不同的隨機數(shù),使消息請求的隨機數(shù)都具有新鮮性。
(2) 發(fā)送方與接收方進行消息的互相傳輸時,預先為消息建立對應的隨機數(shù)。
(3) 發(fā)送方在傳輸數(shù)據(jù)時將產(chǎn)生的隨機數(shù)一起傳給接收方。
(4) 接收方在收到消息和隨機數(shù)后,在自己的數(shù)據(jù)庫中檢測該消息請求的隨機數(shù)是否出現(xiàn)過,如果檢測到該隨機數(shù)與之前某次發(fā)送數(shù)據(jù)所攜帶的數(shù)據(jù)重復,則可以認為遭到了重放攻擊[17]。
(5) 接收方為每次接收到的隨機數(shù)建立相應的索引并將其儲存在數(shù)據(jù)庫中。
加隨機數(shù)抵御重放攻擊算法流程如圖11所示。
本實驗在用隨機數(shù)抵御重放攻擊時,先用MD5加密算法對傳輸?shù)拿魑臄?shù)據(jù)進行哈希值的計算,然后再將其和產(chǎn)生的隨機數(shù)一起發(fā)送給接收方,接收方在收到信息后首先用發(fā)送方的公鑰進行解密得到明文數(shù)據(jù),比較解密后的數(shù)據(jù)和原來的明文數(shù)據(jù),然后再檢測隨機數(shù)是否是第一次出現(xiàn),從而保證數(shù)據(jù)的完整性,并有效抵御重放攻擊。程序算法描述如圖12所示。
圖12 程序算法描述
本實驗以加隨機數(shù)抵御重放攻擊的算法為基礎,在Windows10操作系統(tǒng)中,使用Eclipse Java 2018進行編程。模擬的電動汽車充電過程中有3種模式可供用戶選擇,如表1所示。
表1 3種充電模式
3種情況下的實驗結果與分析如下。
(1) 正常充電模式。本文通過JAVA編寫的程序模擬電動車充電的過程,當輸入“0”時,進入電動汽車正常充電的模式,如圖13所示。通過對CAN幀的分析可知,主要通過充電樁發(fā)給電動汽車BMS報文中的電壓值的變化來體現(xiàn)整個充電過程的變化。
圖13 正常充電模式
(2) 重放攻擊。在模擬攻擊過程中,當充電樁給電動汽車發(fā)送的報文顯示當前電壓為45 V時,實施重放攻擊,即由第三方不斷向充電樁發(fā)送一個之前由電動汽車發(fā)送給充電樁停止充電的消息,迫使電動汽車停止充電。攻擊結果如圖14所示。實驗結果表明,當電動汽車在充電過程中遭到重放攻擊時,充電過程停止,正常充電過程受到干擾。
圖14 重放攻擊模式
(3) 加隨機數(shù)抵御重放攻擊。將加隨機數(shù)抵御重放攻擊的算法應用到本實驗后,在每次充電樁與電動汽車BMS進行CAN數(shù)據(jù)傳輸時都加上隨機數(shù),在電壓達到40 V時進行重放攻擊。輸入數(shù)字“2”時的實驗結果如圖15所示。實驗結果表明,在BMS發(fā)送給充電樁的消息請求中加入隨機數(shù)時,如果該隨機數(shù)與數(shù)據(jù)庫中之前存儲的隨機數(shù)重復,則可以判定為重放攻擊,充電樁不執(zhí)行攻擊者發(fā)出的停止充電命令,以保證充電過程的安全進行。
圖15 抵御重放攻擊模式
通過分析與對比上述3個實驗結果可知,采用加隨機數(shù)的方式能夠有效抵御重放攻擊,確保電動汽車充電過程中的信息安全。
本文提出的抗重放攻擊算法的局限性主要體現(xiàn)在以下兩個方面。
(1) 雖然不需要時間同步,并且可以有效抵御重放攻擊,但還需另外保存使用過的隨機數(shù),所以將增加數(shù)據(jù)庫的保存開銷。
(2) 對每次的消息請求都要查詢數(shù)據(jù)庫,會導致算法運行效率偏低。
因此,下一步的工作重點是研究如何提高算法的效率,減少保存和查詢開銷,提高算法在傳輸數(shù)據(jù)時的可用性,并且針對實際的電動汽車充電系統(tǒng)進行優(yōu)化測試。
本文采用STM32F767單片機、USB-CAN轉(zhuǎn)
換器和PC機搭建實驗硬件環(huán)境,實現(xiàn)了與CAN協(xié)議有關的環(huán)回通信以及與PC之間的通信。通過通信結果分析CAN協(xié)議目前存在的安全性問題;針對典型的重放攻擊,提出了采用加隨機數(shù)的算法進行防御,并將根據(jù)該算法編寫的相應程序部署于電動汽車充電的通信過程中,通過實驗驗證了抗重放攻擊的有效性,從而為CAN協(xié)議通信提供了更安全可信的環(huán)境,增加了電動汽車充電過程中的信息安全性。