<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/9974

            Author: Dr. Charlie Miller ([email protected]) Chris Valasek ([email protected])

            唐朝實驗室翻譯組:朱于濤 劉家志

            0x00 簡介&背景


            汽車安全研究一直是大眾消費者非常感興趣的一個話題,因為汽車已經走入了尋常百姓家,而且我們也明白一旦攻擊者可以任意的操控我們的汽車,那么我們的行車安全就會受到極大的威脅。很大程度上,汽車安全研究是從2010年開始的。當時,華盛頓大學和加州大學圣地亞哥分校的研究人員稱,如果他們能夠將某些信息注入到車輛的CAN總線中,他們就可以操控車輛的一些物理狀態(推測的測試車型是2009年的雪佛蘭邁銳寶),比如控制儀表盤上的顯示速度,關閉引擎或影響剎車性能。雖然這次研究很有意思,但是也遭到了大眾的廣泛批評,因為他們認為攻擊者在無法近距離接觸到車輛的情況下,是沒有辦法向汽車中注入此類信息的,不過,如果攻擊者能近距離接觸到目標車輛,他們可以直接切斷某條線路,或執行其他的一些物理攻擊就足夠了。

            第二年,這個研究小組證明了自己在2010年時提出的論斷,實現了這種遠程攻擊方案。他們演示了三種不同的途徑來說明如何在汽車上執行代碼,分別是通過收音機的mp3解析器,藍牙棧和衛星通訊系統。一旦代碼能在汽車上運行了,他們接下來就可以注入CAN信息,從而影響車輛的物理系統。此次遠程攻擊研究頗具開創性,因為這一研究證明了,不只是當地的汽車,而是全國范圍內的汽車都存在安全漏洞。不過,在這兩次的研究報告中都沒有具體地列出這些攻擊方法是如何實現的,也沒有記錄測試車輛的型號。

            不久之后,DARPA授權我們研發一個能協助汽車研究進行的工具庫,降低新研究員進入這一領域的門檻。隨后,我們發布了這些工具并演示了幾種針對兩款老車型的物理攻擊方法,測試的車輛分別是2010年的福特翼虎和2010年的豐田普銳斯。現在,這一套工具已經成為了眾多研究人員的優選,甚至美國國家公路交通安全管理局也在使用這套工具來進行車輛測試。

            在我們2012年的研究中,考慮到學術研究者先前發布的一些材料,我們假定遠程入侵是可行的。所以,我們假設可以通過一種可靠的方式將CAN息注入到汽車總線中。除了公布這些工具,我們還放出了在攻擊中使用的CAN信息,借此來鼓勵更多的研究人員參與到汽車研究中。另外,我們的主要貢獻還包括證明了如何通過CAN信息來控制方向盤的轉向。這種控制能實現的原因在于汽車功能的發展,從首次研究至今,現在的汽車已經具備了一些類似自動平行泊車和車道維持輔助系統的功能,而這些功能的實現都是通過接收CAN總線發出的ECU操作命令完成的。所以,由此證明了,隨著汽車上新技術的引入,新型的攻擊方式也在成為可能。

            汽車產業對此回應稱,因為我們能接觸到目標車輛,向車輛的總線中注入CAN信息,所以才能實現這些攻擊。例如,豐田就發表聲明稱“整個汽車產業以及我們的工作焦點就是防止車輛以外的無線設備實現遠程入侵。我們認為我們的系統是強大且安全的。”

            2013年,DARPA再次授權我們研發一個平臺來幫助研究員在不需要購買測試車輛的前提下進行汽車安全研究。這次的重點還是在于降低汽車研究的成本和難度,尤其對于那些有傳統計算機安全背景的研究人員。

            2014年,為了更具普適性,而不是僅限于當時的3種車型(2009年雪佛蘭邁銳寶,2010年福特翼虎,2010年豐田普銳斯),我們收集了大量關于汽車結構的數據,嘗試從更高層級上判斷哪些車輛會給攻擊者造成最大的障礙。我們首先評估了攻擊平面,從獲取CAN信息,到獲取關鍵的安全性ECU,最后通過ECU來采取一些物理操作。最終,我們發現2014年的吉普切諾和另外兩款車綜合了這兩種攻擊途徑,并且車輛的結構簡單,具備大量的高級物理功能,所以這幾款車非常適合我們進行研究。

            我們采購了一臺2014年的吉普切諾來進行研究,因為像學術研究者一樣,我們很想證明先前在福特和豐田汽車上應用的攻擊方法也可以遠程實現。因為汽車制造商在我們發布了研究報告后還是那么的自信,所以我們想要證明在原裝車上,遠程攻擊仍然是可行的,以此來鼓勵所有人都重視這一威脅。在本文中,我們遠程攻擊了一臺原裝的2014年款吉普切諾和類似的車輛來獲取對車輛的物理控制。我們要通過這次研究,將詳細的研究信息傳遞給安全研究員、汽車制造商、供應商和消費者,希望將來生產的汽車能更安全。

            0x01 目標-2014款吉普切諾


            我們選擇2014款吉普切諾是因為這款車給我們提供了最佳的機會來證明,一旦遠程入侵成功,攻擊者就可以通過發送信息,侵入駕駛員的隱私,代替攻擊者執行一些物理操作。正如我們在先前研究中就指出的,對于攻擊者來說,這款車的攻擊障礙更少。但是,這并不代表其他制造商生產的汽車就是無法入侵的或是更安全的,只是說,我們認為這款車是適合我們的研究對象。更重要是,在我們的預算限制中,只有這款車能提供我們想要的技術功能。

            網絡架構

            這臺2014款吉普切諾的架構非常吸引我們,因為這款車的頭單元(無線電廣播)連接到了車輛上實現的兩條CAN總線。

            圖-2014年款吉普切諾的結構圖

            我們猜測,如果能入侵汽車上的無線電模塊,我們就能訪問CAN-IHS和CAN-C網絡上的ECU,也就是說,我們可以把信息發送到所有的ECU上,而這些ECU控制著車輛的各種物理特性。在后面你會看到,我們在入侵了頭單元后,并沒能直接訪問到CAN總線,所以,還需要接下來的漏洞利用階段(Exploitation Stage)。有這樣的說法,CAN總線中不存在架構限制,比如,控制轉向的是獨立的總線。如果我們可以從頭單元中發送信息,那么信息就能傳遞到CAN總線上的每一個ECU。

            CAN C總線

            1. ABS 模塊 - 防抱死制動系統
            2. AHLM 模塊 - 大燈高度調整
            3. ACC 模塊 - 自適應巡航控制
            4. BCM 模塊 - 車體控制
            5. CCB 連接器 - 星型 CAN C 主體
            6. CCIP 連接器 - 星型 CAN C IP
            7. DLC 自我診斷接頭
            8. DTCM 模塊 - 動力控制
            9. EPB 模塊 - 電子駐車制動器
            10. EPS 模塊 - 電子助力轉向系統
            11. ESM 模塊 - 電子變速
            12. FFCM 攝像頭 - 前置攝像頭
            13. IPC 集群
            14. OCM 模塊 - 乘客分類模塊
            15. ORC 模塊 - 乘客約束控制器
            16. PAM 模塊 - 泊車輔助
            17. PCM 模塊 - 動力系統控制 (2.4L)
            18. 無線電模塊 - 無線電廣播
            19. RFH 模塊 - 射頻中心
            20. SCM 模塊 - 轉向控制
            21. SCLM 模塊 - 轉向柱鎖
            22. TCM 模塊 - 傳動控制

            CAN IHS總線

            1. AMP 放大器 - 無線電廣播
            2. BCM 模塊 - 車體控制
            3. CCB 連接器 - 星型 CAN IHS 主體
            4. CCIP 連接器 - 星型 CAN IHS IP
            5. DDM 模塊 - 司機門鎖
            6. DLC 自我診斷接頭
            7. EDM 模塊 -外部 DISC
            8. HSM 模塊 - 加熱座椅
            9. HVAC 模塊 - A/C 加熱器
            10. ICS 模塊 - 集成中心棧開關
            11. IPC 模塊 - 集群
            12. LBSS 傳感器 - 盲點左后方
            13. MSM 模塊 - 記憶座椅驅動
            14. PDM 模塊 - 乘客門
            15. PLGM 模塊 - 電動尾門
            16. 無線電模塊 - 無線電廣播(非橋接)
            17. RBSS 傳感器 - 盲點右后方

            0x02 網絡物理特性

            在這一部分中,我們介紹了2014款吉普切諾使用的駕駛協助系統。我們對這些技術非常感興趣,因為在此前的攻擊中,我們就是利用了類似的系統才獲取了對車輛的物理控制。雖然,我們也相信這些技術進步保證了駕駛員和乘客的安全,但是,不可否認的是,攻擊者也會利用這些系統作為控制車輛的途徑。

            自適應巡航控制(ACC)

            2014年款的吉普切諾配備了自適應巡航控制系統(ACC),這項技術能夠協助駕駛員與前車保持合適的距離。實際上,如果啟用了巡航控制,當前車減速時,車輛就會適當的剎車以避免與前車發生碰撞,當道路上的障礙移除或進入安全距離后,車輛就會恢復到正常的巡航控制速度。如果前車停止前行,ACC模塊也可以控制駕駛車輛停止前行。

            前向碰撞警告系統+(FCW+)

            與ACC類似,前向碰撞警告系統+(FCW+)會防止車輛與前方物體發生碰撞。但是,不同于ACC,除非特意關閉,FCW+是一直開啟的,在遇到突發情況時,系統會協助駕駛員剎車。例如,如果駕駛員正在看手機,而沒有注意前方的道路,并且前方車輛突然剎車了,FCW+就會發出聲音警報,并代替駕駛員剎車。

            圖-FCW+

            車道偏離警告系統(LDW+)

            車道偏離警告系統(LDW+)這項功能是為了保證駕駛員在高速公路上的駕駛安全。LDW+在啟用時會檢查行車線路(道路上的油漆線),判斷車輛是否亂線,從而避免碰撞或更嚴重的事故。如果系統檢測到車輛正在偏離當前的線路,系統就會調整方向盤以保持在當前線路上形式。

            圖-LDW+

            泊車輔助系統(PAM)

            近期,最新的泊車輔助功能(PAM)也加入到了普通車輛上。泊車輔助系統(PAM)能幫助駕駛員完成停車操作,在多數情況下不需要駕駛員出力,比如平行停車,倒車停車等。我們認為以此為切入點,是控制車輛方向盤的最簡單方法,并且我們已經證明了利用這項技術,只需要通過CAN信息就能控制車輛在高速行駛中的轉向。在后面你會發現,PAM技術和模塊在我們的研究中發揮了關鍵作用。

            圖-使用中的PAM系統顯示

            0x03 遠程攻擊途徑


            在下表中,我們列出了攻擊者可能選擇的一些切入點。很多人在看到這些項目時想到的都是各種技術術語,但是對于攻擊者來說,每項與外界交互的技術都是一個潛在的攻擊切入點。

            被動防盜系統(PATS)

            現在,在很多汽車的點火鑰匙中都植入了一個小芯片,與車輛上的傳感器通訊。對于吉普切諾這款車來說,其傳感器直接通過線路連接到了射頻中心模塊上(RFHM)。當按下點火開關時,板載計算機就會發出一個射頻(RF)信號,鑰匙中的射頻器就可以接受這個信號。然后鑰匙中的射頻器會返回一個唯一的射頻信號到車上的計算機,計算機在確定信號后,就會啟動并運行汽車,整個過程不超過1秒。如果板載計算機沒有接收到正確的識別代碼,某些組件,比如油泵,啟動器就不會運行。

            從遠程攻擊的角度看,這個攻擊平面太窄了。唯一的數據傳輸(并且是由IC上的軟件處理)就是識別碼和射頻信號。很難想象這個識別代碼中會存在可利用的漏洞,即使是有,你也必須要接近傳感器,因為傳感器在設計上就只能接收附近的信號。

            圖-顯示沒有檢測到鑰匙

            胎壓監測系統(TPMS)

            在汽車上,每個輪胎都有一個胎壓傳感器,會時刻測量胎壓并把實時數據傳輸給ECU。在吉普切諾上,接收傳感器通過線路連接到了RFHM上。這里使用的無線電信號是專利性的,但是,已經有人對TPMS系統進行了研究并調查了這個系統的安全性。

            幾乎可以確定的是,通過采取一些操作是可以攻擊TPMS系統的,比如讓車輛誤以為輪胎或TPMS系統出現了問題。另外,研究人員還證明了在有些情況下,是可以造成相關的ECU崩潰或變磚。考慮到代碼執行的可能性,這個攻擊平面也很窄。但是,既然ECU能遠程變磚,這還是說明其數據處理方式不夠安全,所以這類攻擊還是可行的。

            圖-2014年款吉普切諾的TPMS系統顯示界面

            遙控門鎖(RKE)

            電子鑰匙,也就是遙控門鎖中有一個短距離的無線電傳輸裝置,可以與車輛上的ECU通訊。這個無線電傳輸器會發送包含有身份信息的數據,然后ECU會判斷這個秘鑰是不是有效的,從而決定隨后的上鎖、解鎖和啟動引擎等指令。在吉普基諾這款車中,負責接收這個信息的還是RFHM。

            鑒于遠程代碼執行,這種攻擊平面很窄。因為,RHFM中一定有專門的固件來負責處理射頻信號,加密/解密代碼和識別電子鑰匙數據的邏輯以及編程備用電子鑰匙的邏輯。雖然這是一種可能的攻擊途徑,但是要想在RKE中找到漏洞來實現遠程代碼執行似乎是不可能的。

            圖-2014年款吉普切諾的電子鑰匙

            藍牙

            大多數汽車都能夠通過藍牙來同步設備。也就是說ECU有處理復雜遠程信號的能力。在吉普切諾上,藍牙是通過無線電廣播(頭單元)接收和處理的。這樣汽車就可以訪問手機上的通訊錄,通過手機打電話,聽音樂,發信息以及其他功能。

            不同于現有的其他信號,藍牙棧很龐大,同時也存在著大量的攻擊漏洞,所以攻擊平面很大。一般來說,涉及到藍牙棧的攻擊方案有兩種。第一種是利用未配對的設備。這種攻擊的危險程度是最高的,因為攻擊者可以獲取到設備的代碼。第二種利用方法是在配對完成后,因為涉及到了用戶交互,所以威脅性沒有那么大。曾經就有研究人員演示了如何利用藍牙接口來入侵一輛汽車。Codenomicon的研究人員還發現,汽車中常用的藍牙接收器有很多崩潰的情況。

            圖-2014年款吉普切諾的藍牙面板

            無線電數據系統

            無線電廣播不僅僅可以接收聲音信號,也可以接收數據。在吉普切諾上,無線電廣播可以接收多種遠程輸入,比如GPS,AM/FM廣播和衛星電臺。在多數情況下,這些信號都會簡單的轉換成音頻輸出,數據解析的數量也不大,這就說明其中不太可能有可以利用的漏洞。但是,例外就是無線電數據系統中用于發送數據和FM模擬信號(或衛星電臺)的數據。用戶可以感知到包括當電臺播報的電臺名稱和正在播放的歌曲名稱,在這時,數據必須要經過解析和顯示,這樣就為安全漏洞創造了空間。

            圖-2014年款吉普切諾的無線電廣播數據面板

            Wi-Fi

            有些汽車還提供了蜂窩數據上網功能,實際上,這些汽車是通過Wi-Fi熱點的方式來為乘客提供網絡連接。在吉普切諾上,這是一個根據使用情況購買的功能,比如按天或按月購買。我們觀察到即使是不了解汽車系統的人也可以訪問這個Wi-Fi系統。雖然Wi-Fi安全評估方法已經存在了好多年,但是近年來,數據點入侵攻擊還是經常發生。

            圖-2014年款吉普切諾的Wi-Fi面板

            車載通訊系統/互聯網/Apps

            如今的許多汽車都配備了蜂窩廣播功能,一般是叫做車載通訊系統,用于將車輛連接到數據網絡,例如,通用汽車使用的昂斯達系統。蜂窩技術也可以用于接收數據,比如交通或天氣信息。

            這一功能就像是汽車攻擊業的圣杯,因為,只要目標汽車上有蜂窩通訊,那么可以攻擊的范圍實在是太廣了。即使車載通訊單元不直接駐存到CAN總線上,這個通訊單元仍然可以通過麥克風向其他位置遠程傳輸數據/聲音。有的研究人員此前就遠程利用過汽車上的通訊單元,并且還沒有涉及用戶交互。在吉普切諾上,所有的這些功能都是由無線電控制的,而這個無線電廣播又駐存在了CAN-IHS總線和CAN-C總線這兩者之上。

            在2014年的吉普切諾上,其通訊系統、網絡、無線電廣播和Apps都在出廠時綁定到了哈曼Uconnect 系統上。接下來我們會詳細地介紹這個Uconnect系統,但是我們想要指出,所有與“信息娛樂”系統相關的功能都是物理集成在一個單元上。

            0x04 Uconnect系統


            2014年款的吉普雷諾使用了由哈曼卡頓生產的Uconnect 8.4AN/RA4 無線電廣播系統,并且哈曼卡頓是吉普汽車的唯一供應商,負責提供信息娛樂系統、Wi-Fi連接、導航、app和蜂窩通訊。大多數的功能都是集成在一塊德州儀器芯片上的OMAP-DM3730系統中,這是汽車上經常使用的一個系統。菲亞特克萊斯勒汽車的很多不同車型也都使用了哈曼Uconnect系統,包括克萊斯勒、道奇、吉普和Ram。當然,其他品牌的汽車也有的使用了Uconnect系統。

            Uconnect頭單元中同樣包含有微控制器和軟件,允許通過控制器局域網-高速(CAN-IHS)數據總線與車輛上的其他電子模塊通訊。在配備了Uconnect Access系統的汽車上,系統還會通過CAN-C數據總線,使用電子信息與汽車上的其他電子模塊通訊。

            不僅僅是吉普切諾這款車配備了哈曼Ucoonect系統,這個系統在克萊斯勒-菲亞特系列的汽車上也很常見,甚至還出現在了法拉利加利福尼亞這款車上。這就意味著,雖然我們是以2014年款的吉普切諾為例,但是,只要是安裝了Uconnect系統的汽車,這里提到的漏洞和信息都是適用的。所以說,在道路上,有漏洞的汽車數量相當龐大。

            QNX環境

            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

            如上所述,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

            ETFS實現了一個高度可靠的文件系統,供嵌入式固態存儲設備使用,尤其是NAND閃存。很顯然,ISO中并沒有出現ETFS,但是在一個活動的Uconnect系統上能檢查到。在我們看來,在ETFS上并沒有多少有趣的數據,所以我們就不深入了。

             例如:/fs/etfs/usr/var/sdars/channelart/I00549T00.png
            

            MMC

            在調查ISO和Uconnect系統時,我們發現MMC文件系統中的一些項目是最有意思的。最讓我們好奇的是這個文件系統可以掛載為讀-寫屬性,也就是說,如果這個文件系統上有我們感興趣的東西,比如啟動腳本或網絡服務,我們就可以啟用或修改其內容。比如,我們就發現了’sshd’,‘boot.sh’和 ‘runafterupdate.sh’這樣的項目。

            安裝腳本-’mmc.lua’會把ISO中的‘/usr/share/MMC_IFS_EXTENSION’復制到‘/fs/mmc0/app’。

            PPS

            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信息,只是我們想找到一種更好的辦法來實現我們想要的結果。

            Wi-Fi

            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"
            

            D-Bus服務

            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 的軟件開發工具來開發和調試這些系統。

            CAN連接性

            我們先前提到過,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章節。

            0x05 劫持Uconnect


            接下來你會發現,要想劫持Uconnect設備,并不需要遠程入侵這輛吉普,但是,要想弄清楚如何探索頭單元和其他部分,劫持是很有必要的。我們在這里提供了一些具體的信息來幫助那些熱衷于訪問頭單元文件的用戶。很顯然,本地安全是整個汽車安全中很重要的一個部分。因為任何漏洞作者都會告訴你說,只有搞明白了目標系統中錯綜復雜的關系,你才能創建一個能完全發揮作用的漏洞。

            總的來說,劫持Uconnect設備的方法有兩種,第一種適用于所有的版本,也很簡單;第二種只適用于特定的操作系統版本,但是可以視為一種合法的入侵。

            任意版本

            你可以把一個有效的ISO文件放到一個U盤上,再把這個U盤插入到Uconnect系統的USB端口。頭單元就會識別這個包含有更新文件的U盤并開始更新過程,如下。

            圖-Uconnect的更新界面

            如果你嘗試在U盤驗證后,但是重啟前,移除U盤,系統就會放棄更新并重啟進入常規(非更新)模式。

            但是,在驗證了U盤后,系統就會重啟頭單元。如果,你這時候關機并拔出U盤,系統就會簡單地要求你插入U盤。

            圖-要求插入U盤的界面

            此時,你可以插入一個新的U盤。我們不清楚系統會如何檢查新的U盤,但是一定和原來的檢查方法很 “接近”或者就根本不檢查。然而,U盤上可以包含修改后的文件。比如,通過修改原始ISO文件的十六進制值來更改根密碼是可以成功的。更新是從ISO文件上運行的,包括用于驗證ISO有效性的代碼。所以,如果你愿意的話,也可以阻止代碼運行完整性檢查。

            版本14_05_03

            版本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/
            

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线