唐朝實驗室 · 2015/11/25 15:34git
Author: Dr. Charlie Miller ([email protected]) Chris Valasek ([email protected])github
唐朝實驗室翻譯組:朱于濤 劉家志web
汽車安全研究一直是大衆消費者很是感興趣的一個話題,由於汽車已經走入了尋常百姓家,並且咱們也明白一旦攻擊者能夠任意的操控咱們的汽車,那麼咱們的行車安全就會受到極大的威脅。很大程度上,汽車安全研究是從2010年開始的。當時,華盛頓大學和加州大學聖地亞哥分校的研究人員稱,若是他們可以將某些信息注入到車輛的CAN總線中,他們就能夠操控車輛的一些物理狀態(推測的測試車型是2009年的雪佛蘭邁銳寶),好比控制儀表盤上的顯示速度,關閉引擎或影響剎車性能。雖然此次研究頗有意思,可是也遭到了大衆的普遍批評,由於他們認爲攻擊者在沒法近距離接觸到車輛的狀況下,是沒有辦法向汽車中注入此類信息的,不過,若是攻擊者能近距離接觸到目標車輛,他們能夠直接切斷某條線路,或執行其餘的一些物理攻擊就足夠了。算法
第二年,這個研究小組證實了本身在2010年時提出的論斷,實現了這種遠程攻擊方案。他們演示了三種不一樣的途徑來講明如何在汽車上執行代碼,分別是經過收音機的mp3解析器,藍牙棧和衛星通信系統。一旦代碼能在汽車上運行了,他們接下來就能夠注入CAN信息,從而影響車輛的物理系統。這次遠程攻擊研究頗具開創性,由於這一研究證實了,不僅是當地的汽車,而是全國範圍內的汽車都存在安全漏洞。不過,在這兩次的研究報告中都沒有具體地列出這些攻擊方法是如何實現的,也沒有記錄測試車輛的型號。編程
不久以後,DARPA受權咱們研發一個能協助汽車研究進行的工具庫,下降新研究員進入這一領域的門檻。隨後,咱們發佈了這些工具並演示了幾種針對兩款老車型的物理攻擊方法,測試的車輛分別是2010年的福特翼虎和2010年的豐田普銳斯。如今,這一套工具已經成爲了衆多研究人員的優選,甚至美國國家公路交通安全管理局也在使用這套工具來進行車輛測試。json
在咱們2012年的研究中,考慮到學術研究者先前發佈的一些材料,咱們假定遠程入侵是可行的。因此,咱們假設能夠經過一種可靠的方式將CAN息注入到汽車總線中。除了公佈這些工具,咱們還放出了在攻擊中使用的CAN信息,藉此來鼓勵更多的研究人員參與到汽車研究中。另外,咱們的主要貢獻還包括證實瞭如何經過CAN信息來控制方向盤的轉向。這種控制能實現的緣由在於汽車功能的發展,從首次研究至今,如今的汽車已經具有了一些相似自動平行泊車和車道維持輔助系統的功能,而這些功能的實現都是經過接收CAN總線發出的ECU操做命令完成的。因此,由此證實了,隨着汽車上新技術的引入,新型的攻擊方式也在成爲可能。安全
汽車產業對此迴應稱,由於咱們能接觸到目標車輛,向車輛的總線中注入CAN信息,因此才能實現這些攻擊。例如,豐田就發表聲明稱「整個汽車產業以及咱們的工做焦點就是防止車輛之外的無線設備實現遠程入侵。咱們認爲咱們的系統是強大且安全的。」服務器
2013年,DARPA再次受權咱們研發一個平臺來幫助研究員在不須要購買測試車輛的前提下進行汽車安全研究。此次的重點仍是在於下降汽車研究的成本和難度,尤爲對於那些有傳統計算機安全背景的研究人員。網絡
2014年,爲了更具普適性,而不是僅限於當時的3種車型(2009年雪佛蘭邁銳寶,2010年福特翼虎,2010年豐田普銳斯),咱們收集了大量關於汽車結構的數據,嘗試從更高層級上判斷哪些車輛會給攻擊者形成最大的障礙。咱們首先評估了攻擊平面,從獲取CAN信息,到獲取關鍵的安全性ECU,最後經過ECU來採起一些物理操做。最終,咱們發現2014年的吉普切諾和另外兩款車綜合了這兩種攻擊途徑,而且車輛的結構簡單,具有大量的高級物理功能,因此這幾款車很是適合咱們進行研究。數據結構
咱們採購了一臺2014年的吉普切諾來進行研究,由於像學術研究者同樣,咱們很想證實先前在福特和豐田汽車上應用的攻擊方法也能夠遠程實現。由於汽車製造商在咱們發佈了研究報告後仍是那麼的自信,因此咱們想要證實在原裝車上,遠程攻擊仍然是可行的,以此來鼓勵全部人都重視這一威脅。在本文中,咱們遠程攻擊了一臺原裝的2014年款吉普切諾和相似的車輛來獲取對車輛的物理控制。咱們要經過此次研究,將詳細的研究信息傳遞給安全研究員、汽車製造商、供應商和消費者,但願未來生產的汽車能更安全。
咱們選擇2014款吉普切諾是由於這款車給咱們提供了最佳的機會來證實,一旦遠程入侵成功,攻擊者就能夠經過發送信息,侵入駕駛員的隱私,代替攻擊者執行一些物理操做。正如咱們在先前研究中就指出的,對於攻擊者來講,這款車的攻擊障礙更少。可是,這並不表明其餘製造商生產的汽車就是沒法入侵的或是更安全的,只是說,咱們認爲這款車是適合咱們的研究對象。更重要是,在咱們的預算限制中,只有這款車能提供咱們想要的技術功能。
這臺2014款吉普切諾的架構很是吸引咱們,由於這款車的頭單元(無線電廣播)鏈接到了車輛上實現的兩條CAN總線。
圖-2014年款吉普切諾的結構圖
咱們猜想,若是能入侵汽車上的無線電模塊,咱們就能訪問CAN-IHS和CAN-C網絡上的ECU,也就是說,咱們能夠把信息發送到全部的ECU上,而這些ECU控制着車輛的各類物理特性。在後面你會看到,咱們在入侵了頭單元后,並沒能直接訪問到CAN總線,因此,還須要接下來的漏洞利用階段(Exploitation Stage)。有這樣的說法,CAN總線中不存在架構限制,好比,控制轉向的是獨立的總線。若是咱們能夠從頭單元中發送信息,那麼信息就能傳遞到CAN總線上的每個ECU。
在這一部分中,咱們介紹了2014款吉普切諾使用的駕駛協助系統。咱們對這些技術很是感興趣,由於在此前的攻擊中,咱們就是利用了相似的系統才獲取了對車輛的物理控制。雖然,咱們也相信這些技術進步保證了駕駛員和乘客的安全,可是,不能否認的是,攻擊者也會利用這些系統做爲控制車輛的途徑。
2014年款的吉普切諾配備了自適應巡航控制系統(ACC),這項技術可以協助駕駛員與前車保持合適的距離。實際上,若是啓用了巡航控制,當前車減速時,車輛就會適當的剎車以免與前車發生碰撞,當道路上的障礙移除或進入安全距離後,車輛就會恢復到正常的巡航控制速度。若是前車中止前行,ACC模塊也能夠控制駕駛車輛中止前行。
與ACC相似,前向碰撞警告系統+(FCW+)會防止車輛與前方物體發生碰撞。可是,不一樣於ACC,除非特地關閉,FCW+是一直開啓的,在遇到突發狀況時,系統會協助駕駛員剎車。例如,若是駕駛員正在看手機,而沒有注意前方的道路,而且前方車輛忽然剎車了,FCW+就會發出聲音警報,並代替駕駛員剎車。
圖-FCW+
車道偏離警告系統(LDW+)這項功能是爲了保證駕駛員在高速公路上的駕駛安全。LDW+在啓用時會檢查行車線路(道路上的油漆線),判斷車輛是否亂線,從而避免碰撞或更嚴重的事故。若是系統檢測到車輛正在偏離當前的線路,系統就會調整方向盤以保持在當前線路上形式。
圖-LDW+
近期,最新的泊車輔助功能(PAM)也加入到了普通車輛上。泊車輔助系統(PAM)能幫助駕駛員完成停車操做,在多數狀況下不須要駕駛員出力,好比平行停車,倒車停車等。咱們認爲以此爲切入點,是控制車輛方向盤的最簡單方法,而且咱們已經證實了利用這項技術,只須要經過CAN信息就能控制車輛在高速行駛中的轉向。在後面你會發現,PAM技術和模塊在咱們的研究中發揮了關鍵做用。
圖-使用中的PAM系統顯示
在下表中,咱們列出了攻擊者可能選擇的一些切入點。不少人在看到這些項目時想到的都是各類技術術語,可是對於攻擊者來講,每項與外界交互的技術都是一個潛在的攻擊切入點。
如今,在不少汽車的點火鑰匙中都植入了一個小芯片,與車輛上的傳感器通信。對於吉普切諾這款車來講,其傳感器直接經過線路鏈接到了射頻中心模塊上(RFHM)。當按下點火開關時,板載計算機就會發出一個射頻(RF)信號,鑰匙中的射頻器就能夠接受這個信號。而後鑰匙中的射頻器會返回一個惟一的射頻信號到車上的計算機,計算機在肯定信號後,就會啓動並運行汽車,整個過程不超過1秒。若是板載計算機沒有接收到正確的識別代碼,某些組件,好比油泵,啓動器就不會運行。
從遠程攻擊的角度看,這個攻擊平面太窄了。惟一的數據傳輸(而且是由IC上的軟件處理)就是識別碼和射頻信號。很難想象這個識別代碼中會存在可利用的漏洞,即便是有,你也必需要接近傳感器,由於傳感器在設計上就只能接收附近的信號。
圖-顯示沒有檢測到鑰匙
在汽車上,每一個輪胎都有一個胎壓傳感器,會時刻測量胎壓並把實時數據傳輸給ECU。在吉普切諾上,接收傳感器經過線路鏈接到了RFHM上。這裏使用的無線電信號是專利性的,可是,已經有人對TPMS系統進行了研究並調查了這個系統的安全性。
幾乎能夠肯定的是,經過採起一些操做是能夠攻擊TPMS系統的,好比讓車輛誤覺得輪胎或TPMS系統出現了問題。另外,研究人員還證實了在有些狀況下,是能夠形成相關的ECU崩潰或變磚。考慮到代碼執行的可能性,這個攻擊平面也很窄。可是,既然ECU能遠程變磚,這仍是說明其數據處理方式不夠安全,因此這類攻擊仍是可行的。
圖-2014年款吉普切諾的TPMS系統顯示界面
電子鑰匙,也就是遙控門鎖中有一個短距離的無線電傳輸裝置,能夠與車輛上的ECU通信。這個無線電傳輸器會發送包含有身份信息的數據,而後ECU會判斷這個祕鑰是否是有效的,從而決定隨後的上鎖、解鎖和啓動引擎等指令。在吉普基諾這款車中,負責接收這個信息的仍是RFHM。
鑑於遠程代碼執行,這種攻擊平面很窄。由於,RHFM中必定有專門的固件來負責處理射頻信號,加密/解密代碼和識別電子鑰匙數據的邏輯以及編程備用電子鑰匙的邏輯。雖然這是一種可能的攻擊途徑,可是要想在RKE中找到漏洞來實現遠程代碼執行彷佛是不可能的。
圖-2014年款吉普切諾的電子鑰匙
大多數汽車都可以經過藍牙來同步設備。也就是說ECU有處理複雜遠程信號的能力。在吉普切諾上,藍牙是經過無線電廣播(頭單元)接收和處理的。這樣汽車就能夠訪問手機上的通信錄,經過手機打電話,聽音樂,發信息以及其餘功能。
不一樣於現有的其餘信號,藍牙棧很龐大,同時也存在着大量的攻擊漏洞,因此攻擊平面很大。通常來講,涉及到藍牙棧的攻擊方案有兩種。第一種是利用未配對的設備。這種攻擊的危險程度是最高的,由於攻擊者能夠獲取到設備的代碼。第二種利用方法是在配對完成後,由於涉及到了用戶交互,因此威脅性沒有那麼大。曾經就有研究人員演示瞭如何利用藍牙接口來入侵一輛汽車。Codenomicon的研究人員還發現,汽車中經常使用的藍牙接收器有不少崩潰的狀況。
圖-2014年款吉普切諾的藍牙面板
無線電廣播不只僅能夠接收聲音信號,也能夠接收數據。在吉普切諾上,無線電廣播能夠接收多種遠程輸入,好比GPS,AM/FM廣播和衛星電臺。在多數狀況下,這些信號都會簡單的轉換成音頻輸出,數據解析的數量也不大,這就說明其中不太可能有能夠利用的漏洞。可是,例外就是無線電數據系統中用於發送數據和FM模擬信號(或衛星電臺)的數據。用戶能夠感知到包括當電臺播報的電臺名稱和正在播放的歌曲名稱,在這時,數據必需要通過解析和顯示,這樣就爲安全漏洞創造了空間。
圖-2014年款吉普切諾的無線電廣播數據面板
有些汽車還提供了蜂窩數據上網功能,實際上,這些汽車是經過Wi-Fi熱點的方式來爲乘客提供網絡鏈接。在吉普切諾上,這是一個根據使用狀況購買的功能,好比按天或按月購買。咱們觀察到即便是不瞭解汽車系統的人也能夠訪問這個Wi-Fi系統。雖然Wi-Fi安全評估方法已經存在了好多年,可是近年來,數據點入侵攻擊仍是常常發生。
圖-2014年款吉普切諾的Wi-Fi面板
現在的許多汽車都配備了蜂窩廣播功能,通常是叫作車載通信系統,用於將車輛鏈接到數據網絡,例如,通用汽車使用的昂斯達系統。蜂窩技術也能夠用於接收數據,好比交通或天氣信息。
這一功能就像是汽車攻擊業的聖盃,由於,只要目標汽車上有蜂窩通信,那麼能夠攻擊的範圍實在是太廣了。即便車載通信單元不直接駐存到CAN總線上,這個通信單元仍然能夠經過麥克風向其餘位置遠程傳輸數據/聲音。有的研究人員此前就遠程利用過汽車上的通信單元,而且尚未涉及用戶交互。在吉普切諾上,全部的這些功能都是由無線電控制的,而這個無線電廣播又駐存在了CAN-IHS總線和CAN-C總線這二者之上。
在2014年的吉普切諾上,其通信系統、網絡、無線電廣播和Apps都在出廠時綁定到了哈曼Uconnect 系統上。接下來咱們會詳細地介紹這個Uconnect系統,可是咱們想要指出,全部與「信息娛樂」系統相關的功能都是物理集成在一個單元上。
2014年款的吉普雷諾使用了由哈曼卡頓生產的Uconnect 8.4AN/RA4 無線電廣播系統,而且哈曼卡頓是吉普汽車的惟一供應商,負責提供信息娛樂系統、Wi-Fi鏈接、導航、app和蜂窩通信。大多數的功能都是集成在一塊德州儀器芯片上的OMAP-DM3730系統中,這是汽車上常用的一個系統。菲亞特克萊斯勒汽車的不少不一樣車型也都使用了哈曼Uconnect系統,包括克萊斯勒、道奇、吉普和Ram。固然,其餘品牌的汽車也有的使用了Uconnect系統。
Uconnect頭單元中一樣包含有微控制器和軟件,容許經過控制器局域網-高速(CAN-IHS)數據總線與車輛上的其餘電子模塊通信。在配備了Uconnect Access系統的汽車上,系統還會經過CAN-C數據總線,使用電子信息與汽車上的其餘電子模塊通信。
不只僅是吉普切諾這款車配備了哈曼Ucoonect系統,這個系統在克萊斯勒-菲亞特系列的汽車上也很常見,甚至還出如今了法拉利加利福尼亞這款車上。這就意味着,雖然咱們是以2014年款的吉普切諾爲例,可是,只要是安裝了Uconnect系統的汽車,這裏提到的漏洞和信息都是適用的。因此說,在道路上,有漏洞的汽車數量至關龐大。
2014年款吉普切諾上使用的Ucoonect系統運行的是QNX操做系統,使用了一個32位ARM架構的處理器。這基本上就是汽車信息娛樂系統的標配。若是Uconnect系統不可用的話,大部分的測試和檢查均可以在QNX虛擬機上完成,可是,系統很顯然配備了一個工做單元能幫助到咱們的應用研究。
# pidin info
CPU:ARM Release:6.5.0 FreeMem:91Mb/512Mb BootTime:Jul 30 21:45:38 2014
Processes: 107, Threads: 739
Processor1: 1094697090 Cortex A8 800MHz FPU
複製代碼
除了虛擬的QNX系統,用於更新和重裝操做系統的ISO數據包也能夠很容易地從網上下載到。在獲取了這個ISO文件後,咱們調查了其目錄結構和文件系統。咱們研究發現,有不少研究方法均可以在沒有測試車輛,沒有Ucoonect系統或QNX虛擬機的前提下完成,好比,逆向二進制文件。
咱們的Uconnect單元使用了NAND flash,這個flash中包含有幾個不一樣的文件系統,各自發揮着不一樣的做用。下面列出的是咱們感興趣的一些文件系統和須要額外研究的部分。在接下來,咱們還會討論這些部分。要想獲取更多關於QNX鏡像的信息,請參考他們的說明文檔。
如上所述,IFS用於放置系統二進制,以及在Uconnect頭單元上運行QNX操做系統所須要的配置文件。咱們從克萊斯勒汽車上獲取了一個ISO文件,經過觀察其文件系統來判斷哪些文件會在更新過程當中受到影響。例如,在解壓了ISO後,咱們檢查了主目錄中的’manifest
’,發現了IFS位於一個‘ifs-cmc.bin
’文件中。
ifs =
{
name = "ifs installer.",
installer = "ifs",
data = "ifs-cmc.bin",
},
複製代碼
若是咱們想要在沒有Ucoonect系統的狀況下查看IFS,‘swdl.bin
’須要掛載到QNX虛擬機中,由於這不是一個標準的IFS鏡像。這裏麪包括了更新須要的全部系統可執行文件。‘swdl.bin
’文件能夠在‘swdl/usr/share
’ 目錄中找到。
例如,若是要轉儲QNX上(在咱們的例子中,是QNX虛擬機)的IFS,你能夠運行下面的命令:
memifs2 -q -d /fs/usb0/usr/share/swdl.bin /
複製代碼
運行結果是檢查一個掛載爲只讀的根目錄(「/」)。經過發出‘dumpifs
’命令,這個文件系統能夠徹底迭代。咱們從ISO更新文件中轉儲了IFS,下面就是輸出結果。
Offset Size Name
0 8 *.boot
8 100 Startup-header flags1=0x9 flags2=0 paddr_bias=0
108 22008 startup.*
22110 5c Image-header mountpoint=/
2216c cdc Image-directory
---- ---- Root-dirent
23000 8a000 proc/boot/procnto-instr
ad000 325c proc/boot/.script
---- 3 bin/sh -> ksh
---- 9 dev/console -> /dev/ser3
---- a tmp -> /dev/shmem
---- 10 usr/var -> /fs/etfs/usr/var
---- 16 HBpersistence -> /fs/etfs/usr/var/trace
---- a var/run -> /dev/shmem
---- a var/lock -> /dev/shmem
---- a var/log/ppp -> /dev/shmem
---- 15 opt/sys/bin/pppd -> /fs/mmc0/app/bin/pppd
---- 15 opt/sys/bin/chat -> /fs/mmc0/app/bin/chat
---- 18 bin/netstat -> /fs/mmc0/app/bin/netstat
---- 16 etc/resolv.conf -> /dev/shmem/resolv.conf
---- 16 etc/ppp/resolv.conf -> /dev/shmem/resolv.conf
---- 18 etc/tuner -> /fs/mmc0/app/share/tuner
---- 8 var/override -> /fs/etfs
---- c usr/local -> /fs/mmc0/app
---- b usr/share/eq -> /fs/mmc0/eq
b1000 12af etc/system/config/fram.conf
b3000 38c etc/system/config/nand_partition.txt
b4000 56b etc/system/config/gpio.conf
b5000 247b bin/cat
b8000 1fed bin/io
ba000 2545 bin/nice
bd000 1fed bin/io
c0000 38e0f bin/ksh
f9000 41bb bin/slogger
fe000 60a1 bin/waitfor
105000 531b bin/pipe
10b000 5e02 bin/dev-gpio
120000 1270b bin/dev-ipc
140000 1f675 bin/io-usb
160000 29eb bin/resource_seed
163000 3888 bin/spi-master
167000 48a0 bin/dev-memory
16c000 9eab bin/dev-mmap
176000 602c bin/i2c-omap35xx
17d000 da08 bin/devb-mmcsd-omap3730teb 18b000 dd3 bin/dev-ipc.sh
18c000 2198 bin/mmc.sh
190000 1208f bin/devc-seromap
1a3000 323d bin/rm
1a7000 ffa2 bin/devc-pty
1b7000 4eb bin/startSplashApp
1b8000 692 bin/startBackLightApp
1b9000 1019 bin/mmc_chk
1bb000 42fe usr/bin/adjustImageState
1c0000 12c81 usr/bin/memifs2
1d3000 284 usr/bin/loadsecondaryifs.sh
1e0000 77000 lib/libc.so.3
---- 9 lib/libc.so -> libc.so.3
260000 b0e4 lib/dll/devu-omap3530-mg.so
26c000 9d17 lib/dll/devu-ehci-omap3.so
276000 4705 lib/dll/spi-omap3530.so
280000 14700 lib/dll/fs-qnx6.so
295000 36e6 lib/dll/cam-disk.so
2a0000 2b7ba lib/dll/io-blk.so
2d0000 5594f lib/dll/charset.so
330000 1243c lib/dll/libcam.so.2
---- b lib/dll/libcam.so -> libcam.so.2
350000 3886 lib/dll/fram-i2c.so
Checksums: image=0x702592f4 startup=0xc11b20c0
複製代碼
雖然,‘dumpifs
’ 命令不能獲取到與完整操做系統相關的全部信息,好比,‘/etc/shadow
’,咱們在二進制上運行了grep,其結果說明這種文件是最可能顯示的。例如,若是你搜索’root’,你會找到幾個字符串,其中最有意思的兩個分別是:
root:x:0:a
root:ug6HiWQAm947Y:::9b
複製代碼
在經過遠程入侵劫持了工做頭單元后,咱們就能夠更全面地在工做的頭單元上檢查IFS。接下來,咱們會討論如何劫持頭單元。
ETFS實現了一個高度可靠的文件系統,供嵌入式固態存儲設備使用,尤爲是NAND閃存。很顯然,ISO中並無出現ETFS,可是在一個活動的Uconnect系統上能檢查到。在咱們看來,在ETFS上並無多少有趣的數據,因此咱們就不深刻了。
例如:/fs/etfs/usr/var/sdars/channelart/I00549T00.png
複製代碼
在調查ISO和Uconnect系統時,咱們發現MMC文件系統中的一些項目是最有意思的。最讓咱們好奇的是這個文件系統能夠掛載爲讀-寫屬性,也就是說,若是這個文件系統上有咱們感興趣的東西,好比啓動腳本或網絡服務,咱們就能夠啓用或修改其內容。好比,咱們就發現了’sshd’,‘boot.sh’和 ‘runafterupdate.sh’這樣的項目。
安裝腳本-’mmc.lua’會把ISO中的‘/usr/share/MMC_IFS_EXTENSION
’複製到‘/fs/mmc0/app
’。
QNX系統中運行着許多有意思的服務,可是解釋全部的這些服務並不在本文的範圍中。其中一個很重要的服務是發佈/訂閱服務(PPS)。在這個服務中有幾個文件是咱們感興趣的,下面列出的是最突出的幾個:
/pps/can/vehctl
/pps/can/tester
/pps/can/can_c
/pps/can/send
/pps/can/comfortctl
複製代碼
這些文件從本質上說,是數據寫入的位置,這樣就能夠將其用做其餘進程的輸入。咱們能夠把這些文件想象成具有數據處理能力的UNIX管道,用於協助數據結構的解析。這裏有一個定義好的API會與PPS文件交互。假設下面的數據就儲存在一個PPS文件中:
@gps
city::Ottawa
speed:n:65.412 position:json:{"latitude":45.6512,"longitude":-75.9041}
複製代碼
爲了提取這些數據,你可使用下面的代碼:
const char *city;
double lat, lon, speed;
pps_decoder_t decoder;
pps_decoder_initialize(&decoder, NULL); pps_decoder_parse_pps_str(&decoder, buffer); pps_decoder_push(&decoder, NULL); pps_decoder_get_double(&decoder, "speed", &speed); pps_decoder_get_string(&decoder, "city", &city);
pps_decoder_push(&decoder, "position"); pps_decoder_get_double(&decoder, "latitude", &lat); pps_decoder_get_double(&decoder, "longitude", &lon); pps_decoder_pop(&decoder);
pps_decoder_pop(&decoder);
if ( pps_decoder_status(&decoder, false) == PPS_DECODER_OK ) { ...
}
pps_decoder_cleanup(&decoder);
複製代碼
下面這個真實案例是取自一個活動中的Uconnect系統:
# cat send
[n]@send
DR_MM_Lat::1528099482
DR_MM_Long::1073751823
GPS_Lat::1528099482
GPS_Long::1073751823
HU_CMP::0
NAVPrsnt::1
RADIO_W_GYRO::1
複製代碼
雖然,PPS文件位於一個叫作‘can_c’ 的子目錄中,可是在寫入這些文件時,並無建立咱們用嗅探器觀察到的CAN信息。換句話說,這些PPS文件只是能看到進程之間是如何通信的,並無直接與CAN總線通信的權限。
一開始,咱們還但願能利用這些PPS文件來發送任意的CAN信息,可是,在證實了這種方法的生存能力不夠強後,咱們又把努力方向轉向到了其餘地方。這不是說,咱們沒法利用這些文件和PPS子系統來發送任意的CAN信息,只是咱們想找到一種更好的辦法來實現咱們想要的結果。
2014年款的吉普切諾能夠選配車載Wi-Fi,其本質就是一個Wi-Fi熱點,只有在web上或經過Uconnect系統購買了這項服務,上網功能才能實現。接下來,咱們會討論Wi-Fi熱點中存在的一個漏洞,可是要記住,只有當車主啓用併購買了這項功能後,這個漏洞才能夠利用。
默認的Wi-Fi加密方法是WPA2,使用的密碼是隨機生成的,字母數字很多於8位。考慮到目前WPA2的強度和可能的密碼數量,這是一種很是安全的設置,因此問題是:攻擊者怎樣才能入侵這樣的網絡呢?
一種相對簡單,可是不太可行的方法就是用戶選用了WEP加密方法,或直接沒有使用加密,這兩種都是可行的選擇。不管是哪一種狀況,攻擊者都可以經過破解WEP密碼或直接加入訪問點來入侵這種無線訪問點。
若是攻擊者已經入侵了鏈接到車載Wi-Fi熱點的設備,好比,筆記本電腦或手機,那麼還存在另一種攻擊方案。既然車主購買了這個功能,也就是說他的手機或其餘設備會鏈接到車上的無線網絡。在這種狀況下,若是攻擊者能夠入侵這些設備,他們就能鏈接到車上的無線網絡。可是,咱們認爲這種方案須要太多的前提條件了,l33t!(黑客經常使用的聊天語言,主要表示 what!和yeah!的意思)
可是,接下來咱們會看到,即便用戶使用了默認的WPA2設置,攻擊者仍是能夠入侵車上的網絡,並且方法很簡單。經過反彙編OMAP芯片上的‘WifiSvc’二進制(經過轉儲活動的QNX中的二進制能夠得到),攻擊者就能夠肯定用於建立隨機密碼的算法。這個算法會出如今函數WiFi.E:generateRandomAsciiKey()
中。經過反編譯,咱們發現這個算法包含下面的部分:
int convert_byte_to_ascii_letter(signed int c_val) { char v3; // [email protected] if ( c_val > 9 ) { if ( c_val > 35 ) v3 = c_val + 61; else v3 = c_val + 55; } else { v3 = c_val + 48; } return v3; } char *get_password(){ int c_max = 12; int c_min = 8; unsigned int t = time(NULL); srand (t); unsigned int len = (rand() % (c_max - c_min + 1)) + c_min; char *password = malloc(len); int v9 = 0; do{ unsigned int v10 = rand(); int v11 = convert_byte_to_ascii_letter(v10 % 62); password[v9] = v11; v9++; } while (len > v9); return password; 複製代碼
看起來,隨機密碼是徹底是一個時間(幾秒鐘)的函數,咱們很難去調查這個密碼是在什麼時間生成的,可是下面的信息能代表頭單元的首次啓動時間。
因此,經過生成一個密碼錶來暴力破解無線訪問點的WPA2加密是可行的。根據汽車的生成年份,攻擊者能夠嘗試猜想汽車的首次啓動時間,並嘗試合適的密碼。
僅供參考,若是咱們能夠猜想出某輛汽車是在幾月份首次啓動的,咱們只須要嘗試大約1500萬個密碼。若是你認爲首次啓動時間不會是在半夜,那麼須要嘗試的密碼數量又能夠減半。咱們並非這方面的專家,可是有資料代表,在使用離線破解技術時,你每秒能夠嘗試133,000次密碼。也就是說,猜想一個月中的全部密碼只須要2分鐘,猜想全年的密碼也用不了半個小時。在多數狀況下,雖然咱們估計的過於樂觀了,可是這種方法仍是可行的。
不過,因爲一個複雜的時間漏洞的存在,彷佛還有另一種更簡單的密碼破解方法,可是,請注意,咱們只用這種方法攻擊了咱們的頭單元,咱們不能肯定這種攻擊是否是有普適性。
當頭單元首次啓動時,頭單元也不知道具體的時間。頭單元還須要從GPS或蜂窩鏈接中接收信號。文件‘clock.lua’負責的就是設置系統時間。咱們在函數‘start()
’ 中發現了下面的代碼:
local rtcTime = getV850RealtimeClock()
local rtcValid = false
if rtcTime == nil or rtcTime.year == 65535 or rtcTime.month == 255 or rtcTime.day == 255 or rtcTime.hour == 255 or rtcTime.mi n == 255 or
rtcTime.sec == 255 then
dbg.print("Clock: start -- V850 time not received or is set to factory defaults")
...
if rtcValid == false then
dbg.print("Clock: start -- Unable to create the UTC time from V850") setProperty("timeFormat24", false)
setProperty("enableClock", true)
setProperty("gpsTime", true)
setProperty("manualUtcOffset", 0)
defTime = {}
defTime.year = 2013
defTime.month = 1
defTime.day = 1
defTime.hour = 0
defTime.min = 0
defTime.sec = 0
defTime.isdst = false setSystemUTCTime(os.time(defTime))
timeFormatOverride = false
enableClockOverride = false
end
複製代碼
根據上面的代碼,彷佛當頭單元沒法獲取到時間時,就會把時間設置到2013年1月1日 00:00:00 GMT。問題是,當‘WifiSvc’在首次啓動並設置WPA2密碼的時候,正確的時間是否是已經設置了。僅僅是根據咱們的數據來看,答案是尚未。若是你獲取到吉普切諾上的WPA2密碼「TtYMxfPhZxkp」並暴力破解全部可能的時間來判斷生成密碼的是哪一個時間,你所獲得的結果會是吉普切諾上的密碼是在Epioch 時間0x50e22720上生成的。這個時間對應的是2013年1月1日 00:00:32 GMT。這就說明,從‘clock.lua’設置好時間到‘WifiSvc’生成密碼,咱們的頭單元用了32s,並且咱們的頭單元並無在這32s中找到正確的時間。因此,在這種狀況下,實際只須要嘗試十幾個可能的密碼,並且只有幾個的可能性較大。換句話說,幾乎瞬間就能破解出密碼。
一種常見的Wi-Fi熱點評估方法是端口掃描默認的網關,並檢查是否是打開了任何端口。出乎咱們意料的是,開放端口遠遠的數量超過了3個。下面是根據網絡狀態(netstat)列出的監聽端口:
# netstat -n | grep LISTEN
tcp 0 0 *.6010 *.* LISTEN
tcp 0 0 *.2011 *.* LISTEN
tcp 0 0 *.6020 *.* LISTEN
tcp 0 0 *.2021 *.* LISTEN
tcp 0 0 127.0.0.1.3128 *.* LISTEN
tcp 0 0 *.51500 *.* LISTEN
tcp 0 0 *.65200 *.* LISTEN
tcp 0 0 *.4400 *.* LISTEN
tcp 0 0 *.6667 *.* LISTEN
複製代碼
下面是經過端口掃描發現的服務簡介:
在全部這些服務中,有不少都是專利性質的,頗有可能在某個服務中就存在漏洞,能容許遠程漏洞利用。
通過簡單的研究,咱們發現最有意思的開放端口是6667,這個端口通常是給IRC保留的。很顯然,這個Wi-Fi熱點沒法運行一個IRC服務器,對吧?在使用遠程登錄系統的客戶端鏈接到6667端口並返回幾回後,咱們意識到這並非一個IRC服務器,可是,D-Bus到IP,其實是一個跨進程通信(TPC),也是進程之間在通信時使用的一個遠程過程調用機制。
$ telnet 192.168.5.1 6667
Trying 192.168.5.1...
Connected to 192.168.5.1.
Escape character is '^]'.
a
ERROR "Unknown command"
複製代碼
Uconnect系統上的D-Bus信息守護進程綁定到了端口6667,而且如上所述,用於跨進程通信。進程之間的交互以下:
圖-http://dbus.freedesktop.org/doc/diagram.png
這裏只有兩個總線值得一提:系統總線,守護進程和系統服務主要都註冊到這個總線;會話總線,爲用戶應用保留的一個總線。
D-Bus能夠獲取認證。在吉普切諾的頭單元上,認證是開放給匿名操做的,以下:
telnet 192.168.5.1 6667
Trying 192.168.5.1...
Connected to 192.168.5.1.
Escape character is '^]'.
AUTH ANONYMOUS
OK 4943a53752f52f82a9ea4e6e00000001
BEGIN
複製代碼
咱們使用Python的D-Bus庫寫了幾個腳原本與D-Bus系統交互,可是在調查期間,咱們感受最實用的工具仍是Dfeet,這個工具提供了很是易用的GUI來調試D-Bus服務。
用戶可使用DFeet工具與吉普切諾上的D-Bus服務交互。在下面的截圖中,咱們看到的是‘com.harman.service.SoftwareUpdate
’ 服務的方法。
圖-com.harman.service.SoftwareUpdat
服務在DFeet中的輸出
DFeet可以鏈接並列出多個服務(叫作總線名稱)。例如:
com.alcas.xlet.manager.AMS
com.harman.service.AppManager
com.harman.service.AudioCtrlSvc
...
複製代碼
每一個服務都有一個對象路徑。好比’com.harman.service.onOff
’的對象路徑就是‘/com/harman/service/onOff
’。另外,每一個服務都包括兩個接口:‘com.harman.Serviceipc
’ 和 ‘org.freedesktop.DBus.Introspectable
’。Serviceipc接口只有一種獲取參數和返回字符串的方法,表示的是通用D-Bus接口。
在DFeet中就能夠調用這些服務。好比,你能夠單擊’com.harman.service.Control
’,而後是‘/com/harman/service/Control
’,接着是‘ ‘Serviceipc’下的Invoke’,最後執行下面的參數:「getServices」, 「」
圖-經過DFeet調用
返回的值能夠在輸出窗口(上圖)中看到,可是咱們還列出了下面的信息:
{"com.harman.service.platform.launcher":
{"name":"com.harman.service.platform.launcher",
"methods":{"launch":"launch"}},
"com.harman.service.Control":
{"name":"com.harman.service.Control",
"methods":{"stop":"stop","getModules":"getModules
","start":"start","getServices":"getServices","setDebug":"setDebug","shutdown":"shutdo
wn"}},
"com.harman.service.PersonalConfig":{
"name":"com.harman.service.PersonalConfig",
"methods":{"getProperties":"getProperties","getAl
lProperties":"getAllProperties","setProperties":"setProperties"}},
複製代碼
檢查並分類全部的D-Bus服務和經過TCP的方法調用,這是咱們留給您的閱讀實踐。可是,咱們已經發現了幾種方法,能容許直接與頭單元交互,好比調整電臺音量,訪問PPS數據以及能提供低級權限的其餘方法。
2014款吉普切諾的哈曼Uconnect系統還可以經過Sprint蜂窩網絡進行通信。大多數人都把這種通信方法稱做車載通信系統。這個通信系統是車載Wi-Fi、實時流量更新和其餘遠程鏈接的支柱。
蜂窩鏈接多是經過Sierra Wireless AirPrime AR5550無線模塊實現的,以下。
圖-哈曼Uconnect系統上的Sierra Wireless AirPrime AR5550無線模塊
你能夠根據這個無線模塊上的標誌判斷出這個芯片使用了高通的3G基帶,並使用了Sprint做爲運營商。用戶也可使用Sierra Wireless 的軟件開發工具來開發和調試這些系統。
咱們先前提到過,Uconnect系統既能夠經過Wi-Fi、蜂窩和藍牙與外界通信,也能夠經過CAN總線與外界通信。雖然在德州儀器OMAP-DM3730系統上運行的ARM處理器並沒有法直接訪問CAN總線,可是另外一個板載數據包卻能夠。
負責與內部高速CAN(CAN-IHS)交互的處理器和主要的CAN-C總線是一個Renesas V850處理器,以下。
圖-Renesas V850 FJ3
經過上面的標誌咱們能肯定這個芯片是Renesas V850 FJ3。另外,結合全部的指示信息和經驗,這也是汽車頭單元中的典型配置。V850芯片的功耗低並且能持續監控CAN流量數據。在有必要時,這個芯片會喚醒(高功耗的)OMAP芯片。
不過咱們很幸運,IDA Pro中已經包括了一個這種架構的處理器,因此咱們不須要本身寫了。詳細的固件逆向過程請閱讀下面的V850章節。
接下來你會發現,要想劫持Uconnect設備,並不須要遠程入侵這輛吉普,可是,要想弄清楚如何探索頭單元和其餘部分,劫持是頗有必要的。咱們在這裏提供了一些具體的信息來幫助那些熱衷於訪問頭單元文件的用戶。很顯然,本地安全是整個汽車安全中很重要的一個部分。由於任何漏洞做者都會告訴你說,只有搞明白了目標系統中錯綜複雜的關係,你才能建立一個能徹底發揮做用的漏洞。
總的來講,劫持Uconnect設備的方法有兩種,第一種適用於全部的版本,也很簡單;第二種只適用於特定的操做系統版本,可是能夠視爲一種合法的入侵。
你能夠把一個有效的ISO文件放到一個U盤上,再把這個U盤插入到Uconnect系統的USB端口。頭單元就會識別這個包含有更新文件的U盤並開始更新過程,以下。
圖-Uconnect的更新界面
若是你嘗試在U盤驗證後,可是重啓前,移除U盤,系統就會放棄更新並重啓進入常規(非更新)模式。
可是,在驗證了U盤後,系統就會重啓頭單元。若是,你這時候關機並拔出U盤,系統就會簡單地要求你插入U盤。
圖-要求插入U盤的界面
此時,你能夠插入一個新的U盤。咱們不清楚系統會如何檢查新的U盤,可是必定和原來的檢查方法很 「接近」或者就根本不檢查。然而,U盤上能夠包含修改後的文件。好比,經過修改原始ISO文件的十六進制值來更改根密碼是能夠成功的。更新是從ISO文件上運行的,包括用於驗證ISO有效性的代碼。因此,若是你願意的話,也能夠阻止代碼運行完整性檢查。
版本14_05_03中存在一個bug,能容許繞過系統的ISO驗證過程。不過,這個ISO文件中的某些屬性仍是要保持不變的,至於緣由咱們也不是徹底清楚(如上)。至少,咱們知道不能更改的屬性包括文件中的一些哈希和簽名。經過手動編輯ISO就能夠繞過完整性檢查。
系統中的bug:
/usr/share/scripts/update/installer/system_module_check.lua 91 local fname= string.format("%s/swdl.iso", os.getenv("USB_STICK") or "/fs/usb0")
92 local FLAGPOS=128
93
94 local f = io.open(fname, "rb")
95 96 97 98 99
100 101
if f then
local r, e = f:seek("set", FLAGPOS)
if r and (r == FLAGPOS) then
local x = f:read(1)
if x then
if x == "S" then
print("system_module_check: skip ISO integrity check")
複製代碼
繞過ISO有效性檢查很簡單,只須要在一個十六進制編輯器中手動編輯文件並把偏移128 (0x80) 上的值修改成‘S’ (0x53)。
圖-修改後的完整性檢查字節
若是想在更新過程當中運行代碼,好比,要想繞過除了ISO完整性檢查以外的其餘檢查,你能夠更改’system_module_check.lua’。要想繞過某些過程的最有效辦法就是修改ISO,讓系統檢測ISO是否是正在繞過完整性檢查,若是是,就放棄更新過程。這樣,你就能夠在不完成Uconnect系統更新過程的狀況下,運行代碼了,而完整更新過程可能須要30分鐘。僅僅經過修改‘cmds.sh’ 的內容,就能夠放棄整個更新過程。
上面提到的這種在更新過程當中運行代碼的方法存在弊端,主要是頭單元會處於 「更新模式」(更多細節請參閱‘bootmode.sh’ ),也就是說並非全部的文件系統都會掛載,而且相似網絡鏈接這樣的功能也不會啓用。可是,頭單元在安裝更新的過程zhong是能夠修改的,並且這種更改是不會由於汽車重啓而移除的。
用另一種不一樣的方式來修改ISO就可讓代碼在 「常規」模式運行,這樣就能訪問全部的文件系統和網絡鏈接了。爲了在常規模式下更新代碼。用戶必須修改 ‘boot.sh’ 文件來運行一些代碼。下面就是劫持ISO時,boot.sh文件的差異:
< sh /fs/usb0/cmds.sh &
< ######rently started with high verbosity
---
> # Start Image Rot Fixer, currently started with high verbosity
複製代碼
在作出了更改後,Uconnect系統在啓動時,就會執行U盤上‘cmds.sh’文件中的任何命令。例如,你能夠更改根目錄並啓動SSH守護進程,這樣就能夠獲取SSH遠程權限了(給你訪問Uconnect設備的根權限)。
首先,你必須修改ISO中的根密碼,而後,在‘cmds.sh’文件中添加下面的命令。這樣在開機時SSH就能啓動:‘/fs/mmc0/app/bin/sshd
’
以下是經過SSH登陸哈曼Uconnect系統:
ssh [email protected] ******************************** CMC ******************************** Warning - You are knowingly accessing a secured system. That means you are liable for any mischeif you do. ********************************************************************* [email protected]'s password: 複製代碼
注意:其中有個詞拼錯了。
在不少時候,你可能想要在Uconnect系統中放入文件。要想實現這一點,你必需要能寫入一個文件系統,就像運行掛載命令同樣簡單:
mount -uw /fs/mmc0/
複製代碼
很明顯,經過發出另外一個掛載命令就能夠逆向這個過程:
mount -ur /fs/mmc0/
複製代碼