Tesla Model S如何更新其固件?對顯示器和儀表盤進行逆向工程時,我們發(fā)現(xiàn)了什么?
第1部分:分析硬件,并在CID中完成14層PCB
第2部分:逆轉(zhuǎn)固件更新過程和Suicide Bomber模式的重要性
CID VCM軟件架構(gòu)
與大多數(shù)嵌入式系統(tǒng)相比,CID更大,更復(fù)雜;對于嵌入式系統(tǒng)而言,CID則是linux發(fā)行的Ubuntu的完整版本,這對嵌入式系統(tǒng)而言是不尋常的。
在內(nèi)核中,我們找到了自定義元素,例如Harman Redbend。該內(nèi)核是使用Linaro工具鏈構(gòu)建的。
為了滿足使用開源軟件的法律要求,特斯拉在項目進行到一半的時候就透露了內(nèi)核的來源。但是,這對逆向工程無濟于事,因為它僅占系統(tǒng)的一小部分。
引導(dǎo)加載VCM
這似乎與許多Tegra設(shè)備相似。
BPMP(啟動和電源管理處理器)是Tegra SoC的輔助處理器。它執(zhí)行存儲在ROM中的只讀引導(dǎo)程序,并且是ARM7處理器。此時,我們關(guān)閉了Tegra中的主處理器。
當(dāng)BPMP ROM引導(dǎo)加載程序從NOR閃存中讀取一條數(shù)據(jù)時,會提供大量信息。這稱為BCT(引導(dǎo)配置表)。信息包括:
內(nèi)存中幾個引導(dǎo)程序的地址
將引導(dǎo)程序加載到SDRAM的位置
SDRAM中引導(dǎo)加載程序的入口點
連接到系統(tǒng)的SDRAM的配置(需要進行引導(dǎo)才能訪問)
將第一階段引導(dǎo)加載程序復(fù)制到SDRAM之后,BPMP開始執(zhí)行。此時,我們尚未打開Tegra中的主處理器。
第一階段的引導(dǎo)加載程序似乎稱為QUICKBOOT,其大小約為56KiBytes。明確引用了AES-Cmac(消息認證代碼)。此處使用的字符串中包括“ AES-CMAC Xor”,這些字符串也可在開源引導(dǎo)程序U-boot中找到(github)。

來自第一階段引導(dǎo)程序的字符串
人們可能會認為引導(dǎo)加載程序是基于U-boot的,但是特定的加密功能實際上是由Nvidia編寫的,因此可以由Nvidia在其他地方免費使用。
當(dāng)?shù)谝浑A段引導(dǎo)加載程序正確設(shè)置SoC時,主處理器就會啟動。然后加載第二階段的引導(dǎo)加載程序,以允許主處理器運行。
當(dāng)我們解壓縮并運行內(nèi)核時,我們發(fā)現(xiàn)第二階段的引導(dǎo)程序非常簡單。
我們沒有看到任何加密保護的跡象。它似乎不是基于任何廣為人知的引導(dǎo)程序,而是我們認為它是完全自定義的。
寬松地遵循Android bootimg格式,內(nèi)核映像由一個文件中的內(nèi)核和ramdisk組成。內(nèi)核激活后,將運行名為/sbin/init-stage-0.sh的腳本。其主要目的是通過安裝NAND閃存分區(qū)使系統(tǒng)完全可操作。
NOR閃光燈
我們在NOR flash中找到了BCT,第一級和第二級引導(dǎo)程序以及內(nèi)核。

