Android瀏覽器泄露敏感硬件信息

網絡安全諮詢公司Nightwatch發現,谷歌的Chrome瀏覽器,WebView和 Android的Chrome標籤顯示了有關運行它的設備的硬件型號,固件版本和安全補丁級別的信息。這也會影響使用Chrome呈現網絡內容的所有Android應用程序。此信息可用於跟蹤用戶和指紋設備。它還可用於確定特定設備易受***的漏洞,以便針對***。

雖然供應商(Google)在2015年拒絕了最初的錯誤報告,但他們已於2018年10月針對Chrome v70發佈了部分修復程序。該修復程序隱藏固件信息,同時保留硬件模型標識符。所有先前版本都會受到影響。建議用戶升級到70或更高版本。由於此修復程序不適用於WebView用法,因此應用程序開發人員應手動覆蓋其應用程序中的用戶代理配置。

供應商和MITER都拒絕發佈CVE號碼來跟蹤此問題,因爲他們認爲這不涉及任何安全問題。

背景——Chrome and Headers

適用於Android的Chrome瀏覽器由Google提供,作爲適用於移動設備的Android操作系統的默認瀏覽器。它基於Chromium開源項目。它還爲在Android平臺上運行的其他應用程序提供WebView和Custom Tabs API,用於在不打開單獨的瀏覽器窗口的情況下,在應用程序內呈現Web內容。

與所有瀏覽器一樣,Chrome會向與其通信的Web服務器發送各種標頭作爲每個請求的一部分。這些標頭在HTTP協議中定義,可以在RFC7230,7231,7232,7233,7234和7235找到最新標準,其中包括User-Agent標頭。

HTTP中的“User-Agent”標頭由RFC 7231第5.5.3節定義如下:

user - agent”標題字段包含關於發起請求的用戶代理的信息,服務器通常使用這些信息來幫助識別報告的互操作性問題的範圍,處理或調整響應以避免特定的用戶代理限制,以及分析瀏覽器或操作系統的使用。

背景——Android模型和ID構建

Android設備有內置模型和ID構建,以識別手機模型和Android構建。它們是在android.os.Build中定義的。它們在android.os.Build.MODEL和android.os.Build.ID屬性中定義。這些在Android兼容性定義文檔(第3.2.2節)中進一步定義如下:

MODEL  - 設備實施者選擇的值,包含終端用戶已知的設備名稱。這應該與設備銷售和銷售給最終用戶的名稱相同。沒有具體的形式要求。

ID  - 設備實現者以人類可讀的格式選擇引用特定版本的標識符。此字段可以與android.os.Build.VERSION.INCREMENTAL相同,但應該是一個足以讓最終用戶區分軟件構建的值。該字段的值必須可編碼爲7位ASCII,並匹配正則表達式“^ [a-zA-Z0-9 ._-] + $”。

漏洞詳細信息

根據Chrome文檔,Chrome for Android用戶代理字符串包含Android版本號和構建代碼信息。當應用程序使用Android的WebView和Chrome自定義選項卡API在自己的應用程序中提供Web內容時,也會發送這些信息。雖然Android確實提供了覆蓋這些功能的能力(通過WebView中的WebSettings.setUserAgent()),但大多數應用程序選擇不這樣做以通過依賴默認標頭來確保兼容性。

加劇問題的是,用戶代理標頭總是通過後臺運行的進程發送,同時伴隨發送HTTP和HTTPS請求。此外,與桌面瀏覽器Chrome不同的是,在Android,除了當前會話的瀏覽器本身的“請求桌面站點”選項之外,沒有任何擴展或覆蓋可以更改標題。

例如,針對Android版v5.1.1的Nexus 6上Chrome Beta的用戶代理標頭:

Mozilla / 5.0(Linux; Android 5.1.1; Nexus 6 Build / LYZ28K)AppleWebKit / 537.36(KHTML,類似Gecko)Chrome / 46.0.2490.34 Mobile Safari / 537.36

當用戶選擇“請求桌面站點”選項時,發送的用戶代理標頭是通用Linux標頭。以下是適用於Android v5.1.1的Nexus 6上Chrome Beta的示例:

Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,類似Gecko)Chrome / 46.0.2490.34 Safari / 537.36

不同之處在於,在移動模式下,以下字符串是額外的:

Android 5.1.1; Nexus 6 Build / LYZ28K

它識別操作系統及其版本的事實並不是唯一的。這與許多其他常見瀏覽器在桌面和移動設備上情況相同。構建標記是問題所在。如上所述,構建標記標識設備名稱及其固件構建。對於許多設備來說,這不僅可以用於識別設備本身,還可以用於識別運行它的運營商以及所在國家/地區。它還可用於確定設備上的哪個安全補丁級別以及設備易受***的漏洞。

從以上例子不難看出,其中構建LYZ28K 可以很容易地識別爲在T-Mobile上運行的Nexus 6。使用構建信息根據已知哪些運營商在哪個構建號上來確定運營商也是微不足道的。可以從諸如此類的製造商和電話運營商網站輕鬆獲得構建號碼。

要想檢查設備是否受到影響,用戶可以訪問顯示瀏覽器發送的用戶代理標頭的任何網站,或者您可以在Google搜索中鍵入“查看用戶代理”。或者,可以在像JsFiddle這樣的網站上使用以下JavaScript :document.write(navigator.userAgent)

供應商響應和緩解建議

Bug#494452已於2015年針對Chromium提交此錯誤,並被供應商拒絕爲“WAI” - “按預期工作”。但是,在2018年,供應商提交了一個新的錯誤#860229和功能請求,這部分修復於2018年10月在Chrome v70 for Android中通過從標頭中刪除固件構建信息,但設備型號仍然存在。

該修復程序僅適用於Chrome應用程序本身,而不適用於應用程序開發人員使用的WebView實現,如以下說明所示:

不按照Android兼容性定義文檔的要求,將更改應用於Android Web View。

建議用戶更新到Chrome v70或更高版本以解決此問題。應用程序作者應使用WebSettings.setUserAgent()方法來設置覆蓋用戶代理。雖然許多人不願意這樣做以便失去兼容性,但專家建議使用以下方法,即使用默認用戶代理並刪除其中的構建和模型信息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章