315晚會報導的無人機是怎麼被劫持的?
0x00 背景
在2015年GeekPwn的開場專案中,筆者利用一系列漏洞成功演示劫持了一架正在飛行的大疆精靈3代無人機,奪取了這臺無人機的控制權,完成了可能是全球首次對大疆無人機的劫持和完整控制。GeekPwn結束後,組委會立即將漏洞通知給官方,而大疆也很快完成了漏洞的修復。今年的3月15號,大疆釋出了全新一代的精靈4代無人機,精靈3代從此退居二線;同時央視315晚會也對去年GeekPwn的這個劫持專案進行了詳細的報導。
考慮到這些漏洞的修復已經過了足夠長的時間,我們決定公開漏洞的完整細節和利用流程,希望能為國內的方興未艾的射頻安全研究圈子貢獻自己的一份力量。
本文爭取以零基礎的角度對整個發現和利用過程抽絲剝繭,並儘量詳細闡述這個過程中涉及的技術細節。本文涉及的技術細節適用大疆精靈3代,2代和1代,不適用最新的精靈4代無人機。由於行文時間倉促,如有疏漏敬請斧正。
0x01 攻擊場景討論:風險真實存在但可控
可能是因為近兩年無人機的曝光率頗高,去年GeekPwn上完成無人機劫持專案後感興趣的電視臺和媒體並不少,也引發了普通群眾的討論和擔心。
雖然我們已經證明並演示了精靈系列無人機是可以被劫持和完整控制的,但想要在實際環境中的直接將公園、景區、街道上空飛行的無人機據為己有,訊號增益和劫持後的穩定控制仍然是需要深入研究的問題。或許在官方遙控器上載入自己的萬能遙控器ROM,然後直接借用官方遙控器的訊號增益和控制系統,會是一個可行的方案。
此外,造成劫持的漏洞已經得到合理的修復,新版ROM釋出也已經超過4個月。隨著安全研究者的攻防研究以及官方的重視,實際能攻擊的精靈無人機也會越來越少。
所以,我們的結論是,普通群眾不用過於擔憂無人機的安全問題,反而應該更關注越來越多的走入普通人家的智慧裝置的安全問題。順便提一下,這塊我們團隊亦有關注(比如同樣是參加了GeekPwn 2015和央視315晚會的烤箱和POS機),後續還會有更多的研究成果放出。
好了,現在開始我們的無人機劫持之旅。
0x02 抽絲剝繭:精靈系列遙控原理全解析
0.射頻硬體初探
要黑掉無人機,第一步要做的是資訊收集。我們先來了解一下精靈3代所使用的射頻硬體。
圖1 拆開的精靈3代遙控器(左圖)和無人機主機(右圖)
左翻右翻,經過了一系列艱難的電焊拆解和吹風機刮除保護膜後,終於找到了負責射頻通訊的晶片和負責邏輯的主控晶片,並識別出了它們的型號。看得出來大疆對電路板刻意做了一些防拆解和資訊保護。
從下面的圖中能識別出來,主控晶片選擇的是知名大廠NXP的LPC1765系列,120MHz主頻,支援USB 2.0,和射頻晶片使用SPI介面進行通訊。而射頻晶片則是國產BEKEN的BK5811系列,工作頻率為5.725GHz – 5.852GHz或者5.135GHz – 5.262GHz,共有125個頻點,1MHz間隔,支援FSK/GFSK調製解調,使用ShockBurst封包格式,並且支援跳頻,使用經典的SPI介面進行控制。
圖2 主控晶片
圖3 射頻晶片
而這個引數強大的國產射頻晶片激起了我們的興趣,經過一些挖掘,發現這個晶片原來山寨自NORDIC的nRF24L01+,沒錯,就是這個號稱價效比之王的nRF24L01+ 2.4GHz射頻晶片的5.8GHz版本,更有意思的是這兩個不同廠家晶片的datasheet中絕大部分內容都是通用的。
透過這些基本的硬體資訊確定了射頻的頻段後,我們馬上拿出HackRF在gqrx中觀察5.8GHz的訊號。看著瀑布圖(下圖4)中跳來跳去的小黃線,我們意識到精靈3的射頻通訊應該是跳頻的,而在不知道跳頻序列的情況下,無法對射頻訊號進行完整解調。此時HackRF的射頻分析基本上派不上用處,唯有透過邏輯分析儀來看看射頻晶片是如何跳頻的。
圖4 使用gqrx觀察射頻訊號
1.不得已的控制邏輯追蹤
從上一節獲得的硬體資訊中,我們已經知道主控晶片和射頻晶片之間是採用SPI介面進行通訊和控制的,因此只要從BK5811的引腳中找到SPI需要的那四個引腳,連上邏輯分析儀,對這四個引腳的電位變化進行取樣分析,我們就能看到主控晶片是如何控制射頻晶片的跳頻了。
SPI介面定義
SPI協議本身其實挺簡單的,在CS訊號為低電位時,SCK透過脈衝控制通訊的時脈頻率,每個時鐘週期裡,SI為輸入,SO為輸出,透過SI和SO在每個時鐘裡高低電位的切換構成一個bit,每八個時鐘週期構成一個位元組,從而形成一個連續的位元組流,一個位元組流代表一個命令,由射頻晶片的datasheet約定好。SPI協議通訊示意圖如下所示,其中四個引腳分別為:
- SO(MISO):主裝置資料輸出,從裝置資料輸入。
- SI(MOSI):主裝置資料輸入,從裝置資料輸出。
- SCK(CLK):時鐘訊號,由主裝置產生。
- CS(CSN):從裝置使能訊號,由主裝置控制。
圖5 SPI協議通訊示意圖
連線邏輯分析儀
透過BK5811的datasheet,我們定位到了SPI通訊的那幾個引腳(如圖6),透過萬用表確認引腳連通性,然後在可以電焊的地方透過飛線連上邏輯分析儀的測試鉤,折騰了很久總算連上了(如圖7)。
圖6 BK5811中SPI引腳定義
圖7 透過電焊和飛線將BK5811的SPI引腳連上邏輯分析儀
隨後,從邏輯分析儀中,我們得到了作為安全人員來說最喜歡的二進位制資料流。
射頻晶片控制命令解析
在BK5811的datasheet中,明確定義了它所支援的每一條SPI命令。透過連續的電位變化傳過來一個完整的SPI命令如下所示:
圖8 邏輯分析儀中的一個SPI命令
其中0x30是命令號,高3位代表操作是寫BK5811的暫存器,而暫存器id由這個位元組中的低5位決定,是0x10,而0x10代表寫的內容是ShockBurst的傳送地址(類似乙太網的mac地址)。而後面五位元組(0x11 0x22 0x33 0x44 0x19)則是傳送地址本身。
跳頻邏輯總結
透過一段時間的觀察,我們發現SPI命令頗為簡單,為了方便觀察大量命令的序列,我們按照datasheet中的定義寫了一個解析指令碼,在指令碼的幫助下終於整理清楚了跳頻的流程。
圖9 SPI命令解析指令碼
在大疆的定義下,完整的跳頻序列有16個頻點,這些頻點在遙控器和無人機主機配對(一般發生在出廠前)時透過隨機產生,一旦確定後就儲存固定起來,除非手動重新配對。
遙控器開啟後,會以7ms的週期,按照跳頻序列指定的順序來變化射頻發射的頻率,16次(112ms)一個迴圈,而在每一個週期內,發射一次遙控的控制資料。一個典型的SPI命令序列如:<跳頻> 1ms <發包> 6ms
圖10 遙控器SPI命令數字邏輯示意圖
對於無人機主機,則是以1ms的週期來變化接收訊號的頻率,一旦收到來自遙控器的射頻訊號(BK5811會使用上文所說的傳送和接收地址來識別透過),則轉而進入7ms的週期,和遙控器保持同步。一旦訊號丟失,馬上又恢復1ms的跳頻週期。一個典型的SPI命令序列如:<跳頻> <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包>
。
圖11 無人機主機SPI命令數字邏輯示意圖
從上面的分析我們能注意到,遙控器只負責傳送資料,無人機主機只負責接收資料,兩者之間並無射頻上的互動。這為我們後面覆蓋遙控器的訊號打好了基礎。
2.模擬訊號到數字訊號的鴻溝
在搞清楚遙控的工作流程後,我們知道是可以對其進行完全的模擬(先假設射頻序列已知),創造出一個以假亂真的遙控來。但在加工二進位制命令前,如何完成二進位制命令中數字化的資料和真實世界中連續的電磁波之間的轉換困擾了我們很久,筆者甚至很長一段時間都在想重回大學修滿通訊專業的科目。
電磁波和GFSK制式的基本原理
先補一點從學通訊的同事那裡偷師回來的基本常識。
電磁波在我們的世界中連續的傳播,透過特定的方式可以使其攜帶二進位制資訊,這個方式稱為調製解調。傳送資料時,一般是將的調製好的基帶訊號(含二進位制資訊)和載波訊號疊加後進行傳送,通常基帶訊號的頻率會比載波訊號頻率低很多,如BK5811的載波訊號頻率在5.8GHz左右,但基帶訊號的頻率僅為2MHz。而接收方透過解調和濾波,將基帶訊號從接收到的載波訊號中分離出來,隨後進行取樣和A/D轉換得到二進位制資料。
FSK(Frequency-shift keying)是一種經典的基於頻率的調製解調方式,其傳遞資料的方式也很簡單。例如約定500KHz代表0,而1000KHz代表1,並且以1ms作為取樣週期,如果某1ms內基帶訊號的頻率是500KHz,這表明這是一個0,而如果下1ms內基帶訊號的頻率為1000KHz,那表明下一位二進位制位元是1。簡單來說,FSK制式就是透過這樣連續的電磁波來連續的傳遞二進位制資料。
圖12 FSK調製解調示意圖
而GFSK制式僅僅是在FSK制式的基礎上,在調製之前透過一個高斯低通濾波器來限制訊號的頻譜寬度,以此來提升訊號的傳播效能。
GFSK解調和IQ解調
在理解了GFSK制式的原理後,接下來我們嘗試在HackRF的上寫出GFSK解調指令碼,從一段遙控實際發出的電磁波中提取二進位制資料(如下圖13)。需要注意的是HackRF收發的射頻資料另外採用了IQ調製解調,程式碼上也需要簡單處理一下。
圖13 在空中傳播的GFSK電磁波(IQ制式)
由於沒有找到現成的解調程式碼,只好在MATLAB上(如下圖14)摸爬滾打了許久,並惡補了許多通訊基礎知識,折騰出(如下圖15)GFSK解調指令碼,併成功模擬遙控器的跳頻邏輯,能夠像無人機那樣獲取每一次跳頻的資料。至此, 我們再次得到了作為安全人員來說最喜歡的二進位制資料流。
圖14 MATLAB中模擬GFSK解調
圖15 GFSK解調指令碼工作圖
遙控控制資料總結
經過分析,一條典型的遙控控制資料如下(圖16)所示(最新版本韌體和稍舊版本的韌體協議,格式略有不同):
圖16 兩種型別的遙控控制資料
最開始的5個位元組為傳送方的ShockBurst地址,用於給無人機驗證是不是配對的遙控器。
接下來的26位元組為遙控資料本身(上下,左右,油門,剎車等遙控器上的一切操作),我們詳細來講解下。
遙控器上的控制桿的一個方向(如上+下,左+右)由12bit來表示。如表示左右方向及力度的數值power_lr
由上資料的第5個位元組和第6個位元組的低4位決定,控制桿居中時power_lr
為0x400(1024),控制桿拉至最左時power_lr
為0x16C(364),而拉至最右時power_lr
為0x694(1684)。也就是說,遙控器可以將控制桿左和右,力度可分為660級,並在控制資料中佔用12bit傳輸給無人機主機,主機針對不同的力度執行不同的飛行行為。
圖17 遙控控制資料解析程式碼片段
其他遙控控制桿的資料也非常類似,故不再贅述。值得注意的是,所有26位元組的遙控控制資料是一次性的發給無人機的,故上下,左右,前進後退,油門剎車等所有行為都是並行無干擾的。這也是無人機遙控效能指標中經常說的支援6路訊號,12路訊號的含義。
控制資料中最後的1個位元組位CRC8校驗位(舊版是CRC16),是前面的31位元組的CRC8/CRC16校驗結果,校驗錯誤的資料將被拋棄。
3.遙控器和無人機通訊邏輯總結
透過以上漫長的分析過程,我們總算完全搞懂了在遙控器上撥動控制桿的行為,是如何一步步反饋到無人機的飛控程式來完成對應的飛行行為。簡單整理下:
- 遙控器和無人機開機後,遙控器負責傳送資料,無人機負責接收資料。它們透過共同的跳頻序列的高速跳頻來保持一個資料鏈路,鏈路故障有一定能力能迅速恢復。
- 無人機每7ms就會收到一次遙控器發出的32位元組控制資料,控制資料只有一條命令一種格式,所有控制桿和開關的狀態會一次性傳送到無人機。無人機收到資料後會進行地址校驗和CRC校驗,確保資料是正確無誤的。
- 使用者在操縱遙控器的過程中,操控的行為和力度都會在7ms內透過那32位元組控制資料反饋至無人機,接著由無人機的飛控程式來完成對應的飛行行為。
0x03 各個擊破:完全控制無人機
從遙控器的通訊邏輯來看,想要透過HackRF這類SDR裝置覆蓋遙控器發出的射頻資料來劫持無人機。必須解決以下幾個問題:
- 雖然透過HackRF來收發GFSK資料已經沒有問題,但不知道跳頻序列根本無法和無人機保持同步。
- 如何打斷遙控器原本和無人機之間的穩定射頻鏈路,並同時建立和無人機之間新的穩定鏈路。
- 大疆遙控器的射頻功率做了大量最佳化,有效控制距離達一公里,HackRF的射頻頻率難以企及。
下面我們來看看如何逐個擊破這幾個問題。
0.偽造遙控器:通道的資訊洩漏漏洞
在透過指令碼對遙控器訊號進行GFSK解調時,我們發現了BK5811晶片一個奇怪的現象:晶片在某個頻道傳送資料時,會同時向臨近的特定頻道傳送同樣內容資料內容。舉個例子來說,同在+7ms這一時刻,除了會向13號頻道傳送屬於這個頻道的資料外,還會向其他一些特定的頻道傳送原本屬於13號頻道的資料。
#!bash
+ 7ms: Channel 13,
+ 7ms: Channel 09,
+ 7ms: Channel 21,
這個奇怪的現象雖然不會影響射頻的功能,只是多了一些冗餘資料,但卻成了我們得到遙控器跳頻序列的突破點,實實在在的構成了一個資訊洩露漏洞。
我們可以透過指令碼,從5725MHz到5850MHz進行遍歷,每次隔1MHz,剛好覆蓋BK5811的每一個頻道。遍歷監聽時,考慮單個頻點的情況,我們能得到冗餘資料(假設監聽61號頻道)如下:
#!bash
+ 0ms: Channel 61,
+ 7ms: Channel 13,
+ 21ms: Channel 09,
+ 112ms: Channel 61,
因為我們已經明確112ms是一次跳頻序列的迴圈,那麼從冗餘資料中我們可以推論:
#!bash
ch61 + 1 Step(7ms) = ch13
ch13 + 3 Step(21ms) = ch09
ch09 + 12 Step(84ms) = ch61
換成文字結論即是:如果61號頻道是跳頻序列的第1個,那麼13號頻道是第2個,9號頻道是第4個,一個一個頻道的去遍歷,就可以把這個序列補充完整。實際遍歷時我們發現,HackRF指令碼僅需要30到120秒,不需要遍歷全部127個頻道,即可推論和補齊完整的16個頻點及跳頻序列(如下圖所示)。
圖18 HackRF指令碼遍歷後得到完整的跳頻序列
透過這個特殊的資訊洩露漏洞,配合遙控器的調頻規律可快速得到跳頻序列,但我們也不清楚為什麼BK5811晶片會存在這樣的資訊洩露漏洞。隨後我們拿nRF24L01+也做了類似的測試,發現nRF24L01+也同樣會產生同樣的問題。
1.劫持無人機:訊號覆蓋漏洞
下面來看看訊號覆蓋的問題如何解決。有個關鍵的前提是遙控器只發資料,無人機只收資料,它們之間沒有互動。
在之前進行邏輯分析的時候我們發現,不管無人機是1ms跳頻一次還是7ms跳頻一次,它實際上只會接收跳頻完畢後最早發給它的合法資料包。正常情況下可能是跳頻完畢後的第5ms時,收到了遙控器發過來的資料,再下一次跳頻後的5ms時,再收到遙控器發過來的下一次資料。
那如果我們能一直早於遙控器發出資料,無人機豈不是就直接使用我們的資料了?確實是這樣的。假設我們的控制指令碼中設定為6ms跳頻,我們很快能奪取無人機的控制權(7次跳頻內)。但遙控器也會奪回控制權,最終就會出現無人機有1/7的資料來自遙控,6/7的來自駭客的局面。
這其實是一場訊號爭奪戰,那麼有沒有辦法讓無人機更穩定的更穩定接收我們的訊號呢?如果我們把跳頻時間設定為 6.9ms,跳頻後每隔0.4ms(Arduino UNO R3的速度極限)傳送一次遙控控制資料的話,雖然奪取無人機控制權需要更長的時間(約10s),但一旦獲得控制權,在0.4ms傳送一次資料的高重新整理率覆蓋之下,遙控器基本沒可能奪回控制權。
圖19 偽造遙控器的SPI命令數字邏輯
至此,劫持無人機的基本技術問題已經透過一個資訊洩漏漏洞和一個訊號覆蓋漏洞解決了。
2.穩定性 & 可用性最佳化
在實現控制指令碼的過程中,HackRF存在的兩個嚴重限制:一方面HackRF使用USB通訊介面決定了它的通訊延遲巨大(指令延遲約為30ms),上文中動輒0.4ms的控制精度HackRF做不到;另外一方面,HackRF在5.8GHz頻段的訊號衰減嚴重(訊號強度僅為遙控器的1%,可能是通用天線在高頻段增益偏低),估計只有在貼著無人機射頻晶片的情況下才有作用。天線問題故無法使用HackRF劫持無人機。
靈機一動,我們想到了和遙控器類似的做法:透過Arduino UNO R3微控制器平臺來操作BK5811晶片,直接在Arduino上實現我們的控制邏輯。當然,再加一個某寶上淘的有源訊號放大器,如下圖所示。根據測試,有效控制範圍為10米左右。
圖20 無人機劫持模組全家福
最終,透過了漫長的分析和各種漏洞利用方法的嘗試後,我們完成了對大疆無人機的劫持。透過HackRF遍歷和監聽,然後將序列輸入到Arduino中,在Arduino中完成對無人機訊號的劫持,最後來透過Arduino上連線的簡易開關來控制無人機。控制效果可以參看這個央視315中的影片片段。
0x04 後記:攻是單點突破,防是系統工程
從漏洞分析和利用的過程來看,大疆在設計無人機和射頻協議時確實考慮了安全性的問題,其中跳頻機制雖然很大程度上提升了協議的破解難度,但卻被過度的依賴。筆者和團隊長期從事騰訊產品的漏洞研究工作,深知如所有其他漏洞攻防場景一樣,分散而孤立的防禦機制跟本無法抵禦駭客的突破或繞過,指望一個完美的系統來抵禦駭客,如同指望馬奇諾防線來抵禦德國軍隊的入侵一樣不現實。而更現實情況是攻和守的不對稱,攻擊者利用單點的突破,逐層的推進,往往會領先防禦者一大截。
防禦者就無計可施了嗎?當然不是。聰明的防禦者一定懂得兩個系統性的思路:未知攻焉知防和借力。一方面防守者必須是優秀的攻擊者,才有可能嗅得到真正攻擊者的蛛絲馬跡,才有可能在關鍵節點上部署符合實際情況;另外一方面防守者必須藉助自己是在企業內部這一優勢和業務並肩作戰,利用業務的資源和資料這些攻擊者拿不到的資源,配合對攻擊的理解,建立對攻擊者來說不對稱的防禦系統。
另外一個層面,智慧硬體行業各個廠商對安全的重視令人堪憂。作為無人機行業絕對第一的大疆,尚且存在嚴重的安全問題,更不要說其他公司——筆者和TSRC物聯網安全研究團隊近兩年業餘時間對智慧硬體安全的研究也印證了這個結論。二進位制漏洞的複雜性和門檻決定了這種漏洞型別很少有機會出現在公眾的視野中,但在更隱晦的地下,二進位制漏洞攻擊者的力量正在以防禦者無法企及的速度悄然成長。也許等到阿西莫夫筆下《機械公敵》中的機器人社會形態形成時,我們要面對的不是人工智慧的進化和變異,而是漏洞攻擊者這種新時代的恐怖分子。
最後,感謝我有一把刷子、zhuliang、泉哥、lake2在整個破解過程中的支援。
0x05 相關連結
- http://v.qq.com/iframe/player.html?vid=m0019do4elt&width=670&height=502.5&auto=0
- http://2015.geekpwn.org/
- http://www.dji.com/cn/newsroom/news/dji-statement-15mar
- http://www.bekencorp.com/Botong.Asp?Parent_id=2&Class_id=8&Id=14
- https://github.com/mossmann/hackrf
- https://www.arduino.cc/en/Main/ArduinoBoardUno
- https://github.com/JiaoXianjun/BTLE
- http://blog.kismetwireless.net/2013/08/playing-with-hackrf-keyfobs.html
相關文章
- 2018年315晚會預測:今年315晚會將曝光哪些行業和企業名單2022-03-20行業
- 315晚會網路安全案例大盤點2022-03-16
- 原來那個騷擾電話是AI打的!315晚會曝光的這“鍋”AI背不背?2019-03-16AI
- 如何防止域名被劫持?網站域名被劫持怎麼辦?怎麼處理?2021-01-03網站
- 聚焦“315” | 一文總結“3.15晚會”網路安全大事件2022-03-17事件
- 寫程式碼的妹紙會是怎麼樣的?2014-04-17
- 315晚會曝光通訊安全隱患 阿里雲將推HTTPS加密服務2016-03-17阿里HTTP加密
- 什麼是物件?什麼是抽象?怎麼理解物件導向的程式設計思想?2018-09-09物件抽象程式設計
- 無人機操作怎麼選? 美國手好還是日本手好?2017-01-14無人機
- 趣頭條公佈3.15 晚會報導的整改舉措 成立廣告生態治理專項工作組2020-07-17
- SSL證書出錯是怎麼回事?是由哪些原因導致的?2022-12-05
- 怎麼檢視域名是否被劫持沒有、如何判斷網站域名是否被劫持?2020-12-02網站
- 室內地圖導航是怎麼實現的?室內導航好做嗎?2023-02-08地圖
- 什麼是物件,為什麼要物件導向,怎麼才能物件導向?2015-04-22物件
- 你的網路被DNS劫持了嗎?dns 被劫持怎麼解決2020-12-22DNS
- 傳正待上市的Snap在開發無人機,它會不會是另一個GoPro?2018-03-13無人機Go
- seam 後臺報FullTextSessionProxy的錯誤是怎麼回事呢?2009-06-17Session
- 無人機送貨,人們會買單麼?2018-03-06無人機
- ssl/tls是什麼?是怎麼工作的?2018-12-14TLS
- 停車場室內導航怎麼用,停車場尋車是怎麼實現的2023-04-11
- 十年後的汽車什麼樣? 外觀奇特用無人機導航2017-01-14無人機
- 怎麼把http升級為https 解決網站被劫持的問題2020-11-23HTTP網站
- [軟體人生]如果你的領導比你能力差,你會怎麼辦?2011-03-31
- 中間表是什麼?和報表有什麼關係?會帶來怎樣的問題?又如何解決?2020-07-21
- mysql order by是怎麼工作的?2019-05-20MySql
- Mybatis是怎麼工作的(二)2019-01-19MyBatis
- JavaScript是怎麼誕生的2018-05-16JavaScript
- 你是怎麼入坑的?2017-12-13
- 程式是怎麼執行的2015-04-03
- 無人機送披薩?那小費怎麼給2016-11-17無人機
- 什麼是視覺化地圖報導美國大選的正確姿態2016-11-10視覺化地圖
- 國科雲:什麼是DHCP?DHCP是怎麼工作的?2023-09-26
- 無人機和鐳射雷達,會是一對好cp嗎?2018-11-21無人機
- 10年後的計算機會是怎樣的?2018-11-15計算機
- QUIC 將會是 WebRTC 的未來麼?2018-12-05UIWeb
- 思維導圖教程是什麼?該怎樣繪製思維導圖?2020-03-10
- 大家是怎麼程式設計的2020-06-18程式設計
- 微信直播是怎麼實現的?2020-02-28