压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

騰訊聶森+劉令:特拉斯網關的逆向揭秘

聶森:大家好,剛才已經幫我做了前面的背景介紹,今年9月份我們實現了無物理接觸的遠程控制方法去控制特斯拉。

實際上這是一個非常復雜的攻擊連,涉及到多個漏洞,從前面的邏輯漏洞,內核相關,包括一些單片級ECU的安全,這是一個非常復雜的過程,我們認為50分鐘是不可能講完的。

而且我們現在的漏洞還在和特斯拉溝通進行修復,他們已經做了一個快速的修復,可能后續還有一些安全加強,所以我們今天重點介紹的是其中非常關鍵的一個環節,就是特斯拉撤電網絡中非常重要的一個,叫做汽車網關的Review。

我們先做一些簡單的自我介紹,我是聶森,是Keen Team的一位安全研究員,我沒有很多年的安全經驗,在我加入Keen Team的前兩年,在學校的時候我主要是做程序相關的,主要是把一些理論和實際應用于挖掘,例如Windows內核,Linux內核以及手機的安全內核。

劉令:大家好,我是劉令,現在做車聯網相關的漏洞研究工作,在此之前我做過一時間虛擬化的漏洞研究。

聶森:今天首先給大家介紹一下什么是汽車網關,講一下特斯拉汽車網關和傳統的汽車網關的異同,硬件的特性,這里我們要說的就是,在汽車安全研究領域,大家一個普遍的認識,就是很多研究工作是用在前期的一些工作。

因為現在有一些單片機,我們普通的是沒有辦法做到的,不太像是Windows和Linux下面的一些應用態和應用程序,所以我們要做大量的前期工作來幫助后面分析。這里面還涉及到一個操作,這個東西我們做一個快速的介紹。

然后就是由我的同事劉令真正的介紹一部分,就是特斯拉網關獨有的,可能是一些攻擊面或者是一些神秘的細節,以及我們最終實現整個攻擊鏈重要的接口。

什么是汽車網關?汽車網關也是一個單片機,它的作用就是在不同的CAN上面,它要處理以太網的數據和CANBus是怎么交付的,這個工作是由汽車網關完成的。

這里除了通信之外,因為我們把這各連入英特網或者是以太網的方面數據是不可信的,CANBus我們理解為一個可信區域的話,這中間肯定有一些必然的過濾。

這里還要介紹一些常用的汽車網關,第一個就是在我們之前,他們設計了一個單片機,就是NEC V850,這個市場量非常大,利用特斯拉Freescale MPC的單片機去研究。

另外一個是我們在國內看到的一個單片機,汽車網關是NEC的78K0R。我當時做了一個簡單的調研,我覺得它只是在國內的廠商應用比較多,因為它的成本還是比較低的。

但是非常巧,我沒記錯的話,7月底,10月初的一個國外的會議上,硬件安全相關的會議上,有一個演講者也介紹了類似的問題,同時他也提到了對于特斯拉的一些猜測,認為我們是怎么做的。我覺得作為同行,看來大家對這個問題的理解還是比較相似的。

這是特斯拉汽車網關的一個架構,在我們的研究之前,其實大家知道,在2015年有國外的研究員已經把特斯拉稱為是物理接觸的,先把車拆了,做一些實驗,然后就可以做到一些不涉及的一些控制項目。

當時他也給出了一個架構圖,主要是偏向于我這個圖里面綠色的部分,他不重點去介紹汽車網關,主要是介紹一些復雜性的架構,這個也很復雜,我們花了很多時間研究,在那張圖里面,汽車網關就是一個沒有重視的節點。

這個硬件架構剛才也介紹了,是Freescale MPC5668G的芯片,在上面跑了一個系統,因為它要實現CANBus和以太網的連接,所以必然要以上面一個任務的形式實習協議站和CAN模塊。

在這之上還有一些任務,專門用于跟以太網通信的一些Task,用來收發消息的一些Task,包括一些調試用的Task。

紅色的部分是高危組件,跟CANBus有關的,CANBus分為高速、低速不同的頻道,包括開個空調,開個燈或者是車門,PT就比較重要了,包括車速和速度。

在這里展開介紹一下對于硬件方面我們是怎么獲取信息的。背景就是我們只有2014年款的特斯拉,這是我們唯一一輛。大家知道,在中國想買特斯拉汽車配件是不可能的,這個盒子拆到這個地步我們就不敢拆了。

但是我們相信,Gateway應該是在圖中這個白顏色的下面放著,因為其他地方確實沒有看到這個Gateway的芯片。非常走運的是,我們在TMC國外專門討論特斯拉的論壇上看到一位仁兄給出來一個非常關鍵的信息,在其中一個芯片上,我們上面也給出的鏈接,如果大家感興趣的話可以看一下具體是什么東西。

