1. 程式人生 > 其它 >設計缺陷將導致亞馬遜Echo變身成為監聽裝置

設計缺陷將導致亞馬遜Echo變身成為監聽裝置

MWR的安全研究專家發現亞馬遜Echo存在一個物理攻擊漏洞,該漏洞將允許攻擊者獲得裝置的root shell(裝置底層為Linux作業系統),然後安裝惡意軟體,並且不會留下任何攻擊痕跡。這種惡意軟體不僅可以幫助攻擊者獲取到目標裝置的永久遠端訪問權並竊取使用者憑證,而且還可以悄悄將裝置麥克風所記錄下的音訊流資料傳送到攻擊者所控制的遠端伺服器。

這個漏洞是由於以下兩個硬體設計缺陷所導致的:

1.  暴露了裝置的除錯面板;
2.  硬體配置允許裝置從外部SD卡引導啟動;

接下來,我們會告訴大家如何對亞馬遜Echo進行root,並將其變成一臺“監聽器”。

前人的工作

之前已經有安全人員通過在裝置除錯面板上插入外部SD卡來將裝置引導啟動進通用的Linux環境中了,關於具體的操作步驟、漏洞細節和SD卡引導映象都可以在GitHub上找到。除此之外,研究人員還專門釋出了相關的研究報告並介紹了root亞馬遜Echo的可能性。

我們在這些研究的基礎上進行了進一步的深入擴充套件,並將亞馬遜Echo引導啟動進入了真實的系統韌體,安裝持久化後門、獲得了遠端root shell的訪問權,並最終實現了對裝置麥克風的遠端實時竊聽。

Root裝置

將亞馬遜Echo底部的橡膠墊揭開之後,我們會看到18個除錯面板,關於這些面板的具體作用請參考Clinton等人發表的文章。

通過與這些暴露在外的UART面板相連線,我們就可以檢視到裝置的啟動資訊,並獲取到裝置的配置詳情。

但不幸的是,在裝置的啟動過程中我們既沒有拿到shell,也沒有得到登入提示,而且U-Boot啟動過程也沒辦法中斷。

亞馬遜Echo的主MCU是一塊由美國德州儀器製造的DM3725數字媒體處理器(配備了一個ARM Cortex-A CPU)。在裝置的啟動過程中,晶片的啟動過程分為三步。首先,裝置會通過一個bootrom來完成硬體的最小化配置。接下來,它會將第二個bootloader(X-loader)載入進MCU的內部RAM。這一步需要在第三個bootloader(U-Boot)載入進外部RAM之前完成。最後,U-Boot便會載入核心並向其傳遞控制資訊。

根據亞馬遜Echo的配置,它首先會嘗試從連線至除錯面板的SD卡(優先與內部eMMC單元)啟動,這種啟動順序的設定主要取決於啟動過程中MCU的硬體狀態,而且只能通過修改硬體主機板的配置來改變啟動順序。

因此,我們只需要向SD卡寫入X-lodaer以及U-Boot,並進行正確的分割槽,我們就可以讓裝置從SD卡啟動並進入U-Boot命令列介面。

由於裝置的隱藏ROM是以SPI模式來與SD卡通訊的,而且我們無法通過SD卡啟動至裝置的主作業系統,所以我們不需要連線上圖中所有的SDMMC面板。

MMC與SPI的對映關係如下:

SDMMC D0 → MISO SDMMC D3 → !SS SDMMC CMD → MOSI SDMMC CLOCK → SCK

我們還需要給SDMCC POWER面板和SD卡外接一個+3V電源,然後連線其中一個GND面板。

下圖就是我們的實驗環境,其中亞馬遜Echo連線到了一個外部SD卡電路板,並通過UART與膝上型電腦相連。

接下來,我們通過SD卡(寫入了X-loader和U-Boot)啟動裝置之後,我們就可以中斷裝置的啟動過程,並進入U-Boot命令列介面。這樣一來,我們就有可能檢視到檔案系統內部記憶體中的內容了,而且我們甚至還可以重新修改核心引數。

