0x00 背景
在2015年GeekPwn的開場項目中,筆者利用一系列漏洞成功演示劫持了一架正在飛行的大疆精靈3代無人機,奪取了這臺無人機的控制權,完成了可能是全球首次對大疆無人機的劫持和完整控制。GeekPwn結束后,組委會立即將漏洞通知給官方,而大疆也很快完成了漏洞的修復。今年的3月15號,大疆發(fā)布了全新一代的精靈4代無人機,精靈3代從此退居二線;同時央視315晚會也對去年GeekPwn的這個劫持項目進行了詳細的報道。
考慮到這些漏洞的修復已經過了足夠長的時間,我們決定公開漏洞的完整細節(jié)和利用流程,希望能為國內的方興未艾的射頻安全研究圈子貢獻自己的一份力量。
本文爭取以零基礎的角度對整個發(fā)現(xiàn)和利用過程抽絲剝繭,并盡量詳細闡述這個過程中涉及的技術細節(jié)。本文涉及的技術細節(jié)適用大疆精靈3代,2代和1代,不適用最新的精靈4代無人機。由于行文時間倉促,如有疏漏敬請斧正。
0x01 攻擊場景討論:風險真實存在但可控
可能是因為近兩年無人機的曝光率頗高,去年GeekPwn上完成無人機劫持項目后感興趣的電視臺和媒體并不少,也引發(fā)了普通群眾的討論和擔心。
雖然我們已經證明并演示了精靈系列無人機是可以被劫持和完整控制的,但想要在實際環(huán)境中的直接將公園、景區(qū)、街道上空飛行的無人機據為己有,信號增益和劫持后的穩(wěn)定控制仍然是需要深入研究的問題?;蛟S在官方遙控器上加載自己的萬能遙控器ROM,然后直接借用官方遙控器的信號增益和控制系統(tǒng),會是一個可行的方案。
此外,造成劫持的漏洞已經得到合理的修復,新版ROM發(fā)布也已經超過4個月。隨著安全研究者的攻防研究以及官方的重視,實際能攻擊的精靈無人機也會越來越少。
所以,我們的結論是,普通群眾不用過于擔憂無人機的安全問題,反而應該更關注越來越多的走入普通人家的智能設備的安全問題。順便提一下,這塊我們團隊亦有關注(比如同樣是參加了GeekPwn 2015和央視315晚會的烤箱和POS機),后續(xù)還會有更多的研究成果放出。
好了,現(xiàn)在開始我們的無人機劫持之旅。
0x02 抽絲剝繭:精靈系列遙控原理全解析
0x0200 射頻硬件初探
要黑掉無人機,第一步要做的是信息收集。我們先來了解一下精靈3代所使用的射頻硬件。
圖1 拆開的精靈3代遙控器(左圖)和無人機主機(右圖)
左翻右翻,經過了一系列艱難的電焊拆解和吹風機刮除保護膜后,終于找到了負責射頻通信的芯片和負責邏輯的主控芯片,并識別出了它們的型號??吹贸鰜泶蠼畬﹄娐钒蹇桃庾隽艘恍┓啦鸾夂托畔⒈Wo。
從下面的圖中能識別出來,主控芯片選擇的是知名大廠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 射頻芯片
而這個參數(shù)強大的國產射頻芯片激起了我們的興趣,經過一些挖掘,發(fā)現(xiàn)這個芯片原來山寨自NORDIC的nRF24L01+,沒錯,就是這個號稱性價比之王的nRF24L01+ 2.4GHz射頻芯片的5.8GHz版本,更有意思的是這兩個不同廠家芯片的datasheet中絕大部分內容都是通用的。
通過這些基本的硬件信息確定了射頻的頻段后,我們馬上拿出HackRF在gqrx中觀察5.8GHz的信號??粗俨紙D(下圖4)中跳來跳去的小黃線,我們意識到精靈3的射頻通訊應該是跳頻的,而在不知道跳頻序列的情況下,無法對射頻信號進行完整解調。此時HackRF的射頻分析基本上派不上用處,唯有通過邏輯分析儀來看看射頻芯片是如何跳頻的。
圖4 使用gqrx觀察射頻信號
0x0201 不得已的控制邏輯追蹤
從上一節(jié)獲得的硬件信息中,我們已經知道主控芯片和射頻芯片之間是采用SPI接口進行通訊和控制的,因此只要從BK5811的引腳中找到SPI需要的那四個引腳,連上邏輯分析儀,對這四個引腳的電位變化進行采樣分析,我們就能看到主控芯片是如何控制射頻芯片的跳頻了。
0x020100 SPI接口定義
SPI協(xié)議本身其實挺簡單的,在CS信號為低電位時,SCK通過脈沖控制通訊的時鐘頻率,每個時鐘周期里,SI為輸入,SO為輸出,通過SI和SO在每個時鐘里高低電位的切換構成一個bit,每八個時鐘周期構成一個字節(jié),從而形成一個連續(xù)的字節(jié)流,一個字節(jié)流代表一個命令,由射頻芯片的datasheet約定好。SPI協(xié)議通訊示意圖如下所示,其中四個引腳分別為:
SO(MISO):主設備數(shù)據輸出,從設備數(shù)據輸入。
SI(MOSI):主設備數(shù)據輸入,從設備數(shù)據輸出。
SCK(CLK):時鐘信號,由主設備產生。
CS(CSN):從設備使能信號,由主設備控制。
圖5 SPI協(xié)議通訊示意圖
0x020101 連接邏輯分析儀
通過BK5811的datasheet,我們定位到了SPI通信的那幾個引腳(如圖6),通過萬用表確認引腳連通性,然后在可以電焊的地方通過飛線連上邏輯分析儀的測試鉤,折騰了很久總算連上了(如圖7)。
圖6 BK5811中SPI引腳定義
圖7 通過電焊和飛線將BK5811的SPI引腳連上邏輯分析儀
隨后,從邏輯分析儀中,我們得到了作為安全人員來說最喜歡的二進制數(shù)據流。
0x020102 射頻芯片控制命令解析
在BK5811的datasheet中,明確定義了它所支持的每一條SPI命令。通過連續(xù)的電位變化傳過來一個完整的SPI命令如下所示:
圖8 邏輯分析儀中的一個SPI命令
其中0x30是命令號,高3位代表操作是寫B(tài)K5811的寄存器,而寄存器id由這個字節(jié)中的低5位決定,是0x10,而0x10代表寫的內容是ShockBurst的發(fā)送地址(類似以太網的mac地址)。而后面五字節(jié)(0x11 0x22 0x33 0x44 0x19)則是發(fā)送地址本身。
0x020103 跳頻邏輯總結
通過一段時間的觀察,我們發(fā)現(xiàn)SPI命令頗為簡單,為了方便觀察大量命令的序列,我們按照datasheet中的定義寫了一個解析腳本,在腳本的幫助下終于整理清楚了跳頻的流程。
圖9 SPI命令解析腳本
在大疆的定義下,完整的跳頻序列有16個頻點,這些頻點在遙控器和無人機主機配對(一般發(fā)生在出廠前)時通過隨機產生,一旦確定后就存儲固定起來,除非手動重新配對。
遙控器打開后,會以7ms的周期,按照跳頻序列指定的順序來變化射頻發(fā)射的頻率,16次(112ms)一個循環(huán),而在每一個周期內,發(fā)射一次遙控的控制數(shù)據。一個典型的SPI命令序列如:<跳頻> 1ms <發(fā)包> 6ms
圖10 遙控器SPI命令數(shù)字邏輯示意圖
對于無人機主機,則是以1ms的周期來變化接收信號的頻率,一旦收到來自遙控器的射頻信號(BK5811會使用上文所說的發(fā)送和接收地址來識別通過),則轉而進入7ms的周期,和遙控器保持同步。一旦信號丟失,馬上又恢復1ms的跳頻周期。一個典型的SPI命令序列如:<跳頻> <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包>。
圖11 無人機主機SPI命令數(shù)字邏輯示意圖
從上面的分析我們能注意到,遙控器只負責發(fā)送數(shù)據,無人機主機只負責接收數(shù)據,兩者之間并無射頻上的交互。這為我們后面覆蓋遙控器的信號打好了基礎。
0x0202 模擬信號到數(shù)字信號的鴻溝
在搞清楚遙控的工作流程后,我們知道是可以對其進行完全的模擬(先假設射頻序列已知),創(chuàng)造出一個以假亂真的遙控來。但在加工二進制命令前,如何完成二進制命令中數(shù)字化的數(shù)據和真實世界中連續(xù)的電磁波之間的轉換困擾了我們很久,筆者甚至很長一段時間都在想重回大學修滿通信專業(yè)的科目。
0x020200 電磁波和GFSK制式的基本原理
先補一點從學通信的同事那里偷師回來的基本常識。
電磁波在我們的世界中連續(xù)的傳播,通過特定的方式可以使其攜帶二進制信息,這個方式稱為調制解調。發(fā)送數(shù)據時,一般是將的調制好的基帶信號(含二進制信息)和載波信號疊加后進行發(fā)送,通?;鶐盘柕念l率會比載波信號頻率低很多,如BK5811的載波信號頻率在5.8GHz左右,但基帶信號的頻率僅為2MHz。而接收方通過解調和濾波,將基帶信號從接收到的載波信號中分離出來,隨后進行采樣和A/D轉換得到二進制數(shù)據。
FSK(Frequency-shift keying)是一種經典的基于頻率的調制解調方式,其傳遞數(shù)據的方式也很簡單。例如約定500KHz代表0,而1000KHz代表1,并且以1ms作為采樣周期,如果某1ms內基帶信號的頻率是500KHz,這表明這是一個0,而如果下1ms內基帶信號的頻率為1000KHz,那表明下一位二進制比特是1。簡單來說,F(xiàn)SK制式就是通過這樣連續(xù)的電磁波來連續(xù)的傳遞二進制數(shù)據。
圖12 FSK調制解調示意圖
而GFSK制式僅僅是在FSK制式的基礎上,在調制之前通過一個高斯低通濾波器來限制信號的頻譜寬度,以此來提升信號的傳播性能。
0x020201 GFSK解調和IQ解調
在理解了GFSK制式的原理后,接下來我們嘗試在HackRF的上寫出GFSK解調腳本,從一段遙控實際發(fā)出的電磁波中提取二進制數(shù)據(如下圖13)。需要注意的是HackRF收發(fā)的射頻數(shù)據另外采用了IQ調制解調,代碼上也需要簡單處理一下。
圖13 在空中傳播的GFSK電磁波(IQ制式)
由于沒有找到現(xiàn)成的解調代碼,只好在MATLAB上(如下圖14)摸爬滾打了許久,并惡補了許多通信基礎知識,折騰出(如下圖15)GFSK解調腳本,并成功模擬遙控器的跳頻邏輯,能夠像無人機那樣獲取每一次跳頻的數(shù)據。至此, 我們再次得到了作為安全人員來說最喜歡的二進制數(shù)據流。
圖14 MATLAB中模擬GFSK解調
圖15 GFSK解調腳本工作圖
0x020202 遙控控制數(shù)據總結
經過分析,一條典型的遙控控制數(shù)據如下(圖16)所示(最新版本固件和稍舊版本的固件協(xié)議,格式略有不同):
圖16 兩種類型的遙控控制數(shù)據
最開始的5個字節(jié)為發(fā)送方的ShockBurst地址,用于給無人機驗證是不是配對的遙控器。
接下來的26字節(jié)為遙控數(shù)據本身(上下,左右,油門,剎車等遙控器上的一切操作),我們詳細來講解下。
遙控器上的控制桿的一個方向(如上+下,左+右)由12bit來表示。如表示左右方向及力度的數(shù)值power_lr由上數(shù)據的第5個字節(jié)和第6個字節(jié)的低4位決定,控制桿居中時power_lr為0x400(1024),控制桿拉至最左時power_lr為0x16C(364),而拉至最右時power_lr為0x694(1684)。也就是說,遙控器可以將控制桿左和右,力度可分為660級,并在控制數(shù)據中占用12bit傳輸給無人機主機,主機針對不同的力度執(zhí)行不同的飛行行為。
圖17 遙控控制數(shù)據解析代碼片段
其他遙控控制桿的數(shù)據也非常類似,故不再贅述。值得注意的是,所有26字節(jié)的遙控控制數(shù)據是一次性的發(fā)給無人機的,故上下,左右,前進后退,油門剎車等所有行為都是并行無干擾的。這也是無人機遙控性能指標中經常說的支持6路信號,12路信號的含義。
控制數(shù)據中最后的1個字節(jié)位CRC8校驗位(舊版是CRC16),是前面的31字節(jié)的CRC8/CRC16校驗結果,校驗錯誤的數(shù)據將被拋棄。
0x0203 遙控器和無人機通訊邏輯總結
通過以上漫長的分析過程,我們總算完全搞懂了在遙控器上撥動控制桿的行為,是如何一步步反饋到無人機的飛控程序來完成對應的飛行行為。簡單整理下:
a) 遙控器和無人機開機后,遙控器負責發(fā)送數(shù)據,無人機負責接收數(shù)據。它們通過共同的跳頻序列的高速跳頻來保持一個數(shù)據鏈路,鏈路故障有一定能力能迅速恢復。
b) 無人機每7ms就會收到一次遙控器發(fā)出的32字節(jié)控制數(shù)據,控制數(shù)據只有一條命令一種格式,所有控制桿和開關的狀態(tài)會一次性發(fā)送到無人機。無人機收到數(shù)據后會進行地址校驗和CRC校驗,確保數(shù)據是正確無誤的。
c) 用戶在操縱遙控器的過程中,操控的行為和力度都會在7ms內通過那32字節(jié)控制數(shù)據反饋至無人機,接著由無人機的飛控程序來完成對應的飛行行為。
0x03 各個擊破:完全控制無人機
從遙控器的通訊邏輯來看,想要通過HackRF這類SDR設備覆蓋遙控器發(fā)出的射頻數(shù)據來劫持無人機。必須解決以下幾個問題:
a) 雖然通過HackRF來收發(fā)GFSK數(shù)據已經沒有問題,但不知道跳頻序列根本無法和無人機保持同步。
b) 如何打斷遙控器原本和無人機之間的穩(wěn)定射頻鏈路,并同時建立和無人機之間新的穩(wěn)定鏈路。
c) 大疆遙控器的射頻功率做了大量優(yōu)化,有效控制距離達一公里,HackRF的射頻頻率難以企及。
下面我們來看看如何逐個擊破這幾個問題。
0x0300 偽造遙控器:信道的信息泄漏漏洞
在通過腳本對遙控器信號進行GFSK解調時,我們發(fā)現(xiàn)了BK5811芯片一個奇怪的現(xiàn)象:芯片在某個頻道發(fā)送數(shù)據時,會同時向臨近的特定頻道發(fā)送同樣內容數(shù)據內容。舉個例子來說,同在+7ms這一時刻,除了會向13號頻道發(fā)送屬于這個頻道的數(shù)據外,還會向其他一些特定的頻道發(fā)送原本屬于13號頻道的數(shù)據。
+ 7ms: Channel 13,
+ 7ms: Channel 09,
+ 7ms: Channel 21,
這個奇怪的現(xiàn)象雖然不會影響射頻的功能,只是多了一些冗余數(shù)據,但卻成了我們得到遙控器跳頻序列的突破點,實實在在的構成了一個信息泄露漏洞。
我們可以通過腳本,從5725MHz到5850MHz進行遍歷,每次隔1MHz,剛好覆蓋BK5811的每一個頻道。遍歷監(jiān)聽時,考慮單個頻點的情況,我們能得到冗余數(shù)據(假設監(jiān)聽61號頻道)如下:
+ 0ms: Channel 61,
+ 7ms: Channel 13,
+ 21ms: Channel 09,
+ 112ms: Channel 61,
因為我們已經明確112ms是一次跳頻序列的循環(huán),那么從冗余數(shù)據中我們可以推論:
ch61 + 1 Step(7ms) = ch13
ch13 + 3 Step(21ms) = ch09
ch09 + 12 Step(84ms) = ch61
換成文字結論即是:如果61號頻道是跳頻序列的第1個,那么13號頻道是第2個,9號頻道是第4個,一個一個頻道的去遍歷,就可以把這個序列補充完整。實際遍歷時我們發(fā)現(xiàn),HackRF腳本僅需要30到120秒,不需要遍歷全部127個頻道,即可推論和補齊完整的16個頻點及跳頻序列(如下圖所示)。
圖18 HackRF腳本遍歷后得到完整的跳頻序列
通過這個特殊的信息泄露漏洞,配合遙控器的調頻規(guī)律可快速得到跳頻序列,但我們也不清楚為什么BK5811芯片會存在這樣的信息泄露漏洞。隨后我們拿nRF24L01+也做了類似的測試,發(fā)現(xiàn)nRF24L01+也同樣會產生同樣的問題。
0x0301 劫持無人機:信號覆蓋漏洞
下面來看看信號覆蓋的問題如何解決。有個關鍵的前提是遙控器只發(fā)數(shù)據,無人機只收數(shù)據,它們之間沒有交互。
在之前進行邏輯分析的時候我們發(fā)現(xiàn),不管無人機是1ms跳頻一次還是7ms跳頻一次,它實際上只會接收跳頻完畢后最早發(fā)給它的合法數(shù)據包。正常情況下可能是跳頻完畢后的第5ms時,收到了遙控器發(fā)過來的數(shù)據,再下一次跳頻后的5ms時,再收到遙控器發(fā)過來的下一次數(shù)據。
那如果我們能一直早于遙控器發(fā)出數(shù)據,無人機豈不是就直接使用我們的數(shù)據了?確實是這樣的。假設我們的控制腳本中設置為6ms跳頻,我們很快能奪取無人機的控制權(7次跳頻內)。但遙控器也會奪回控制權,最終就會出現(xiàn)無人機有1/7的數(shù)據來自遙控,6/7的來自黑客的局面。
這其實是一場信號爭奪戰(zhàn),那么有沒有辦法讓無人機更穩(wěn)定的更穩(wěn)定接收我們的信號呢?如果我們把跳頻時間設置為 6.9ms,跳頻后每隔0.4ms(Arduino UNO R3的速度極限)發(fā)送一次遙控控制數(shù)據的話,雖然奪取無人機控制權需要更長的時間(約10s),但一旦獲得控制權,在0.4ms發(fā)送一次數(shù)據的高刷新率覆蓋之下,遙控器基本沒可能奪回控制權。
圖19 偽造遙控器的SPI命令數(shù)字邏輯
至此,劫持無人機的基本技術問題已經通過一個信息泄漏漏洞和一個信號覆蓋漏洞解決了。
0x0302 穩(wěn)定性 & 可用性優(yōu)化
在實現(xiàn)控制腳本的過程中,HackRF存在的兩個嚴重限制:一方面HackRF使用USB通訊接口決定了它的通訊延遲巨大(指令延遲約為30ms),上文中動輒0.4ms的控制精度HackRF做不到;另外一方面,HackRF在5.8GHz頻段的信號衰減嚴重(信號強度僅為遙控器的1%,可能是通用天線在高頻段增益偏低),估計只有在貼著無人機射頻芯片的情況下才有作用。天線問題故無法使用HackRF劫持無人機。
靈機一動,我們想到了和遙控器類似的做法:通過Arduino UNO R3單片機平臺來操作BK5811芯片,直接在Arduino上實現(xiàn)我們的控制邏輯。當然,再加一個某寶上淘的有源信號放大器,如下圖所示。根據測試,有效控制范圍為10米左右。
圖20 無人機劫持模塊全家福
最終,通過了漫長的分析和各種漏洞利用方法的嘗試后,我們完成了對大疆無人機的劫持。通過HackRF遍歷和監(jiān)聽,然后將序列輸入到Arduino中,在Arduino中完成對無人機信號的劫持,最后來通過Arduino上連接的簡易開關來控制無人機??刂菩Ч梢詤⒖催@個央視315中的視頻片段。
0x04 后記:攻是單點突破,防是系統(tǒng)工程
從漏洞分析和利用的過程來看,大疆在設計無人機和射頻協(xié)議時確實考慮了安全性的問題,其中跳頻機制雖然很大程度上提升了協(xié)議的破解難度,但卻被過度的依賴。筆者和團隊長期從事騰訊產品的漏洞研究工作,深知如所有其他漏洞攻防場景一樣,分散而孤立的防御機制跟本無法抵御黑客的突破或繞過,指望一個完美的系統(tǒng)來抵御黑客,如同指望馬奇諾防線來抵御德國軍隊的入侵一樣不現(xiàn)實。而更現(xiàn)實情況是攻和守的不對稱,攻擊者利用單點的突破,逐層的推進,往往會領先防御者一大截。
防御者就無計可施了嗎?當然不是。聰明的防御者一定懂得兩個系統(tǒng)性的思路:未知攻焉知防和借力。一方面防守者必須是優(yōu)秀的攻擊者,才有可能嗅得到真正攻擊者的蛛絲馬跡,才有可能在關鍵節(jié)點上部署符合實際情況;另外一方面防守者必須借助自己是在企業(yè)內部這一優(yōu)勢和業(yè)務并肩作戰(zhàn),利用業(yè)務的資源和數(shù)據這些攻擊者拿不到的資源,配合對攻擊的理解,建立對攻擊者來說不對稱的防御系統(tǒng)。
另外一個層面,智能硬件行業(yè)各個廠商對安全的重視令人堪憂。作為無人機行業(yè)絕對第一的大疆,尚且存在嚴重的安全問題,更不要說其他公司——筆者和TSRC物聯(lián)網安全研究團隊近兩年業(yè)余時間對智能硬件安全的研究也印證了這個結論。二進制漏洞的復雜性和門檻決定了這種漏洞類型很少有機會出現(xiàn)在公眾的視野中,但在更隱晦的地下,二進制漏洞攻擊者的力量正在以防御者無法企及的速度悄然成長。也許等到阿西莫夫筆下《機械公敵》中的機器人社會形態(tài)形成時,我們要面對的不是人工智能的進化和變異,而是漏洞攻擊者這種新時代的恐怖分子。
最后,感謝我有一把刷子、zhuliang、泉哥、lake2在整個破解過程中的支持。