這個信息我們應該是不敢相信的,因為我們沒有看到真實的東西,大家知道黑客沒有看到的話是不太相信的,我們后期還是用了很多輔助的方法確認了這些信息。

說完硬件就是固件,做單片機分析的話沒有固件是很麻煩的,而這個固件提取我認為還是相對來說比較容易的。有幾種方法,我相信現在特斯拉都已經把它給補掉了。

其中一個就是我的同事在兩年前的時候通過拆機就可以看到有固件包,我們也是在這里提取的。后來同事劉令發現通過網絡接口是可以下載到這個包的,通過它的OTA機制。

現在好像更新完之后不再有這個包了,會直接通過某種機制刪掉,而網絡可能下載一些方法也變了。因為這個東西把它存在SD盤里面,后續可以刷機。我們在研究過程中,也把整個機刷裝過幾次,拆卸非常麻煩,每次大約一個小時。

后來我這個同事,專門做硬件安全的一個小伙子,我們經過了商量之后,就在這個上面開了一個口子,就算是丟失保修了,但是我們也沒準備保修。解開之后就很簡單了,簡單來說就是一個壓縮包,我第一眼就看到了gtw.hex,其他的都不是今天要講的重點,但是那是未來研究的特點,各有各的特色。

介紹完硬件介紹一下對于芯片的一些分析,首先是內存布局,內存布局有幾塊,介紹一下特斯拉特殊的東西。

雖然有一個區域叫做Flash,其實這個地方放的東西也可以出來,我們稱為Flash的區域這個部分,刷寫的時候為了實現更新,沒有那么簡單的,他把數據放在了后面,在每次執行的時候會把一部分數據再拷貝到內存里面,這樣就具有了堆寫能力,這一部分我們要模擬一下,后面我會介紹,否則的話分析難度會比較大。

關鍵集成分析,大家要忘記過去的分析方法,因為現在沒有字符串可以參考,簡單的程序大家看字符串就可以出來了,現在的思路就是關心什么模塊就看什么模塊相關的信息。我們也是前期做了大量的工作,寫了一些腳本,用來進行分析。

對于前面說的論壇里面一位國外的仁兄提到的這個FreeRTOS,我們通過這個細節就確定應該是有這個信息,這里有一個字符串,應該是一個時鐘相關服務的字符串,我們在源碼和二進制里面找到了,而且有非常完美的對應關系,就是創建一個Task,來創建相關的代碼。

兩個操作系統都有介紹,一個是任務,一個是隊列,這里的隊列是一個數據通信的方法,Windows下可能有基于內存文件的映射,還有其他的一些相關的各種各樣的通信方式。

這張圖是任務的管理,生存周期,這個也很常用,不展開了。重點是創建任務,這個任務是怎么創建出來的,基于這個信息我們要提取出來有多少個任務,每個任務都是在做什么。

隊列的話,就是RTOS通信的方法,在內存里面寫入一些數據,這些數據是通過隊列的一些封裝進行傳遞。這個東西在特斯拉領域的作用就是消息是通過這種來傳遞的,一個任務接收,通過另外一個任務去發送。

基于之前介紹的這幾頁PPT,最終的結果就是這樣,我們把那些函數都已經識別出來了,也把它標記到這個當中,這也是我們前期工作的一個部分。

還有就是非標準Task里面的協議站,具體代碼我們是把標準接口列出來,最終是實現遠程控制。對于一些接口文件,我們都已經逆向出來了,后期要做的工作就是說,如果深入的逆向的話,這兩個模塊到底是什么?

對于TCP/IP我只能說猜測,應該是非常知名的項目,叫做IOWIP這個項目實現的一個嵌入式協議站,文件系統的話,現在看不出來什么特征,如果確實是一個FS,具體怎么實現的,大家也可以猜測。另外有一個細節,這個里面是比較通用的,就是說可能明天我換一款車,還是要出這些細節。

在面對這種特殊的架構,這種特殊的格式的話,這個識別是有問題的。而這個芯片是32位的,所以肉眼去找看一下,是四字節對齊的,要寫腳本把這些東西處理一下,這里給出來的就是比較典型的,有附加1個0,3個0和4個0的情況,這一部分處理的比較完美。

含多函數的IDA沒有辦法識別,可能沒有一個明顯的應用。這個時候怎么辦呢?就要把一些通用的函數識別出來,腳本自動化出來。很關鍵的信息,這不是一個明顯的調用,這種情況下看著不起眼,反而是最關鍵的內容所在。

剛才提到一部分,因為Flash2這個區域是只讀的,是更新的,把數據放在最后,再放到內存里面,可以實現讀寫。如果這一部分不標記出來的話,后面的逆向難度比較大。