現在我們需要確定內部eMMC的哪一個分割槽中包含主核心以及檔案系統。內部eMMC有八個分割槽,分割槽標籤如下:

1. xloader 2. recovery 3. boot 4. idme 5. diag 6. main-A 7. main-B 8. data

diag分割槽載入的是一個診斷環境,我們還沒有對其進行完整的測試。

我們所要找的主檔案系統以及核心會在main-A和main-B分割槽之間轉換,每一次裝置韌體更新便會引發分割槽轉換。為了找出我們的目標分割槽,我們可以利用U-Boot並使用下列命令對檔案系統進行測試:

uboot> mmc dev 1 uboot> ext4ls mmc 1:6 uboot> ext4ls mmc 1:7

執行上面的命令之後,我們只能夠看到其中一個分割槽的檔案系統,如果我們想要檢視這兩個分割槽的檔案系統,我們就要通過一次韌體更新來完成分割槽轉換。確定了分割槽之後,我們就可以修改U-Boot並讓它從這個分割槽啟動。除此之外,我們還要修改核心引數並以可寫檔案系統的形式載入這個分割槽,然後執行/bin/sh,而不是執行正常的啟動指令碼。

得到了root shell之後,我們就可以繞過所有的認證機制了。

但是現在裝置每隔幾分鐘就會重啟一次,為了防止裝置自動重啟,我們需要設定一個監控程序,並定期重置裝置的重啟計時器。

執行下列命令啟動監控程序(watchdog):

現在測試環境總算是穩定了,但是主要的服務都還沒有啟動,裝置的功能也沒有完全釋放。不過我們已經得到了整個檔案系統的完整讀寫許可權,而且還可以隨意修改配置。

在我們的PoC中,我們在data分割槽(可寫分割槽)中安裝了一個反向shell指令碼。使用下列命令載入這個分割槽:

分割槽載入完成之後,我們就可以通過這個反向shell指令碼來實現裝置的持久化感染了。

我們還需要在裝置啟動之後觸發這個反向shell指令碼,我們只需要在其中一個初始化指令碼的結尾新增下列程式碼即可。我們選擇的是/etc/init.d/varlocal.sh,因為它是最後幾個執行的初始化指令碼之一,而且它還可以載入data分割槽。

安裝好反向shell指令碼之後,我們就可以移除外部SD卡和UART連線線,然後重啟Echo並進入正常狀態了。在裝置重啟的過程中,初始化指令碼會執行我們的反向shell。如果我們遠端監聽裝置的1377埠,我們就可以通過root shell與遠端裝置進行連線了:

你有在聽嗎?

接下來,我們就可以使用亞馬遜自己開發的“shmbuf_tool”應用程式來獲取音訊緩衝區中的音訊多媒體資料了。我們自己建立了一個能夠持續不斷地向fifo管道寫入原始音訊資料(通過麥克風竊聽)的指令碼,並通過TCP/IP將音訊流傳送到遠端伺服器。在遠端伺服器端接收到原始音訊資料之後,我們可以將其儲存為一個wav檔案或直接通過揚聲器進行播放。

需要注意的是,這項攻擊技術並不會影響亞馬遜Echo原本的正常功能。

指令碼程式碼startStream.sh如下:

下列命令可以將音訊流資料儲存到遠端服務端:

或者使用下列命令通過揚聲器播放竊聽資料:

漏洞修復

2015和2016版的亞馬遜Echo均存在這個漏洞,但是2017版已經修復了這個問題。

下圖為存在漏洞的2016版亞馬遜Echo,型號編碼23-002518-01:

下圖為修復後的2017版亞馬遜Echo,型號編碼23-002518-02:

參考資料

1. https://github.com/echohacking/wiki/wiki/Echo 2. https://vanderpot.com/Clinton_Cook_Paper.pdf 3.https://www.theverge.com/circuitbreaker/2016/12/14/13955878/wynn-las-vegas-amazon-echo-hotel-room-privacy