國外研究人員披露了Android漏洞(CVE-2018-9489)的信息。Android系統的內部廣播機制會暴露敏感的用戶和設備信息,手機上安裝的應用可在用戶不知情或未經許可的情況下訪問獲取這些信息。
Android系統的內部廣播機制泄露的數據包括:Wi-Fi網絡名稱、Wi-Fi網絡BSSID,本地IP地址、DNS服務器信息和設備的MAC地址等詳細信息。部分信息(如Mac地址)在Android 6版本以上無法通過這個漏洞獲取,但是剩下的依然可以通過監聽廣播來繞過權限檢查和其他防范措施。
背景
Android是谷歌開發的用于手機和平板電腦的開源操作系統,保守估計全球有超過20億臺設備運行Android。Android上的應用程序通常與系統隔離,但是通過幾種機制仍然可以實現應用程序的進程與操作系統間的交互。
比如說這次問題的源頭。Android提供了“ Intent ”作為進程間的通信方式之一,該機制允許應用程序或系統發送可由其他應用程序收聽的消息。盡管開發人員可以選擇關閉或限制這個機制,但是在實踐過程中工程師往往疏于部署限制機制或屏蔽敏感數據。這就導致了上文中的Android漏洞,手機上的惡意軟件可以監聽并捕獲其他應用程序廣播的消息。
安卓系統提供的最常見的安全機制是權限控制,旨在保護用戶的隱私信息不受侵害。應用程序必須通過應用程序清單(“ AndroidManifest.xml ”)中的特殊“ uses-permission ”標記明確請求訪問某些信息或功能。根據許可的類型(如“正常”、“危險”等),系統可以在應用安裝期間向用戶顯示授權信息,或者在運行期間再次提示。某些權限只能由系統應用程序使用,并且不向第三方開發人員開放。
Google Play和運行時的應用程序權限截圖:
漏洞詳情
Android系統通過“ Intent ”機制廣播有關Wi-Fi連接和Wi-Fi網絡接口的信息:
WifiManager的NETWORK_STATE_CHANGED_ACTION
WifiP2pManager的WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
這些信息包括設備的MAC地址、Wi-Fi接入點的BSSID、網絡名稱以及本地IP、網關IP和DNS服務器地址等信息。此信息可供用戶設備上運行的所有應用程序使用。
雖然應用程序也可以通過WifiManager訪問此信息,但這樣的話需要應用程序清單中的“ ACCESS_WIFI_STATE ”權限。通過Wi-Fi進行地理定位通常需要“ ACCESS_FINE_LOCATION ”或“ ACCESS_COARSE_LOCATION ”權限。此外,在Android版本6.0及更高版本中,設備的實際MAC地址不再通過API提供,并始終返回地址“02:00:00:00:00:00”。然而,監聽系統廣播的應用程序不需要這些權限,因此允許在不知道用戶的情況下捕獲該信息,并且甚至在Android 6或更高版本上捕獲真實MAC地址。
嘗試在Android 7.0中獲取MAC地址的應用截圖:
研究人員使用多款硬件和不同Android版本進行了測試,結果顯示所有測試設備和Android版本都可以復現這個問題,盡管某些設備未在“ NETWORK_STATE_CHANGED_ACTION ”Intent中顯示實際MAC地址,但它們仍在“ WIFI_P2P_THIS_DEVICE_CHANGED_ACTION ”Intent內。同時由于MAC地址是固定且與硬件綁定,所以哪怕設備的MAC地址是隨機化的,也可以用它來識別和跟蹤任何Android設備。而針對網絡名稱和BSSID信息,可通過查詢BSSID數據庫(如WiGLE或SkyHook)來定位用戶。惡意軟件可以使用這些網絡信息來進一步試探和攻擊本地Wi-Fi網絡。研究人員表示所有版本的Android系統均會受到影響,包括各種分支,如亞馬遜的Kindle FireOS。谷歌在Android P/9中修復了這個問題,但不會為舊版本的系統提供更新,建議用戶升級到Android最新版本。
問題復現
通過應用程序
對于Android設備用戶,可以按如下方式復制這些問題:
1. 安裝Vilius Kraujutis開發的“Internal Broadcasts Monitor”應用。
2. 打開應用,然后點擊“Start”開始監控廣播信息。
3. 觀察系統廣播信息,特別是“android.net.wifi.STATE_CHANGE”和“android.net.wifi.p2p.THIS_DEVICE_CHANGED”這兩條。
示例:
通過代碼
使用代碼復現,需要創建一個廣播接收器并注冊以接收這些信息:
android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION
android.net.wifi.WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
示例代碼如下所示:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle state) {
IntentFilter filter = new IntentFilter();
filter.addAction(
android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(
android.net.wifi.WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
registerReceiver(receiver, filter);
}
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(intent.toString());
….
}
};
后續
因為這是一個重大的API變更,谷歌僅在Android P/9中修復了這個問題,舊版的Android系統不會得到更新,建議用戶升級到Android P/9或更高版本。
|