大家也看出來,這是相當于為后面的逆向奠定了一個很好的基礎,而且都需要做類似的工作。后面這一部分由我的同事劉令給大家介紹一些特斯拉獨有的攻擊面,也可能是一些細節,可能是一些端口的信息。

劉令:大家好,接下來我向大家介紹一些內部的細節,包括所具有的功能,以及向外面提供的一些接口。前面聶森已經介紹了,在特斯拉上,Gateway是一個同一個網關的,當我們拿到權限的時候,和Gateway處于同一個網關,我們要關注的是上面所關注的端口。

根據空間的立項以及實際的測試,我們發現下面某一個端口是Gateway提供的,TCP23端口,是一個Shell Port,1050的端口是file Transfer Port。UDP的3500端口,CID可以通過這個端口告訴Gateway發生了什么樣的數據。

38001端口是UDS協議有關的端口,在某些情況下可能會參與車身上ECU更新的過程。由于前三個端口和Gateway內部的聯系更為緊密,所以今天就以這三個端口作為切入點,講解一下在Gateway內部是如何工作的。

TCP 23端口是Shell的端口,這個任務是在Gateway起用時就創建起來的。但是當我們在CID端用NCE去嘗試連接Gateway的23端口的時候,是沒有辦法連接的。

解決這個問題的辦法在去年的GeekPwn已經有人指出了,只要到3500端口就可以成功連接,就可以收到Gateway發來的一個問號,這個時候我們并不知道Gateway的意圖是什么,所以我們就去看固件。發現Gateway在發出信號以后,會再接收一段數據,將這個數據與一個靜態的字符串進行比較,如果內容是相同的話,才會繼續處理Shell的功能。

實際上這個字符串就是Shell的一個密碼,輸入完密碼以后,我們就可以成功的連入到Gateway提供的Shell,就可以看到Gateway提供的一些版本信息。

Gateway還提供了很多其他的命令,其中有一個是Tegra命令,當執行完這個命令以后,我們就神奇的看到了終端登錄,實際上在背后,CID的串口是連到了Gateway上面。

借助于這個串口,我們可以看到CID在啟動時在串口上輸入的一些信息。另外一個比較有趣的命令是Status命令,這個命令會顯示車身上的CAN總線復雜的情況,通過逆向,在逆向時跟蹤這個函數的代碼,可以幫助我們去確定與CAN總線有關的數據結構以及在固件當中的位置,以及大致確定他們的定義是怎樣的。

另外一個是Stackinfo這個命令,這個命令會顯示在Gateway上所運行的每一個Task占的空間在內存當中所占的區域。這些信息對于內存破壞類漏洞的利用是比較有幫助的。

第二個端口是1050,是文件傳輸端口,負責這個端口的是xfeTask任務,是在Gateway啟動時就創建的。CID想要發送文件到Gateway上的時候,更多使用的是gwxfer的Perl腳本,一個是源地址,一個是目的地址,指定到目錄,信息或者內容按照一定的協議格式進行包裝,并填好ID,發送給Gateway。

在Gateway端有許多的處理過程,根據填好的ID來選擇相應的處理過程,它已經提供了7個目錄,而Xfer腳本里面只使用了其中三個,還有獲得文件大小的功能。

除此之外,還有其他的如創建文件夾,刪除文件和重命名文件,這些就需要在CID端,只要按照一定的格式就可以去調用這些目錄。

在進行文件傳輸的時候,有一個比較特殊的情況就是Gateway端根目錄下的這個文件,如果傳輸到根目錄下,實際上在Gateway的SD卡上面是并不會創建這樣一個文件的,而從Gateway上去下載這樣一個文件的時候,確確實實是可以下載到這樣一個文件。

實際上這個文件的內容并不是存到Gateway的SD卡上面,而是存在了Gateway的Flash上面。firmware.rc是存到0X18000上,所存放的內容是CID、Gateway以及車身上其他ECU的一些版本信息。

與其類似的還有一個是Nternal.dat這個文件,是0X1C000,存放的是ECU的設置信息。

之所以內容并沒有存放到SD卡上,是因為他們改寫了fopen這個函數,對這兩個文件做了特別的處理。下一個是診斷端口,負責維護這個端口的是一個名為diagTask的任務,CID選擇調用Gateway所提供的功能的時候,需要按照一定的格式去放入數據,第一個字節是功能ID,后面是這個Command所需要的參數。

Gateway會根據功能ID來選擇,后面跟著的是處理的結果。在我們看到的固件當中,Gateway已經提供了有31個功能ID。