CID NOR閃存的布局
我們發(fā)現(xiàn)許多分區(qū)已經(jīng)像到主分區(qū)和恢復(fù)分區(qū)。
NAND閃存
/ usr /文件系統(tǒng)存儲為sqaushfs文件系統(tǒng),其中包含在正常操作期間不會更改的二進制文件和腳本。
SquashFS在低資源嵌入式系統(tǒng)中很常見,是一種壓縮的只讀文件系統(tǒng),它允許文件系統(tǒng)的不可更改部分占用較小數(shù)量的閃存。
/ var /目錄包含日志,是一個小的128Mb ext4文件系統(tǒng)。
/ home /目錄包含升級文件和臨時數(shù)據(jù),以ext4文件系統(tǒng)的形式存儲在其余的閃存中。
/ home和/ var目錄覆蓋在只讀文件系統(tǒng)上,僅允許少數(shù)幾個目錄被讀/寫,這意味著系統(tǒng)的大部分內(nèi)容都是只讀的。
雙庫固件
初始ROM引導(dǎo)加載程序運行后,引導(dǎo)加載過程可以選擇兩個映像:
ROM引導(dǎo)加載程序–僅提供一個副本。
除非存在災(zāi)難性的硬件問題,否則它是不變的,并且不太可能失敗。
stage1_primary / stage1_recovery –由ROM引導(dǎo)程序順序選擇。
如果第一個失敗,則第二個運行。
除了內(nèi)存中的位置,這兩個引導(dǎo)程序看上去幾乎相同stage2_primary / stage2_recovery –在此運行的引導(dǎo)程序由哪個stage1引導(dǎo)程序運行確定。
同樣,兩個引導(dǎo)加載程序看起來幾乎相同,除了內(nèi)存中的位置kernel_a / kernel_b –這兩個內(nèi)核的引導(dǎo)參數(shù)彼此非常不同系統(tǒng)啟動時可以掛載在線/離線usr分區(qū)。
這是兩個內(nèi)核的引導(dǎo)參數(shù):

init-stage-0.sh腳本讀取thispartid的值,并加載兩個/ usr / squashfs分區(qū)之一。如果其中一個損壞,則可以使用另一個恢復(fù)。
我們還可以看到AppArmor通常處于啟用狀態(tài)。該強制訪問控制系統(tǒng)允許內(nèi)核將二進制文件限制為受限的資源集。Ubuntu默認情況下啟用此功能。Tesla上的配置看起來是標(biāo)準(zhǔn)配置。
安全啟動
Tegra支持安全啟動,但是圍繞它的文檔和代碼示例看起來很零散。在開發(fā)人員論壇中,關(guān)于如何實現(xiàn)它有些困惑。這在高端處理器中很常見。
我們無法最終驗證使用安全啟動的程度,但是我們確實發(fā)現(xiàn)了幾件事。ROM引導(dǎo)加載程序通過內(nèi)部存儲的密鑰驗證BCT的簽名。這稱為SBK。AES-CMAC是BCT的一部分,并經(jīng)過了驗證。這是對稱加密-如果發(fā)現(xiàn)了密鑰,則可以生成有效的BCT。
我們無法確定SBK在每個設(shè)備/車輛上是唯一的還是較大的組所共有。我們將需要使用多個車輛來確定這一點。
另外,Tegra可以在內(nèi)部僅存儲一個公鑰,因此可以使用公鑰加密。即使發(fā)現(xiàn)了公鑰,也仍然無法生成正確簽名的BCT圖像。
這是對稱密鑰的更強替代方案。據(jù)我們估計,在2015年之前(特斯拉CID部署后),軟件支持還沒有到位。
第一級引導(dǎo)程序執(zhí)行第二級引導(dǎo)程序的AES-CMAC。我們無法確定在此使用了哪個密鑰,但是Tegra文檔指出也可以使用SBK。
第二階段引導(dǎo)加載程序僅執(zhí)行內(nèi)核的CRC。如果信任鏈斷開,攻擊者可能會在此階段將惡意內(nèi)核加載到設(shè)備上。
用戶空間軟件
CID一旦啟動,便進入用戶空間。
一系列Qt二進制文件呈現(xiàn)了CID的用戶界面。我們僅對它們進行了非常有限的逆向工程。一個8字符的PIN保護CID上的服務(wù)菜單,該菜單似乎每天都在變化,并由CID實現(xiàn)。
Shell腳本在車輛中實現(xiàn)了大量功能。逆向工程變得容易,因為它們是人類可讀的文本文件。
固件更新機制
我們觀察到了多種固件更新機制。
從車輛到特斯拉系統(tǒng)的出站VPN連接是所有機制的核心。我們沒有觀察到任何其他形式的傳輸加密。來自CID的所有請求都是使用未加密的HTTP發(fā)出的。
我們看到了以下更新機制:
1、Shell腳本–看起來像舊系統(tǒng),但與后來的更新程序二進制機制有很多共同點。
2、更新二進制文件–大型的多調(diào)用二進制文件輪詢以獲取更新,下載更新并將其應(yīng)用于系統(tǒng)。
3、內(nèi)核/引導(dǎo)加載程序–內(nèi)核和引導(dǎo)加載程序由特定的二進制文件更新。
4、地圖– VPN連接用于下載地圖數(shù)據(jù)常規(guī)ECU –通過CAN網(wǎng)關(guān)將固件更新從CID分發(fā)到ECU,使用了一個復(fù)雜的過程。
5、Wi-Fi模塊和蜂窩調(diào)制解調(diào)器的USB固件。
我們在下面考慮這些。
VPN連接
通過CID建立與Tesla服務(wù)器的OpenVPN連接。每輛車的鑰匙和證書用于執(zhí)行此操作。車輛的VIN是證書的主題。

