Android通過RSSI廣播洩漏敏感資料漏洞披露(CVE-2018-9581)
概述
在2018年秋季,我們在BSides DE上發表了關於3個Android漏洞的報告,分別是CVE-2018-9489、CVE-2018-9581和CVE-2018-15835,這三個漏洞具有相同的漏洞原因。
在Android作業系統的系統廣播中,可以暴露出WiFi訊號強度資訊(RSSI),裝置上的任何應用程式都可以在不需要額外許可權的前提下獲取此資訊。一些惡意應用程式可能會將此資訊用於室內定位,從而根據附近的WiFi路由器來定位或跟蹤使用者。同樣的問題也存在於底層Android API,但它需要額外的許可權。
我們相信,所有版本的Android都受到該漏洞的影響。目前,廠商Google尚未完全修復此漏洞。但在Android 9/P上,兩種廣播型別的其中一種,已經不再顯示敏感資料,這是CVE-2018-9489修復工作的一部分。廠商為該漏洞分配了編號CVE-2018-9581。我們建議,還需要進行進一步研究,以確認該漏洞是否在野外被實際利用。
背景
Android是Google開發的開源作業系統,被廣泛應用於手機和平板電腦上。據統計,全球有超過20億臺裝置在執行Android系統。Android上的應用程式通常被作業系統彼此隔離,當然,它們也與作業系統之間相互隔離。但是,仍然存在一些機制,可以實現程序之間的通訊,以及程序與作業系統的互動。
特別地,Android提供了“Intents”,作為程序間通訊方式之一。使用“Intent”的廣播允許應用程式或作業系統在全系統範圍內傳送可由其他應用程式監聽的訊息。儘管已經存在限制允許特定應用閱讀某類訊息的功能,但應用程式的開發人員往往沒能正確實施此類限制,忽略了遮蔽敏感資料。這將導致Android應用程式產生常見的漏洞,其中在同一裝置上執行的惡意應用程式可以監聽並捕獲由其他應用程式廣播的訊息。
Android使用的另一種安全機制是許可權,這是一個旨在保護使用者隱私的安全措施。應用程式必須通過應用程式清單(“AndroidManifest.xml”)中的特殊“uses-permission”標記明確請求訪問某些資訊或功能。根據許可的型別(例如“正常”、“危險”等),作業系統可以在安裝期間向用戶詢問是否授權,或者在執行期間再次提示。另外,也有某些許可權只能由系統應用程式使用,並且不能由常規開發人員使用。
Google+Play/">Google Play安裝期間和應用程式執行期間的許可權提示截圖如下:
漏洞詳情
Android作業系統定期會在全系統範圍內廣播WiFi強度值(RSSI),訪問此資訊無需特殊許可權。RSSI值表示裝置接收訊號的相對強度(數值越大代表訊號越強),但不與實際物理訊號強度(dBm)直接相關。該內容是通過兩個單獨的Intents公開的,分別為android.net.wifi.STATE_CHANGE(Android 9之前)和android.net.wifi.RSSI_CHANGED(所有Android版本)。
儘管應用程式也可以通過WifiManager訪問此資訊,但根據規範,要訪問此資訊需要“ACCESS_WIFI_STATE”許可權。針對Android 9中新增的WiFi RTT功能,需要“ACCESS_FINE_LOCATION”許可權。然而,在監聽系統廣播時,並不需要這樣的許可權,所以應用程式可能會在使用者不知情的情況下捕獲該資訊。
綜上所述,存在兩個單獨的安全問題,具體如下:
1、RSSI值可以通過廣播獲得,繞過通常所需的許可權檢查(ACCESS_WIFI_STATE);
2、通過廣播或WifiManager所獲取的RSSI值,可以用於室內定位,無需特殊位置許可。
普通使用者復現過程
針對Android裝置使用者,可以按照如下方式來複現此漏洞:
1、安裝由Vilius Kraujutis開發,上線到Google Play的“Internal Broadcasts Monitor”(內部廣播監控)應用程式。
2、開啟應用程式,點選“Start”(開始)來監控廣播。
3、觀察系統廣播,特別是android.net.wifi.STATE_CHANGE(Android 9之前)和android.net.wifi.RSSI_CHANGED(所有Android版本)。
截圖如下:
開發者復現過程(程式碼實現)
如果需要通過程式碼進行復現,可以建立一個廣播接收器,並將其註冊,以接收android.net.wifi.STATE_CHANGE(僅限8.1及以下版本)和android.net.wifi.RSSI_CHANGED。
示例程式碼如下所示:
public class MainActivity extends Activity { @Override public void onCreate(Bundle state) { IntentFilter filter = new IntentFilter(); filter.addAction(android.net.wifi.STATE_CHANGE); filter.addAction(android.net.wifi.RSSI_CHANGED); registerReceiver(receiver, filter); } BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(intent.toString()); …. } };
測試方法
我們的測試過程,使用了以下裝置:
Pixel 2,Android 8.1.0系統,補丁更新至2018年7月;
Nexus 6P,Android 8.1.0系統,補丁更新至2018年7月;
Moto G4,Android 7.0系統,補丁更新至2018年4月;
Kindle Fire HD第八代,Fire OS 5.6.10系統(由Android 5.1.1分叉),補丁更新至2018年4月;
路由器使用華碩RT-N56U,執行最新版本韌體。
實際測試表明,Kindle Fire所使用的Android分支版本系統繼承了相應的功能。
執行步驟如下:
1、安裝Broadcast Monitor應用程式;
2、將手機置為飛航模式;
3、走入房間;
4、關閉飛航模式(觸發RSSI廣播);
5、從以下廣播中獲取RSSI值:
(1) android.net.wifi.RSSI_CHANGE – newRssi值,
(2) android.net.wifi.STATE_CHANGE – networkInfo / RSSI;
6、針對每個房間,都重複步驟3-4。
測試結果表明,在每個房間使用特定裝置時,都具有不同的RSSI值範圍。
測試期間收集的值範圍如下:
廠商響應及緩解措施
廠商Google將該漏洞定級為中等,並指定了CVE編號CVE-2018-9581。目前該漏洞尚未修復,但在Android 9/P上,兩種廣播型別之中的一種(android.net.wifi.STATE_CHANGE)已經不再顯示敏感資料。目前尚不清楚該漏洞是否在野外被利用。
參考內容
Android ID#111698366
CVE ID:CVE-2018-9581( ofollow,noindex" target="_blank">https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-15835 )
Google Bug#111662293
GitHub:Internal Broadcasts Monitor( https://github.com/ViliusKraujutis/AndroidBroadcastsMonitor )
致謝
感謝Vilius Kraujutis開發內部廣播監控器應用程式,並在GitHub中提供原始碼。
然後,還要感謝多位學術研究人員,他們曾發表過通過RSSI值進行使用者定位的相關研究,包括如下論文:
[1] “Algorithms for Location Estimation Based on RSSI Sampling.” (2008); Papamanthou C., Preparata F.P., Tamassia R.; In: Fekete S.P. (eds) Algorithmic Aspects of Wireless Sensor Networks. ALGOSENSORS 2008. Lecture Notes in Computer Science, vol 5389. Springer, Berlin, Heidelberg
[2] “Comparison of RSSI techniques in Wireless Indoor Geolocation,” (2012); G. A. Naik, M. P. Khedekar, M. Krishnamoorthy, S. D. Patil and R. N. Deshmukh,; 2012 NATIONAL CONFERENCE ON COMPUTING AND COMMUNICATION SYSTEMS, Durgapur, 2012, pp. 1-5.
[3] “Theoretical facts on RSSI-based geolocation,”; (2012) J. S. Picard and A. J. Weiss; 2012 IEEE 27th Convention of Electrical and Electronics Engineers in Israel, Eilat, 2012, pp. 1-5.
[4] “Adversarial WiFi Sensing” (2018); Yanzi Zhu, et al; arXiv:1810.10109;
時間節點
2018-03-28:將關於CVE-2018-9489的原始報告提供給廠商
2018-07-19:根據廠商請求,針對此漏洞編寫單獨的報告,並提供測試結果
2018-07-20:收到廠商回覆,正在對此漏洞進行分析
2018-08-09:提供Android 9測試結果
2018-08-14:提供復現建議
2018-08-28:詢問是否能夠披露
2018-09-14:廠商反饋已經收到,仍需等待
2018-09-19:詢問廠商
2018-09-21:廠商反饋已經收到,正在分析中
2018-10-14:關於即將舉行的演講,通知廠商
2018-10-15:廠商反饋已經收到,正在對該漏洞進行研究
2018-10-25:要求為該漏洞分配CVE
2018-10-30:再次詢問CVE情況
2018-11-01:詢問MITERCVE分配情況
2018-11-05:廠商為該漏洞指定CVE,並通知MITER
2018-11-06:將幻燈片提供給廠商進行稽核
2018-11-09:在BSides DE演講中公開披露
2018-11-11:公開發布此文章