<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/14060

            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代所使用的射頻硬件。

            p1 圖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接口進行控制。

            p2 圖2 主控芯片

            p3 圖3 射頻芯片

            而這個參數強大的國產射頻芯片激起了我們的興趣,經過一些挖掘,發現這個芯片原來山寨自NORDIC的nRF24L01+,沒錯,就是這個號稱性價比之王的nRF24L01+ 2.4GHz射頻芯片的5.8GHz版本,更有意思的是這兩個不同廠家芯片的datasheet中絕大部分內容都是通用的。

            通過這些基本的硬件信息確定了射頻的頻段后,我們馬上拿出HackRF在gqrx中觀察5.8GHz的信號。看著瀑布圖(下圖4)中跳來跳去的小黃線,我們意識到精靈3的射頻通訊應該是跳頻的,而在不知道跳頻序列的情況下,無法對射頻信號進行完整解調。此時HackRF的射頻分析基本上派不上用處,唯有通過邏輯分析儀來看看射頻芯片是如何跳頻的。

            p4 圖4 使用gqrx觀察射頻信號

            1.不得已的控制邏輯追蹤

            從上一節獲得的硬件信息中,我們已經知道主控芯片和射頻芯片之間是采用SPI接口進行通訊和控制的,因此只要從BK5811的引腳中找到SPI需要的那四個引腳,連上邏輯分析儀,對這四個引腳的電位變化進行采樣分析,我們就能看到主控芯片是如何控制射頻芯片的跳頻了。

            SPI接口定義

            SPI協議本身其實挺簡單的,在CS信號為低電位時,SCK通過脈沖控制通訊的時鐘頻率,每個時鐘周期里,SI為輸入,SO為輸出,通過SI和SO在每個時鐘里高低電位的切換構成一個bit,每八個時鐘周期構成一個字節,從而形成一個連續的字節流,一個字節流代表一個命令,由射頻芯片的datasheet約定好。SPI協議通訊示意圖如下所示,其中四個引腳分別為:

            p5 圖5 SPI協議通訊示意圖

            連接邏輯分析儀

            通過BK5811的datasheet,我們定位到了SPI通信的那幾個引腳(如圖6),通過萬用表確認引腳連通性,然后在可以電焊的地方通過飛線連上邏輯分析儀的測試鉤,折騰了很久總算連上了(如圖7)。

            p6 圖6 BK5811中SPI引腳定義

            p7 圖7 通過電焊和飛線將BK5811的SPI引腳連上邏輯分析儀

            隨后,從邏輯分析儀中,我們得到了作為安全人員來說最喜歡的二進制數據流。

            射頻芯片控制命令解析

            在BK5811的datasheet中,明確定義了它所支持的每一條SPI命令。通過連續的電位變化傳過來一個完整的SPI命令如下所示:

            p8 圖8 邏輯分析儀中的一個SPI命令

            其中0x30是命令號,高3位代表操作是寫BK5811的寄存器,而寄存器id由這個字節中的低5位決定,是0x10,而0x10代表寫的內容是ShockBurst的發送地址(類似以太網的mac地址)。而后面五字節(0x11 0x22 0x33 0x44 0x19)則是發送地址本身。

            跳頻邏輯總結

            通過一段時間的觀察,我們發現SPI命令頗為簡單,為了方便觀察大量命令的序列,我們按照datasheet中的定義寫了一個解析腳本,在腳本的幫助下終于整理清楚了跳頻的流程。

            p9 圖9 SPI命令解析腳本

            在大疆的定義下,完整的跳頻序列有16個頻點,這些頻點在遙控器和無人機主機配對(一般發生在出廠前)時通過隨機產生,一旦確定后就存儲固定起來,除非手動重新配對。

            遙控器打開后,會以7ms的周期,按照跳頻序列指定的順序來變化射頻發射的頻率,16次(112ms)一個循環,而在每一個周期內,發射一次遙控的控制數據。一個典型的SPI命令序列如:<跳頻> 1ms <發包> 6ms

            p10 圖10 遙控器SPI命令數字邏輯示意圖

            對于無人機主機,則是以1ms的周期來變化接收信號的頻率,一旦收到來自遙控器的射頻信號(BK5811會使用上文所說的發送和接收地址來識別通過),則轉而進入7ms的周期,和遙控器保持同步。一旦信號丟失,馬上又恢復1ms的跳頻周期。一個典型的SPI命令序列如:<跳頻> <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包> 1ms <查包>

            p11 圖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制式就是通過這樣連續的電磁波來連續的傳遞二進制數據。

            p12 圖12 FSK調制解調示意圖

            而GFSK制式僅僅是在FSK制式的基礎上,在調制之前通過一個高斯低通濾波器來限制信號的頻譜寬度,以此來提升信號的傳播性能。

            GFSK解調和IQ解調

            在理解了GFSK制式的原理后,接下來我們嘗試在HackRF的上寫出GFSK解調腳本,從一段遙控實際發出的電磁波中提取二進制數據(如下圖13)。需要注意的是HackRF收發的射頻數據另外采用了IQ調制解調,代碼上也需要簡單處理一下。

            p13 圖13 在空中傳播的GFSK電磁波(IQ制式)

            由于沒有找到現成的解調代碼,只好在MATLAB上(如下圖14)摸爬滾打了許久,并惡補了許多通信基礎知識,折騰出(如下圖15)GFSK解調腳本,并成功模擬遙控器的跳頻邏輯,能夠像無人機那樣獲取每一次跳頻的數據。至此, 我們再次得到了作為安全人員來說最喜歡的二進制數據流。

            p14 圖14 MATLAB中模擬GFSK解調

            15 圖15 GFSK解調腳本工作圖

            遙控控制數據總結

            經過分析,一條典型的遙控控制數據如下(圖16)所示(最新版本固件和稍舊版本的固件協議,格式略有不同):

            p16 圖16 兩種類型的遙控控制數據

            最開始的5個字節為發送方的ShockBurst地址,用于給無人機驗證是不是配對的遙控器。

            接下來的26字節為遙控數據本身(上下,左右,油門,剎車等遙控器上的一切操作),我們詳細來講解下。

            遙控器上的控制桿的一個方向(如上+下,左+右)由12bit來表示。如表示左右方向及力度的數值power_lr由上數據的第5個字節和第6個字節的低4位決定,控制桿居中時power_lr為0x400(1024),控制桿拉至最左時power_lr為0x16C(364),而拉至最右時power_lr為0x694(1684)。也就是說,遙控器可以將控制桿左和右,力度可分為660級,并在控制數據中占用12bit傳輸給無人機主機,主機針對不同的力度執行不同的飛行行為。

            p17 圖17 遙控控制數據解析代碼片段

            其他遙控控制桿的數據也非常類似,故不再贅述。值得注意的是,所有26字節的遙控控制數據是一次性的發給無人機的,故上下,左右,前進后退,油門剎車等所有行為都是并行無干擾的。這也是無人機遙控性能指標中經常說的支持6路信號,12路信號的含義。

            控制數據中最后的1個字節位CRC8校驗位(舊版是CRC16),是前面的31字節的CRC8/CRC16校驗結果,校驗錯誤的數據將被拋棄。

            3.遙控器和無人機通訊邏輯總結

            通過以上漫長的分析過程,我們總算完全搞懂了在遙控器上撥動控制桿的行為,是如何一步步反饋到無人機的飛控程序來完成對應的飛行行為。簡單整理下:

            1. 遙控器和無人機開機后,遙控器負責發送數據,無人機負責接收數據。它們通過共同的跳頻序列的高速跳頻來保持一個數據鏈路,鏈路故障有一定能力能迅速恢復。
            2. 無人機每7ms就會收到一次遙控器發出的32字節控制數據,控制數據只有一條命令一種格式,所有控制桿和開關的狀態會一次性發送到無人機。無人機收到數據后會進行地址校驗和CRC校驗,確保數據是正確無誤的。
            3. 用戶在操縱遙控器的過程中,操控的行為和力度都會在7ms內通過那32字節控制數據反饋至無人機,接著由無人機的飛控程序來完成對應的飛行行為。

            0x03 各個擊破:完全控制無人機


            從遙控器的通訊邏輯來看,想要通過HackRF這類SDR設備覆蓋遙控器發出的射頻數據來劫持無人機。必須解決以下幾個問題:

            1. 雖然通過HackRF來收發GFSK數據已經沒有問題,但不知道跳頻序列根本無法和無人機保持同步。
            2. 如何打斷遙控器原本和無人機之間的穩定射頻鏈路,并同時建立和無人機之間新的穩定鏈路。
            3. 大疆遙控器的射頻功率做了大量優化,有效控制距離達一公里,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個頻點及跳頻序列(如下圖所示)。

            p18 圖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發送一次數據的高刷新率覆蓋之下,遙控器基本沒可能奪回控制權。

            p19 圖19 偽造遙控器的SPI命令數字邏輯

            至此,劫持無人機的基本技術問題已經通過一個信息泄漏漏洞和一個信號覆蓋漏洞解決了。

            2.穩定性 & 可用性優化


            在實現控制腳本的過程中,HackRF存在的兩個嚴重限制:一方面HackRF使用USB通訊接口決定了它的通訊延遲巨大(指令延遲約為30ms),上文中動輒0.4ms的控制精度HackRF做不到;另外一方面,HackRF在5.8GHz頻段的信號衰減嚴重(信號強度僅為遙控器的1%,可能是通用天線在高頻段增益偏低),估計只有在貼著無人機射頻芯片的情況下才有作用。天線問題故無法使用HackRF劫持無人機。

            靈機一動,我們想到了和遙控器類似的做法:通過Arduino UNO R3單片機平臺來操作BK5811芯片,直接在Arduino上實現我們的控制邏輯。當然,再加一個某寶上淘的有源信號放大器,如下圖所示。根據測試,有效控制范圍為10米左右。

            p20 圖20 無人機劫持模塊全家福

            最終,通過了漫長的分析和各種漏洞利用方法的嘗試后,我們完成了對大疆無人機的劫持。通過HackRF遍歷和監聽,然后將序列輸入到Arduino中,在Arduino中完成對無人機信號的劫持,最后來通過Arduino上連接的簡易開關來控制無人機。控制效果可以參看這個央視315中的視頻片段。

            0x04 后記:攻是單點突破,防是系統工程


            從漏洞分析和利用的過程來看,大疆在設計無人機和射頻協議時確實考慮了安全性的問題,其中跳頻機制雖然很大程度上提升了協議的破解難度,但卻被過度的依賴。筆者和團隊長期從事騰訊產品的漏洞研究工作,深知如所有其他漏洞攻防場景一樣,分散而孤立的防御機制跟本無法抵御黑客的突破或繞過,指望一個完美的系統來抵御黑客,如同指望馬奇諾防線來抵御德國軍隊的入侵一樣不現實。而更現實情況是攻和守的不對稱,攻擊者利用單點的突破,逐層的推進,往往會領先防御者一大截。

            防御者就無計可施了嗎?當然不是。聰明的防御者一定懂得兩個系統性的思路:未知攻焉知防和借力。一方面防守者必須是優秀的攻擊者,才有可能嗅得到真正攻擊者的蛛絲馬跡,才有可能在關鍵節點上部署符合實際情況;另外一方面防守者必須借助自己是在企業內部這一優勢和業務并肩作戰,利用業務的資源和數據這些攻擊者拿不到的資源,配合對攻擊的理解,建立對攻擊者來說不對稱的防御系統。

            另外一個層面,智能硬件行業各個廠商對安全的重視令人堪憂。作為無人機行業絕對第一的大疆,尚且存在嚴重的安全問題,更不要說其他公司——筆者和TSRC物聯網安全研究團隊近兩年業余時間對智能硬件安全的研究也印證了這個結論。二進制漏洞的復雜性和門檻決定了這種漏洞類型很少有機會出現在公眾的視野中,但在更隱晦的地下,二進制漏洞攻擊者的力量正在以防御者無法企及的速度悄然成長。也許等到阿西莫夫筆下《機械公敵》中的機器人社會形態形成時,我們要面對的不是人工智能的進化和變異,而是漏洞攻擊者這種新時代的恐怖分子。

            最后,感謝我有一把刷子、zhuliang、泉哥、lake2在整個破解過程中的支持。

            0x05 相關鏈接


            1. http://v.qq.com/iframe/player.html?vid=m0019do4elt&width=670&height=502.5&auto=0
            2. http://2015.geekpwn.org/
            3. http://www.dji.com/cn/newsroom/news/dji-statement-15mar
            4. http://www.bekencorp.com/Botong.Asp?Parent_id=2&Class_id=8&Id=14
            5. https://github.com/mossmann/hackrf
            6. https://www.arduino.cc/en/Main/ArduinoBoardUno
            7. https://github.com/JiaoXianjun/BTLE
            8. http://blog.kismetwireless.net/2013/08/playing-with-hackrf-keyfobs.html

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

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

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

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

                      亚洲欧美在线