示例VPN密鑰
我們能夠從本地訪問CID的文件系統(tǒng)中提取這些密鑰,然后通過在另一臺機器上使用它們來連接到Tesla網(wǎng)絡(luò)。
密鑰已于2018年5月31日到期。如果此后沒有通過固件更新進行更新,則似乎沒有回退機制。使用安全配置的VPN,將無法攔截通信或?qū)ζ溥M行篡改。可以通過Wi-Fi或蜂窩網(wǎng)絡(luò)(無論哪個可用)建立VPN。
通信的某些方面(例如,大量下載)顯示出對Wi-Fi的親和力。大概是為了減少特斯拉的成本。
連接到VPN時,會自動建立許多路由:
- 32.0.0/16
- 33.0.0/16
- 224.0.0/24
- 232.75.0/24
- 232.79.0/24
根據(jù)特斯拉漏洞賞金計劃,對這些范圍進行了完整的端口掃描,僅發(fā)現(xiàn)了少數(shù)主機:
1、vn.teslamotors.com –車輛數(shù)據(jù)和狀態(tài),安全令牌更新,以訪問診斷和IC SSH
2、vn.teslamotors.com –固件下載和更新
3、
Firmware-bundles.vn.teslamotors.com –已失效的固件更新服務(wù)器
4、vn.teslamotors.com –地圖數(shù)據(jù)和更新
根據(jù)特斯拉安全性的早期報道,VPN密鑰存儲在連接到網(wǎng)關(guān)的大型SD卡上。通過卸下SD卡,可以輕松恢復(fù)這些卡。被測車輛并非如此。在這里,它們存儲在CID中VCM上的NAND閃存中。

固件服務(wù)器

來自服務(wù)器的示例JSON響應(yīng)
Shell腳本固件更新
我們在Tesla文件系統(tǒng)上找到了舊版固件更新機制,該機制采用了一系列Shell腳本來執(zhí)行更新。即使它不再運行(沒有返回有效的下載URL),它也提供了許多有用的信息。
握手固件下載
通過Tesla VPN,shell腳本/ local / bin / do-firmware-handshake獲取并安裝固件更新。
該腳本可以通過多種來源啟動:
1、定期使用新規(guī)事件管理器(盡管未在操作中看到)
2、響應(yīng)名為“ firmware-handshake”的新貴事件
3、手動(盡管未觀察到,但已在文件注釋中指出)
該腳本從高層獲取并應(yīng)用更新,如下所示。
該腳本使用哨兵文件檢查是否正在進行現(xiàn)有升級。
打開升級包并進行安裝的外殼程序腳本,檢查“ unpack.sh”腳本是否正在運行。
如果正在進行升級,則執(zhí)行固件握手,因為更新已經(jīng)在進行中。
可以假設(shè)網(wǎng)關(guān)正在處理升級,并且如果哨兵文件小于20分鐘,則do-hardware-shash退出。因此,不會對網(wǎng)關(guān)執(zhí)行任何主動檢查以查看其是否被占用。
如果網(wǎng)關(guān)更新的時間早于20分鐘,則將其掛起,并且握手過程將繼續(xù)。要查看VPN是否已連接,腳本將檢查接口tun0是否存在。
如果未連接VPN,腳本將等待30秒鐘再試一次。沒有積極嘗試建立VPN隧道-另一個外部過程會這樣做。建立VPN連接后,腳本將連接到以下URL:
firmware.vn.teslamotors.com:4567/vehicles//handshake
發(fā)送以下數(shù)據(jù):
vehicle_hardware_configuration_string –由“硬件ID”派生,這是一個用逗號分隔的字符串,用于描述網(wǎng)關(guān)存儲的車輛配置。另一個外殼程序腳本/ usr / local / bin /
vehicle_hardware_configuration_string生成此字符串。格式:

從/ etc / swver讀取,這是在CID上運行的軟件版本。
然后,服務(wù)器返回JSON字符串,該字符串應(yīng)包含以下字段:
Firmware_download_url –我們將下載的文件的位置
Firmware_download_file_md5 –我們將下載的文件的MD5校驗
Download_status_url –用于回傳升級狀態(tài)的URL
Vehicle_job_status_urlUnpack_size –解壓縮的固件文件的大小
Install_size –安裝固件文件所需的大小
我們發(fā)現(xiàn)仍然可以發(fā)出這些請求并接受響應(yīng)。至關(guān)重要的是,我們發(fā)現(xiàn)可以使用另一輛汽車的VPN來請求任何VIN。
我們很驚訝地發(fā)現(xiàn),JSON響應(yīng)不是使用jq這樣的健壯解決方案,而是使用awk,gsub和split手動解析。然后對這些字段進行一些基本的完整性檢查。為了指示升級已經(jīng)開始,將download_status_url存儲在前哨文件中。
通過對文件發(fā)出HTTP HEAD請求,然后檢查firmware_download_url文件的大小。我們認為這是一種奇怪的機制,因為它可以簡單地在JSON響應(yīng)中傳輸。
firmware_download_url在獲得的所有響應(yīng)中都指向服務(wù)器
firmware-bundles.vn.teslamotors.com。盡管是通過握手過程發(fā)出的,但沒有任何鏈接有效。
使用JSON響應(yīng)中的unpack_size和install_size,對Flash文件系統(tǒng)上的備用空間執(zhí)行基本檢查。為了防止CID休眠60分鐘,將對在端口4035上的CID上運行的Web API發(fā)出請求。現(xiàn)在下載文件。
它作為一個部分進行下載-不會以任何方式分塊或拆分。如果不是預(yù)期的大小,則再次嘗試下載。
無法逃避這種情況,這意味著腳本可能會陷入無限循環(huán)。對于測試期間獲得的示例firmware_download_url示例,這些文件僅只能通過Tesla VPN下載。
然后將文件的md5校驗和與期望值進行比較。如果文件不匹配,則再次嘗試下載文件。下載文件后,將通過CID屏幕上的彈出窗口提示用戶升級。
另一個shell腳本/ usr / local / bin / get-response執(zhí)行此操作。它向端口4070上CID上運行的Web API發(fā)出請求,并等待一個小時以做出響應(yīng)。
如果用戶接受更新,則下載的文件將移至/ home / tesla / dropbox,準(zhǔn)備安裝。
USB更新
使用USB記憶棒,也可以將更新文件放入/ home / tesla / dropbox。Shell腳本/ usr / local / bin / usb-upgrade執(zhí)行此操作。
該腳本在文件夾/ toinstall中查找文件名,格式為文件名:ui_full_package_*_<code>_pedigree_v*.tar.gz
使用下表,從車輛的VIN碼中查找<code>:

