天天看點

遠端攻擊 Android 藍牙

在上周的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.

原文連結: lacklustre 翻譯: 伯樂線上 - deathmonkey

繼續閱讀