Android系統默認賦予瀏覽器權限以及Android惡意覆蓋導致谷歌瀏覽器授權失敗的解決辦法

Android系統默認賦予瀏覽器權限以及Android惡意覆蓋導致谷歌瀏覽器授權失敗的解決辦法

一、Android系統默認賦予瀏覽器權限

只要是設計到默認賦權,就在framework下找這個類:base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
安卓系統開機的時候會調用這個類里面的下面這個方法:

 public void grantDefaultPermissions(int userId) {DelayingPackageManagerCache pm = new DelayingPackageManagerCache();grantPermissionsToSysComponentsAndPrivApps(pm, userId);grantDefaultSystemHandlerPermissions(pm, userId);grantSignatureAppsNotificationPermissions(pm, userId);grantDefaultPermissionExceptions(pm, userId);// Apply delayed statepm.apply();}

grantDefaultSystemHandlerPermissions方法里面會默認賦予瀏覽器權限

private void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int userId) {......// BrowserString browserPackage = ArrayUtils.firstOrNull(getKnownPackages(KnownPackages.PACKAGE_BROWSER, userId));if (browserPackage == null) {browserPackage = getDefaultSystemHandlerActivityPackageForCategory(pm,Intent.CATEGORY_APP_BROWSER, userId);if (!pm.isSystemPackage(browserPackage)) {browserPackage = null;}}grantPermissionsToPackage(pm, browserPackage, userId, false /* ignoreSystemPackage */,true /*whitelistRestrictedPermissions*/, FOREGROUND_LOCATION_PERMISSIONS);
}

代碼中通過"Intent.CATEGORY_APP_BROWSER"這個標識去判斷是否是瀏覽器應用,如果是瀏覽器應用將會通過grantPermissionsToPackage方法去賦予瀏覽器權限

@SafeVarargsprivate final void grantPermissionsToPackage(PackageManagerWrapper pm, String packageName,int userId, boolean ignoreSystemPackage, boolean whitelistRestrictedPermissions,Set<String>... permissionGroups) {grantPermissionsToPackage(pm, pm.getPackageInfo(packageName),userId, false /* systemFixed */, ignoreSystemPackage,whitelistRestrictedPermissions, permissionGroups);}

通過代碼可以看到permissionGroups是一個可變參數,如果想給瀏覽器添加更多的默認參數只要在后面添加相應的權限即可,如下:

grantPermissionsToPackage(pm, browserPackage, userId, false /* ignoreSystemPackage */,

            true /*whitelistRestrictedPermissions*/, FOREGROUND_LOCATION_PERMISSIONS,NOTIFICATION_PERMISSIONS,STORAGE_PERMISSIONS,CAMERA_PERMISSIONS,MICROPHONE_PERMISSIONS);
二、Android惡意覆蓋導致谷歌瀏覽器授權失敗的解決辦法

在通過谷歌瀏覽器使用zoom會議的過程中我們發現,當授予zoom會議攝像頭或者麥克風權限的時候,點擊確認授予權限時會彈出以下彈窗導致授權失敗,從而導致zoom會議無法打開攝像頭和麥克風。
![[Pasted image 20250703094224.png]]

首先我們借助AI工具看一下谷歌瀏覽器的源碼,“此網站無法請求授權,請關閉來著其他應用的所有氣泡和疊加層,然后重試”這個彈窗是什么條件下觸發的,得到以下信息

谷歌瀏覽器(Chromium)中關于 “此網站無法請求授權” 錯誤提示的源碼主要涉及權限請求攔截、覆蓋層檢測和用戶界面通知三個核心模塊。以下從源碼層面解析其實現邏輯:

一、錯誤提示的觸發條件

該錯誤通常在以下情況觸發(基于content/browser/permission_manager模塊):

  1. 存在屏幕覆蓋層(如懸浮窗、輸入法面板等)
  2. 權限請求被系統層攔截
  3. 渲染進程與瀏覽器進程通信中斷
  4. 安全策略阻止跨域授權請求

二、核心源碼分析

1. 覆蓋層檢測機制(Overlay Detector)

源碼路徑:content/browser/android/overlay_detector_android.cc

// content/browser/android/overlay_detector_android.cc
bool OverlayDetector::IsOverlayPresent() {// 獲取系統窗口管理器服務WindowManager* wm = WindowManager::GetInstance();// 檢查是否存在非系統級覆蓋窗口std::vector<WindowInfo> windows = wm->GetAllWindows();for (const auto& window : windows) {if (!window.is_system_window && window.overlaps_application_area) {return true;  // 存在惡意覆蓋層}}return false;
}
2. 權限請求攔截邏輯