某些VIN通過USB更新的處理方式有所不同
他的表格顯示有帶有預(yù)設(shè)VINS的開發(fā)工具。如果此文件名中沒有CID上的軟件的當(dāng)前版本,則將文件復(fù)制到Dropbox中,然后安裝。
由于檢查是幼稚的,并且忽略了實際版本,因此可以進行固件的升級和降級。
腳本中似乎有一個錯誤。如果腳本中不存在車輛的VIN,則返回的<code>只是空白。這將導(dǎo)致以下形式的文件匹配:ui_full_package_*__pedigree_v*.tar.gz。
在USB記憶棒上的給定文件夾中,攻擊者似乎可以放置特制的固件更新文件并執(zhí)行任意代碼。我們嘗試了很多次,但無法觸發(fā)。另一個安全控制措施是阻止腳本被調(diào)用,但是我們無法確定它是什么。
Dropbox安裝
位于/ local / bin的腳本“ unpack.sh”安裝位于/ home / tesla / dropbox文件夾中的軟件包。
該腳本描述了該過程,并對其進行了大量注釋和。
盡管它是自定義的,但軟件包格式非常簡單,攻擊者很容易重新創(chuàng)建。從高層次來看,該過程如下:檢查是否提供了文件名,并且該文件存在。一旦汽車“停放”,另一個shell腳本將執(zhí)行此檢查-/ usr / local / bin / car-is-parked。
在CID的端口4035上,這會向Web API發(fā)出HTTP請求,以檢查汽車是否處于“停車”檔。
值得注意的是,停放腳本包含檢查速度為零的函數(shù),但是這些函數(shù)不會被調(diào)用。
腳本等待5分鐘,然后再次檢查汽車是否未停放。
為了防止CID休眠20分鐘,然后在端口4035上向Web API發(fā)出請求。使用實用程序mktemp在
/home/tesla/unpack.tmp-XXXXX中創(chuàng)建一個臨時目錄。tar文件已解壓縮到臨時目錄中。檢查是否存在4個文件:
- NAME of the package
- VERSION number of the package
- md5sums of files in the package
- tar.gz – files associated with the package
該過程不會檢查它是否存在,但是它期望文件“ install.sh”存在。為了檢查文件的完整性,將文件md5sums饋送到工具md5sum。這不增加安全性,而純粹是完整性檢查。
將名稱,版本和data.tar.gz作為參數(shù)傳遞后,將執(zhí)行文件install.sh。為了最終控制軟件包的功能,install.sh可以執(zhí)行root用戶通常可以執(zhí)行的任何操作。
install.sh文件可以包含任意命令,并且整個過程以root用戶身份運行。為了控制,攻擊者可以將有效的升級程序包放置在保管箱中,以對CID或IC進行任意操作。
我們已經(jīng)看到一些評論,這些評論表明,眾所周知,此過程不健全且存在問題:

這種機制遠非安全,它在VPN提供的傳輸加密之外幾乎沒有保護措施。這可能是不推薦使用的主要原因。我們不知道為什么它仍然存在于系統(tǒng)中。
開發(fā)人員可能會擔(dān)心刪除眾多腳本之一可能會導(dǎo)致意想不到的后果。
更新程序更新
我們認為這是更新固件的正常機制。它是一個大型的整體二進制文件,包含大量功能。幸運的是,反向工程通過靜態(tài)鏈接(即,將所有代碼編譯到其中)和調(diào)試版本(即,它包含通常會被剝離的字符串和函數(shù)名)而得以加速。

與調(diào)試信息靜態(tài)鏈接
通過更改二進制文件的名稱激活,更新程序可以采用幾種不同的“個性”。每個人都可以打開一個命令端口和一個HTTP端口,它們偵聽設(shè)備的所有接口。
1、ic-updater – IC的更新程序。打開用于命令的端口28493,并打開21576作為Web服務(wù)器。
2、cid-updater – CID的更新程序。打開端口25956用于命令,打開20564作為Web服務(wù)器。
3、gwxfer –用于將文件傳輸?shù)骄W(wǎng)關(guān),是gwxfer shell腳本的二進制替代,sm-updater –尚不清楚“ sm”是指什么。這可能是工廠使用的東西,因為二進制文件的其余部分都引用了“ sitemaster”。
4、ethdeploy –似乎是將軟件包部署到車輛內(nèi)其他設(shè)備的一種方法upackager –與網(wǎng)關(guān)有關(guān),采用release.tgz(用于ECU的更新)和internal.dat(車輛的配置)和vhcs(車輛配置字符串)的參數(shù)

