遠端攻擊Android藍芽

deathmonkey發表於2014-03-29

在上週的CanSecWest安全會議上我論述了一種對Android4.3及其以上版本適用的藍芽協議棧(Bluedroid)的遠端攻擊。這篇文章簡單的描述了這個bug。

如果讀者沒有耐心的話,可以點這裡直接觀看攻擊視訊

這個漏洞存在於Bluedroid的BLE資料包解析程式碼中。要測試這個漏洞,攻擊者需要強制一名使用者連線到惡意的BLE(藍芽智慧)裝置上。連線時,該惡意裝置會釋出一個格式錯誤的GATT通知資料包,從而造成協議棧的崩潰。

這聽上去好像有點牽強——攻擊者能強制一名使用者連線到裝置上。但考慮到這樣一個事實:很多Android的BLE應用會適時連線到任何廣告裝置上來確定其是否是與該應用程式相關聯的裝置。只要有應用是出於攻擊的目的連線就可以成功。

但這個漏洞沒有可利用性:崩潰是由一個FORTIFY_SOUCE檢測錯誤所造成的。此外,該漏洞已在Android4.4以上的版本中被修復。

問題程式碼

問題程式碼可以在stack/gatt/gatt_cl.c中的gett_process_notification(614行)處被找到。這段程式碼用於解析通知包(BLE裝置週期性的傳送給BLE機主的訊息)。在626行可以看到如下程式碼:

value.len是unit16_t。p和len都可由攻擊者控制,但我們只對len感興趣。p表示攻擊者傳送的資料包內容,len則是該資料包的大小。

這段程式碼輸出一個至少2位元組大小的資料包。如果攻擊者傳送了只有一個位元組的格式錯誤的資料包,那麼value.len=len-2的計算結果將會下溢到65534。那麼memcpy將會試圖從p中拷貝將近64000位元組的資料。

演示

我為此做了一個演示視訊

我用經修改過的BlueZ(linux 藍芽協議棧)的版本搭建了一個攻擊平臺,BlueZ在這裡作為一個執行GATT服務的BLE裝置。當一個BLE機主連線時,它會自動傳送一個只有單位元組大小的通知資料包。

在視訊中,我使用一個BLE心跳監控應用演示了這個漏洞。出於演示的目的,我手動連線該應用至惡意的BlueZ裝置。當音樂結束時協議崩潰了。

adb logcat的輸出類似於如下顯示:

我再次注意到該攻擊是不可利用的——原因是FORTIFY_SOURCE的執行檢測機制。該程式碼在編譯時已知目標緩衝區的長度。在執行時,該程式碼會檢查memcpy的長度是否大於目標緩衝區,如果是則會呼叫abort()。

時間表

以下是bug追蹤時間表:

  • 2013-09-30:向google披露該漏洞
  • 2013-10-07:承諾解決
  • 2013-10-30:Android 4.4 r0.9 標記該漏洞
  • 2013-10-31:Android 4.4釋出版修復

google並沒有在Android 4.3上釋出修復版,原因是他們希望所有使用者都升級到4.4。

更多資訊

如果你想要學習更多關於BLE主動攻擊和模糊化處理技術,可以觀看我的CanSecWest演講視訊。Outsmarting Bluetooth Smart.

相關文章