源碼路徑:content/browser/permission_manager/permission_manager_impl.cc

// content/browser/permission_manager/permission_manager_impl.cc
void PermissionManagerImpl::RequestPermission(PermissionType permission,RenderFrameHost* render_frame_host,const GURL& requesting_origin,bool user_gesture,base::OnceCallback<void(PermissionStatus)> callback) {// 檢查是否存在覆蓋層if (overlay_detector_->IsOverlayPresent()) {// 觸發覆蓋層錯誤提示NotifyOverlayError(render_frame_host, requesting_origin);std::move(callback).Run(PERMISSION_STATUS_DENIED);return;}// 其他權限校驗邏輯...
}void PermissionManagerImpl::NotifyOverlayError(RenderFrameHost* render_frame_host,const GURL& origin) {// 創建錯誤消息std::string error_message = "此網站無法請求授權,請關閉來自其他應用的所有氣泡和疊加層,然后重試";// 通過WebUI發送錯誤通知到渲染進程WebUIMessageHandler::Send(render_frame_host,"chrome://overlay-error/",base::Value(error_message));
}
3. 用戶界面通知實現

源碼路徑:chrome/browser/ui/android/overlay_error_dialog.cc

// chrome/browser/ui/android/overlay_error_dialog.java
public class OverlayErrorDialog {private final Activity activity;private final String origin;private AlertDialog dialog;public OverlayErrorDialog(Activity activity, String origin) {this.activity = activity;this.origin = origin;}public void show() {// 構建錯誤提示對話框AlertDialog.Builder builder = new AlertDialog.Builder(activity);builder.setTitle("授權失敗").setMessage("此網站無法請求授權,請關閉來自其他應用的所有氣泡和疊加層,然后重試").setPositiveButton("確定", (dialog, which) -> dialog.dismiss()).setIcon(R.drawable.ic_warning);dialog = builder.create();dialog.show();}public void dismiss() {if (dialog != null && dialog.isShowing()) {dialog.dismiss();}}
}
4. 系統權限交互邏輯

源碼路徑:content/browser/android/permission_request_controller_android.cc

// content/browser/android/permission_request_controller_android.cc
void PermissionRequestController::OnSystemPermissionsResult(int request_code,const std::vector<std::string>& permissions,const std::vector<int>& grant_results) {// 處理系統權限請求結果if (grant_results.empty() || grant_results[0] != PackageManager.PERMISSION_GRANTED) {// 權限被拒絕,檢查是否因覆蓋層導致if (overlay_detector_->IsOverlayPresent()) {ShowOverlayErrorDialog();} else {ShowPermissionDeniedDialog();}}
}

三、錯誤提示的顯示流程

  1. 檢測階段:當網站請求敏感權限(如攝像頭、位置)時,瀏覽器通過OverlayDetector檢查屏幕上是否存在可疑覆蓋層。
  2. 攔截階段:若檢測到覆蓋層,PermissionManager會攔截權限請求,并調用NotifyOverlayError生成錯誤消息。
  3. 顯示階段OverlayErrorDialog將錯誤消息包裝為系統對話框,并通過 Android UI 框架顯示給用戶。

四、相關配置與擴展點

  1. 覆蓋層檢測閾值:可通過chrome://flags中的overlay-detection-sensitivity標志調整檢測靈敏度。
  2. 錯誤消息本地化:字符串資源定義在chrome/android/java/res/values/strings.xml中。
  3. 白名單機制:在content/public/common/overlay_whitelist.h中可配置允許的覆蓋層應用。

五、解決思路與源碼關聯

當遇到 “此網站無法請求授權” 錯誤時,可從以下源碼角度排查:

  1. 覆蓋層檢測失敗:檢查OverlayDetector::IsOverlayPresent()的返回邏輯。
  2. 權限請求流程中斷:調試PermissionManagerImpl::RequestPermission()的執行路徑。
  3. UI 顯示異常:檢查OverlayErrorDialog的生命周期管理。

再通過AI工具檢查一下OverlayDetector::IsOverlayPresent()方法的返回邏輯,得到以下信息

在 Chromium 源碼中,OverlayDetector::IsOverlayPresent() 方法用于檢測屏幕上是否存在可能干擾瀏覽器權限請求的覆蓋層(如懸浮窗、惡意疊加層等)。其返回邏輯涉及系統窗口管理、應用權限檢查和窗口屬性分析,以下是核心實現解析:

一、方法核心邏輯

源碼路徑:content/browser/android/overlay_detector_android.cc

bool OverlayDetector::IsOverlayPresent() {// 1. 獲取系統窗口管理器服務WindowManager* wm = WindowManager::GetInstance();if (!wm)return false;// 2. 獲取所有可見窗口列表std::vector<WindowInfo> windows = wm->GetVisibleWindows();// 3. 檢查每個窗口是否為可疑覆蓋層for (const auto& window : windows) {// 跳過系統信任的窗口類型if (IsSystemTrustedWindow(window))continue;// 檢查窗口是否與瀏覽器內容區域重疊if (window.overlaps_browser_content) {// 檢查窗口是否具有高風險屬性if (IsHighRiskOverlay(window)) {LOG(WARNING) << "檢測到高風險覆蓋層: " << window.title;return true;}// 累積非系統窗口計數non_system_window_count_++;}}// 4. 判斷非系統窗口數量是否超過閾值if (non_system_window_count_ > kMaxAllowedNonSystemWindows) {LOG(WARNING) << "非系統覆蓋層數量過多: " << non_system_window_count_;return true;}return false;
}

二、關鍵輔助方法解析

1. 系統信任窗口判斷
bool OverlayDetector::IsSystemTrustedWindow(const WindowInfo& window) {// 系統狀態欄、導航欄等屬于信任窗口if (window.type == WINDOW_TYPE_STATUS_BAR ||window.type == WINDOW_TYPE_NAVIGATION_BAR) {return true;}// 輸入法窗口屬于信任窗口(但需特殊處理)if (window.type == WINDOW_TYPE_INPUT_METHOD) {return is_keyboard_trusted_;}// 檢查窗口是否由系統簽名應用創建if (window.is_system_signed) {// 部分系統應用仍需進一步驗證if (IsSystemAppWithOverlayPermission(window.package_name)) {return true;}}return false;
}
2. 高風險覆蓋層判斷
bool OverlayDetector::IsHighRiskOverlay(const WindowInfo& window) {// 檢查窗口是否為"TYPE_APPLICATION_OVERLAY"類型(Android 8.0+的懸浮窗類型)if (window.type == WINDOW_TYPE_APPLICATION_OVERLAY) {// 檢查窗口是否請求了危險權限if (HasDangerousPermissions(window.package_name)) {return true;}// 檢查窗口是否來自已知風險應用if (IsKnownRiskyApp(window.package_name)) {return true;}}// 檢查窗口是否具有不透明全屏特性if (window.is_opaque && window.covers_entire_screen) {return true;}return false;
}
3. 窗口與瀏覽器內容區域重疊判斷
bool OverlayDetector::DoesWindowOverlapBrowserContent(const WindowInfo& window) {// 獲取瀏覽器內容區域坐標gfx::Rect content_area = GetBrowserContentArea();// 檢查窗口邊界是否與內容區域相交return window.bounds.Intersects(content_area);
}

從以上的源碼我們可以看到,如果是系統信任的窗口則直接跳過返回false,如果是窗口與瀏覽器窗口疊加并且是被判斷為窗口具有高風險屬性則返回true,彈窗就會彈出。這時候可以判斷是系統的某個應用,覆蓋在了瀏覽器的上層或者和瀏覽器在同一層級,并且具有高風險屬性。通過代碼排查,以下應用會一直顯示在上層。打開谷歌瀏覽器時截屏并未打開,那只可能是側邊欄的問題了,這時候我們去設置菜單里面設置一下把側邊欄給隱藏掉,這時候再去打開zoom會議授權,發現授權成功了,彈窗沒有彈出來,我們可以確定該問題是側邊欄導致的,查看側邊欄源碼發現側邊欄使用TYPE_APPLICATION_OVERLAY類型并且請求了危險權限,這下就解釋得通了。

接下來要怎么處理該問題,最好的辦法就是看一下能不能把側邊欄設置為系統信任的窗口,再次使用AI我們得到了以下解決辦法。

  1. 申請系統簽名

    • 通過 OEM 合作或設備定制,為應用獲取系統簽名,從而使用PRIVATE_FLAG_TRUSTED_OVERLAY標志:
      // 系統應用才能生效的代碼
      if (isSystemApp()) {params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY;
      }
      
  2. 加入設備白名單

    • 與設備廠商合作,將應用添加到瀏覽器的信任白名單中:

      // 設備特定配置(非公開API)
      chrome://flags/#overlay-allowed-apps=com.your.app
      

顯然第一種方法是比較行得通的,側邊欄已經是系統應用,我們只需要添加PRIVATE_FLAG_TRUSTED_OVERLAY標志位即可,修改如下,即可解決惡意覆蓋導致授權失敗問題,該問題最后修改的地方比較簡單只有一行,但是問題的處理和排查過程會相對麻煩一些,這也是大部分系統級問題的通病。其他應用(如懸浮球等應用的解決思路也是一樣的),只不過該屬性在安卓frameworks中是隱藏的,在懸浮球等應用中需要通過反射調用,這方面我們就不去講解了。

![[Pasted image 20250703102302.png]]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87336.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

矩陣的秩 線性代數

定義和求法 關于秩的幾個重要式子 例題 給出秩&#xff0c;那我們就有三個知識點&#xff0c;一個是用定義&#xff0c;一個是用求法&#xff0c;一個是重要式子。 題目沒什么好翻譯的&#xff0c;基本就是赤裸裸的跟你坦白了直說了。 接下來就是解法了。用定義的話就是說這個…

【大模型】基于MCP的mysql 服務構建及使用(python語言)

前言 ? 在之前使用dify來編排AI智能體&#xff0c;有這樣的一個場景&#xff0c;希望智能體能自動讀取數據庫數據&#xff0c;獲得統計數據&#xff08;問數&#xff09;&#xff0c;最終生成報告。 ? 當時實現思路是&#xff0c;通過知識庫告訴大模型相關表的字段定義&…

OA退位,如何打造安全便捷的跨網文件傳輸與即時通訊平臺?

隨著醫院信息化建設深入推進&#xff0c;OA 系統在日常流程審批和文件流轉中扮演著不可或缺的角色。然而&#xff0c;面對“內網?外網”強隔離的安全要求&#xff0c;OA 在跨域傳輸上仍然存在審批延遲、人工干預、病毒風險等痛點。 一、OA 在跨網傳輸中的 “ 最后一公里 ” 難…

LlamaIndex的多輪對話引擎使用說明

一、背景 LlamaIndex提供2種交互引擎&#xff1a;查詢引擎和聊天引擎。&#xff08;詳情請看這里&#xff09;查詢引擎默認沒有上下文信息&#xff0c;也就是說默認是單輪對話。 在RAG系統中&#xff0c;單輪對話/單次查詢的場景較少&#xff0c;而多輪對話則是最常見的場景&…

【CSS-14.1-全局樣式表common.css】構建高效可維護的 common.css:現代前端CSS架構指南

在前端開發中&#xff0c;CSS管理一直是項目可維護性的關鍵挑戰。據統計&#xff0c;約35%的樣式問題源于缺乏統一的CSS架構規范。common.css&#xff08;或稱全局樣式表&#xff09;作為項目的基礎樣式層&#xff0c;能夠有效解決以下問題&#xff1a; 樣式碎片化&#xff1a…

laravel基礎:php artisan make:model Flight --all 詳解

在 Laravel 中執行命令: php artisan make:model Flight --all這個命令會為你創建與模型 Flight 相關的一整套文件結構。Laravel 的 Artisan 命令行工具是一個強大的代碼生成器,可以幫助你快速生成常見的應用組件。我們來詳細解析一下這個命令的各個部分以及它產生的效果。 …

poi java 刪除word的空白頁

開發的時候遇到的問題&#xff0c;特此記錄一下 使用Apache POI&#xff08;Java庫&#xff09;刪除Word文檔中的空白頁時&#xff0c;需針對不同場景處理。以下是具體實現方法和代碼示例&#xff1a; 基礎刪除&#xff08;段落/分頁符&#xff09;? 通過刪除多余段落標記或…

獲取Android應用日志教程

ADB&#xff0c;全稱為Android Debug Bridge&#xff0c;是Android開發中一個重要的命令行工具。它用于與Android設備進行通信&#xff0c;提供了多種功能來幫助開發者進行調試和應用管理。 一、環境準備 1.PC下載附件中的安裝包。 2.在設備上啟用開發者選項和 USB 調試 在安卓…

【Axum】Rust Web 高效構建:Axum 框架從入門到精通指南

目錄 一、環境準備與項目創建1.1 安裝 Rust 工具鏈1.2 創建項目并添加依賴 二、Axum 核心架構解析三、項目結構設計四、核心代碼實現4.1 應用入口 (src/main.rs)4.2 數據模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 認證服務 (src/services/auth.rs)4.5 用戶處理器 (…

康謀分享 | 基于多傳感器數據的自動駕駛仿真確定性驗證

目錄 01 引言 02 隨機性的前因與后果 03 確定性的驗證——以aiSim為例 1、傳感器選型與配置 2、場景與方法 3、驗證結果 04 總結 01 引言 隨著自動駕駛技術的飛速發展&#xff0c;仿真測試已成為替代成本高昂且充滿風險的道路測試的關鍵環節。它能夠在虛擬環境中模擬…

FASTAPI+VUE3平價商貿管理系統

一、項目概述 PJMall 是一個基于 FastAPI 構建的商城管理系統后端服務&#xff0c;提供商品管理、訂單處理、用戶認證等核心功能。系統采用分層架構設計&#xff0c;支持高并發訪問&#xff0c;適用于多角色用戶&#xff08;管理員、客戶、供應商&#xff09;。 核心特性 &a…

客服機器人知識庫怎么搭?智能客服機器人3種方案深度對比(含零售落地案例)

一、知識庫技術缺陷的權威數據 IDC 2025報告&#xff1a;89%企業因知識庫更新延遲導致智能客服機器人解決率下降40%&#xff0c;傳統規則引擎日均失效對話超2000次。 二、三大技術方案架構解析 1.LLM動態知識圖譜方案 基于Transformer架構實時抓取政策/價格數據 知識關聯度…

JavaScript 性能優化實戰:減少 DOM 操作引發的重排與重繪

在前端開發中&#xff0c;DOM 操作是 JavaScript 性能優化的核心痛點之一。頻繁的 DOM 操作會觸發瀏覽器的 重排&#xff08;Reflow&#xff09; 和 重繪&#xff08;Repaint&#xff09;&#xff0c;導致性能顯著下降。本文將深入分析這一瓶頸&#xff0c;并通過實際案例展示優…

力扣 hot100 Day33

24. 兩兩交換鏈表中的節點 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能進行節點交換&#xff09;。 //抄的 class Solution { public:ListNode* swapP…

DevExpress V25.1 版本更新,開啟控件AI新時代

WinForms Controls v25.1 AI 驅動的語義搜索 我們的 WinForms 數據網格、GridLookUpEdit 和 SearchLookUpEdit 控件具有增強的搜索體驗&#xff0c;使用戶能夠更快/更準確地在大型數據集中查找相關數據。與基于關鍵字的標準搜索不同&#xff0c;語義搜索利用自然語言處理 &…

【分層圖 虛擬節點】 P11327 [NOISG 2022 Finals] Voting Cities|普及+

本文涉及知識點 C圖論 P11327 [NOISG 2022 Finals] Voting Cities 題目描述 你所在的國家的國家主席 L o r d P o o t y \bf{Lord\ Pooty} Lord Pooty 將要退休了&#xff01;他希望選擇他的一個兒子作為他的繼承人&#xff0c;出于各方面因素的考慮&#xff0c;他決定進行…

Web3云服務商安全性怎么選

Web3安全之錨&#xff1a;為何阿里云是企業級應用的首選? 隨著Web3、去中心化金融&#xff08;DeFi&#xff09;和數字資產的浪潮席卷全球&#xff0c;無數開發者和企業涌入這個充滿機遇的新賽道。然而&#xff0c;機遇背后是同樣巨大的安全挑戰。從智能合約漏洞到大規模DDoS…

uniapp加上全局水印

文章目錄 一、效果圖二、創建watermark.js文件三、在main.js中引入四、運行 前言&#xff1a;uniapp頁面加水印你還在傻乎乎的一個個頁面加嗎&#xff0c;今天教你一招&#xff0c;一步到位 一、效果圖 未登錄效果 登錄后效果 二、創建watermark.js文件 這里的水印因為我…

thinkphp8.0七牛云直傳圖片

環境&#xff1a;tp8\php8.3; 服務器&#xff1a;centOS Stream 9; 場景&#xff1a;通過html頁面直傳七牛云服務器&#xff0c;速度更快&#xff1b; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta na…

Godot x openKylin 全國開發大賽正式啟動

從2023年開始&#xff0c;Godot Hub 每年舉辦一次 Godot Hub Festival 開發大賽&#xff0c;現已成為國內 Godot 社區規模最大的開發比賽。本屆 Godot Hub Festival 2025將與 OpenAtom openKylin 開源社區合作舉辦&#xff0c;定名為 Godot x openKylin 全國開發大賽&#xff0…