不同規(guī)格的不同名字
根據(jù)二進制文件的開頭名稱,二進制文件的行為會有所不同。這包括其執(zhí)行的服務(wù),其使用的路徑和技術(shù)。該代碼引用了個性存儲超過330次的變量。
為了易于確定代碼是否基于個性而偏離,0對應(yīng)于IC,1對應(yīng)于CID,5對應(yīng)于SM。

用于不同個性的command / http端口
將更新程序作為“集群”運行,該系統(tǒng)旨在與多個設(shè)備(CID和IC)一起使用。通過VPN連接并下載固件,CID充當(dāng)主服務(wù)器。
在代碼中稱為“繼電器”,然后使用命令/ HTTP端口將固件分發(fā)到IC。更新程序在啟動時執(zhí)行某些任務(wù),例如檢查當(dāng)前系統(tǒng),將出站連接到固件服務(wù)器(稱為“握手”)以及啟動命令和Web服務(wù)器。

基于人格的條件流示例
盡管看到了許多錯誤,但是可以在QEMU仿真器中運行二進制文件。二進制程序按預(yù)期啟動了兩個偵聽服務(wù)。

在仿真器中運行IC更新器
二進制文件在初始化期間對其自身執(zhí)行sha512哈希。我們驚訝地發(fā)現(xiàn),盡管sha512輸出64個字節(jié),但僅保留了前8個字節(jié)。這意味著可以使用蠻力找到哈希沖突。

hash_self對二進制文件進行sha512哈希

截斷的sha512哈希輸出

一般sha512sum
稍后,當(dāng)向固件更新服務(wù)器發(fā)出請求時,此哈希將用作User-Agent字符串的一部分。

哈希被放入請求的用戶代理部分
攻擊者可以在運行替代惡意軟件的同時報告預(yù)期的sha512哈希,盡管這意味著服務(wù)器可以確定正在使用哪個版本的更新程序。
這不是針對惡意行為的有力保護。通過計時器或按需執(zhí)行,更新程序可以在緩沖區(qū)中處理一系列命令。可以通過cid-updater或打開的命令端口輸入它們,從而允許Tesla以太網(wǎng)上的其他設(shè)備執(zhí)行操作。
以下是任務(wù)“ fwheartbeat”的示例,該任務(wù)以1小時的間隔啟動,并調(diào)用了函數(shù)start_regular_timer:

在計時器上添加了fwhearbeat
通過調(diào)用函數(shù)do_after_e_ms,還可以在固定時間段后運行命令。這是重新啟動固件下載的示例:

經(jīng)過一段時間后,下載重新啟動正在運行
這些命令由字符串引用,可以采用許多值,并存儲在大型數(shù)組中。

命令數(shù)組
使用不同的參數(shù),命令“ install”和“ patch”都最終調(diào)用函數(shù)do_install。
像交互式命令處理器一樣,該過程的命令端口提供了使用技巧和其他幫助。

要求ic-updater通過HTTP提供文件的示例

通過HTTP下載提供的文件

通過命令端口報告的當(dāng)前狀態(tài)
需要會話令牌來保護IC和CID之間的命令。每天更改一次,并通過VPN從Tesla服務(wù)器進行同步。如果攻擊者可以嗅探IC和CID之間的連接,并使用它發(fā)送自己的命令,則攻擊者可以攔截此令牌。
我們能夠?qū)⒍M制文件放入開發(fā)模式。完成此操作后,包括簽名檢查在內(nèi)的大多數(shù)安全功能都被禁用。