下面介紹幾個功能,CID只需要發送00這樣一個字節到Gateway上面,Gateway就會自己重啟。前面我已經介紹了,Gateway上面有一個位于2000,負責實現Gateway正常功能的,是APP代碼。

另外一個是從0開始的,Bootloader代碼,在新的版本上,這個反饋值是-1。

下面是0X8 Reboot for Update,會先將一個文件傳輸到Gateway上面,然后將這個文件作為調用的參數發給Gateway,Gateway再處理的時候,會將這個文件重命名,然后讓Gateway去重啟。

Gateway重啟以后,會發現有這個文件,會將這個文件反應到內存,再從這個文件去執行后續的更新的過程。

0x9號功能是Reset Tegra,剛CID Sends發生0900的時候,會通知CID重啟,當CID發生0901的時候,會設置為1,CID又會重啟到另外一種模式。

當CID發生一個固定的字符串到Gateway上面的時候,Gateway就會去著手清理Log,首先Gateway會將這些數據放到一個隊列當中,Gateway的另外一個Task會從這個隊列里面取值,當取到這個0x9的時候,就會刪除下面的Log文件,將Gateway重啟。

0X12號功能是Enable Shell,到1201端口的時候會開啟一個Shell,只有30秒。

這是因為Gateway接收到1201的時候,會放到一個全局變量里面,正常處理這個Shell請求的時候,會看當前的時間是否在30秒之內,如果是的話才會去處理用戶的Shell請求。04號功能由聶森給大家來介紹。

聶森:這個部分很關鍵,大家看名字就可以看出來,是有希望通過以太網去注入CAN消息到CANBus上面。
這個逆向看起來非常復雜,中間我們也遇到了一些坑,是很多團隊協作的工作。從兩個方向進行突破,一開始是我自己犯了一個錯誤,我說為什么Shell里面有一個Reset BMS,好像是一個固定參數。

從另外一個方面,確實有同一個函數使用變量,因為很難想像一個東西既從Shell進來,又從另一個接口出來。

有一個小伙伴看到了隊列通信的機制,看完告訴我說,這個函數是用來發CAN消息的,當時就恍然大悟了,防止有惡意數據,所以封裝了一個固定的CAN消息的包。而診斷端口本身就是發任意消息的,當然有一些后面我們會介紹。

后面從兩方面終于確定診斷0X04這個接口進來,最終會發一些我們用戶可控的,最后就是逆向,第一個字段是0X04一個功能號,后面是這個消息的消息ID,后面是對應的內容,就把數據一共享,感覺哪些是高危的,下面給了一個Demo。

在CID里面發給Gateway,就是這么一個命令。

但是特斯拉還是做了很多,這個東西車一旦動起來是沒有辦法發送的,如果你想發送,就需要把一些命令繞過。

終于我們做到了這一點,我們實現了Patch,這個Patch也是由N個漏洞組成的,他既然把這個放在身上就加了很多保護,但是最終我們確實是做到的。

這里只給一個證據,我們把它Patch之后加了一個字符串,我們其實做到了,這部分信息我們等90天之后會公開。

這里有一個簡單的視頻,是基于我們之前的研究,可以給大家播放一下。這個Demo結合了我們如何開后備廂的,這里面有一條CAN消息,我們其實有很多條,我們加進去,遠程發送,而且Patch了Gateway,我們實際測速30公里/小時沒有問題,但是我們沒敢測。

大家注意一個細節,很多人認為,包括網上討論我們這個是有作弊的嫌疑的人,很多人認為我們只是控制了這個Linux的車機,車機上有一個按鈕,可以打開后備廂的。

其實他們可能是買不起特斯拉,如果他們買得起的話,真正開起來你就會發現,當車動起來之后,你要是和車機都是沒有辦法按這個按鈕的,只有去Patch了Gateway才有可能去實現。

剛才也介紹了,我們這一部分的內容很多,介紹完之后,其實不是我們整個研究,我們整個研究有將近8個人參與,持續了三個月,還有很多跟CAN總線相關的,包括瀏覽器內核的集群,這些東西我們是希望90天的這個時間過完之后會公開,肯定會公開,而且會發論文。

如果大家感興趣的話可以聯系我,最后再次公布兩個信息。

一個就是我們科恩實驗室會持續關注車聯網的研究,除了特斯拉之外,我們目前也在其他的設備上有一些可能危害人身安全的,或者可能達到高危情況的研究成果,我們會陸續公開,所以大家不要認為這是一個樂趣,我們有特斯拉,我們會持續關注于這個領域。

第二個信息就是持續關注我們需要招聘一些新的安全研究人員,大家感興趣的話可以聯系我,謝謝大家!

上一篇:Pwn2Own王宇:針對黑客比賽當中安全漏洞分析

下一篇:騰訊周斌:數據安全業務上的對抗