開發(fā)模式導(dǎo)致簽名檢查被跳過
二進制文件包含大量功能。從最高層次來看,最重要的過程如下:
1、握手-將請求發(fā)送到包含車輛詳細信息的Tesla服務(wù)器并接收對車輛執(zhí)行操作的響應(yīng)的過程。
2、基于握手下載和解密各種固件更新文件將下載并解密的固件更新文件(稱為補丁(完整的固件更新)。
3、bsdiff40(二進制difs)或Redbend delta(專有二進制diff))安裝到脫機閃存分區(qū)中
4、中繼–將固件從CID復(fù)制到IC重新部署–將固件的離線狀態(tài)復(fù)制到在線狀態(tài)以進行恢復(fù)其他功能包含在二進制文件中,但未使用。
握手
類似于外殼腳本更新,有關(guān)車輛的數(shù)據(jù)使用VIN進行監(jiān)控,然后發(fā)送到遠程服務(wù)器,該服務(wù)器以任何可用的更新作為響應(yīng)。
通過功能do_handshake向固件服務(wù)器發(fā)出POST請求。要從文件連接,這需要固件服務(wù)器的配置(包括服務(wù)器名稱,端口和路徑)。

配置握手請求
POST請求中包含的數(shù)據(jù)比shell腳本版本復(fù)雜,包括以下內(nèi)容:
1、車輛VIN –從網(wǎng)關(guān)檢索和緩存,而不是從文件中讀取。在請求的路徑中發(fā)送。
2、VHCS(車輛硬件配置字符串)–基于從網(wǎng)關(guān)恢復(fù)的hwids.txt的字符串(使用函數(shù)fetch_vhcs生成)。作為POST參數(shù)發(fā)送。
3、當(dāng)前固件簽名–使用功能read_firmware_signatures讀取。從保存/ usr /分區(qū)的內(nèi)存分區(qū)的后40個字節(jié)中讀取固件簽名。發(fā)送base64編碼為POST參數(shù)。

POST請求的格式字符串
函數(shù)request_HTTP發(fā)出POST請求。它只能發(fā)出HTTP請求,而不能發(fā)出HTTPS請求。更新程序二進制文件根本沒有TLS功能,這意味著握手始終在純文本中進行,這取決于Tesla VPN的安全性。
函數(shù)tun0_is_up檢查VPN連接。僅檢查設(shè)備tun0是否存在,這似乎很幼稚。控制了CID的攻擊者可以在沒有知道更新程序二進制文件的情況下建立自己的VPN。
更新程序二進制文件本身似乎沒有建立VPN連接的任何功能。盡管無法確定是哪一個,但是必須通過外部過程來執(zhí)行。服務(wù)器對HTTP POST請求給出JSON響應(yīng)。通常,如果請求格式錯誤或不正確,則不會給出響應(yīng)。

典型的握手響應(yīng)
函數(shù)handle_handshake_download處理JSON響應(yīng)。
在握手響應(yīng)中,可能存在數(shù)十個字段。可以從JSON copy_handshake_var_at中提取各個字段,該字段采用字段名稱的參數(shù)。對該函數(shù)的72個引用中至少使用35個不同的字段名稱。

多次調(diào)用以查找JSON響應(yīng)中的字段
這表明特斯拉中固件更新機制的巨大復(fù)雜性。在測試車輛的同時,很少有這些領(lǐng)域被使用。
這是從函數(shù)do_install的握手響應(yīng)中讀取md5哈希的示例。

從響應(yīng)中讀取字段firmware_download_file_md5
然后調(diào)用handshake_is_actionable函數(shù)。如果正在下載升級,已經(jīng)在CID上升級,正在中繼到IC或正在安裝升級,則將阻止握手采取措施。

不進行握手的原因
如果可以進行握手,則調(diào)用函數(shù)
initialize_handshake_install。握手響應(yīng)存儲在文件中以供以后處理,并將命令添加到隊列中。
下載
握手響應(yīng)中可以包含三個不同的字段,以供下載文件:
1、Firmware_download_url –根據(jù)shell腳本方法的常規(guī)更新
2、Bsdiff40_download_url –使用開源解決方案的二進制差異
3、Rbdlt_download_url –專有的Redbend增量
使用HTTP,它們似乎都以類似的方式下載。這是一個示例網(wǎng)址:

我們注意到了這些URL的幾個有趣的特征:
1、響應(yīng)每個握手請求而生成,并且顯然是唯一的。
2、收到握手響應(yīng)后,有效期始終為兩周。
3、出現(xiàn)一個HMAC(哈希消息身份驗證代碼)以檢查其余請求的完整性。
4、可從公共Internet獲得從中下載它們的服務(wù)器-無需建立VPN連接。
由于到期和HMAC,我們無法猜測或暴力破解其他固件下載鏈接。
值得注意的是,由于使用公共Internet上的HTTP(未加密)進行下載,因此存在被攔截和篡改的風(fēng)險。字段
firmware_download_file_md5檢查下載的完整性。
通過安全的VPN下載哈希值時,將通過公共Internet下載文件。如果攻擊者篡改了下載,則MD5哈希可能不再匹配。Wi-Fi或蜂窩連接可用于執(zhí)行下載。
另一個字段wifi_wait_until將允許在有限的時間內(nèi)通過Wi-Fi下載。我們認為,這是為了避免通過蜂窩連接進行下載的成本,同時允許它們進行必要的更新。
在固件握手響應(yīng)中可以看到涉及加密的字段:

通過開放Internet下載固件的加密密鑰
Salsa20(一種輕量級算法)可用于加密下載的更新文件。函數(shù)decrypt_and_save_file實現(xiàn)解密。
握手響應(yīng)通過VPN發(fā)送整個256位密鑰,因此應(yīng)保持安全,以防止通過Internet進行的固件下載被攔截。
我們看到的所有下載文件都已加密。應(yīng)該可以發(fā)送未加密的文件,但是我們沒有看到任何證據(jù)。
安裝
可以更新系統(tǒng)的許多不同方面:
- /usr partition
- Kernel
- bootloader
/ usr分區(qū)更新涉及更新程序二進制文件中的大部分功能。為此,系統(tǒng)分為在線和離線usr分區(qū)。盡管它們被稱為usr,而不是已掛載的文件系統(tǒng),但它們在每一點都被視為原始存儲設(shè)備(例如/ dev / mmcblock0p1)。
“ usr”是指存儲設(shè)備的只讀方面。一般而言,似乎大多數(shù)固件更新都應(yīng)用于脫機分區(qū)。然后,可以將脫機分區(qū)中所做的更改復(fù)制回聯(lián)機分區(qū),或直接從脫機分區(qū)運行。為了從脫機分區(qū)執(zhí)行更改,會發(fā)生以下情況:
1、對脫機分區(qū)進行的更改(使用patch,bsdiff或Redbend)
2、檢查聯(lián)機和脫機分區(qū)的簽名,以確保正確應(yīng)用了補丁程序。
3、脫機分區(qū)安裝為/ newusr;然后可以執(zhí)行/ newusr / deploy /的內(nèi)容
發(fā)生以下情況,將更改從離線復(fù)制到在線:
1、對離線分區(qū)進行了更改(使用patch,bsdiff或Redbend)
2、檢查聯(lián)機和脫機分區(qū)的簽名,以確保正確應(yīng)用了補丁程序。
3、然后更新,然后“重新部署”固件,這涉及將引導(dǎo)加載程序,內(nèi)核和usr分區(qū)復(fù)制到在線分區(qū)。
將更改應(yīng)用于脫機分區(qū)意味著系統(tǒng)可以在固件更新時繼續(xù)運行。這似乎與恢復(fù)分區(qū)的概念背道而馳–首先將它們覆蓋。由于使用了多個校驗和簽名,因此汽車很難變磚了。
從傳遞的參數(shù)可以看出,更新程序二進制文件通過對上述示例更新程序進行系統(tǒng)調(diào)用來對內(nèi)核和引導(dǎo)加載程序進行更新。

選擇cid / ic / sm-udpate_sample

調(diào)用* -update_sample