JAVA層的權限與SELinux的關系

Java 層權限是應用程序級別的“門禁卡”,而 SELinux 是系統級別的“防火墻規則和強制訪問控制”。即使你擁有進入大樓的“門禁卡”(Java 權限),如果“防火墻規則”(SELinux 策略)不允許你的進程與目標服務或資源通信,訪問依然會被拒絕

一. 職責與層面的根本區別

為了理解它們的關系,首先要明確它們各自負責的層面:

特性Java 層權限 (DAC - 自主訪問控制)SELinux (MAC - 強制訪問控制)
控制層面應用框架層 (Application Framework)Linux 內核層 (Linux Kernel)
控制對象應用程序 (Application)進程 (Process)
控制邏輯這個應用有沒有被用戶授予訪問相機/位置的權限?”這個進程(屬于某個域)是否被允許向那個進程(屬于某個域)發送 Binder 消息,或者訪問那個文件(屬于某個類型)?”
決策者用戶(在運行時彈窗點擊)系統安全策略(預先由 Google/OEM 定義,嚴格強制執行)
靈活性用戶可動態授予和撤銷策略在系統編譯時或啟動時加載,普通用戶和應用無法更改
目標保護用戶隱私和數據(如聯系人、短信、位置)保護系統完整性,遏制惡意軟件破壞系統、提升權限、攻擊其他進程

二. 工作流程:它們如何協同與分工

讓我們用一個經典的例子來說明:一個擁有?android.permission.CAMERA?權限的應用嘗試打開相機

第 1 步:Java 層權限檢查 (框架層)

1)應用調用?Camera.open()

2)這個調用會通過 Binder IPC 傳遞到系統的?CameraService

3)CameraService?在它的 Binder 方法中,會執行代碼檢查:

int pid = Binder.getCallingPid();
int uid = Binder.getCallingUid();
if (checkPermission(android.Manifest.permission.CAMERA, pid, uid) != PERMISSION_GRANTED) {// 如果沒有權限,拋出安全異常throw new SecurityException("Permission denied");
}

4)這個檢查會查詢?PackageManagerService,確認調用者的 UID 是否已被授予?CAMERA?權限

5)如果這里失敗,流程結束,拋出?SecurityException。這是第一道關卡

第 2 步:SELinux 權限檢查 (內核層)

6)假設應用通過了第一道關卡,CameraService?現在嘗試執行它的任務:打開底層的相機硬件設備(例如?/dev/video0

7)CameraService?進程(例如,它的 SELinux 域是?cameraserver)需要向內核發起?open?系統調用來操作?/dev/video0?這個設備文件

8)內核中的 SELinux 安全服務器(Security Server)會介入檢查:
? ? ○?源上下文 (Source Context): 誰發起操作? ->?cameraserver?進程(域?cameraserver
? ? ○?目標上下文 (Target Context): 對什么進行操作? -> 文件?/dev/video0(類型?camera_device
? ? ○?操作類別 (Class): 什么操作? ->?chr_file?(字符設備文件)
? ? ○?權限 (Permission): 具體權限? ->?open,?read,?write

9)SELinux 會查詢預先加載的策略規則,看是否有這樣一條允許規則:

# 這是策略文件中的一條規則示例
allow cameraserver camera_device:chr_file { open read write };

10)如果策略中存在這條?allow?規則,訪問被允許,相機成功打開。如果不存在,即使?CameraService?想這么做,內核也會直接返回?Permission Denied(權限不足)的錯誤,并在 logcat 中打印一條?avc: denied?的警告。這是第二道,也是最終的關卡

三. 為什么需要兩層控制?—— 深度防御

這種設計提供了巨大的安全優勢:

1)遏制漏洞 (Containment)
? ? ○?假設?CameraService?存在一個代碼漏洞,允許一個沒有 Java 層?CAMERA?權限的應用繞過檢查直接調用其內部函數。如果沒有 SELinux,這個漏洞就可能被利用來非法使用相機
? ? ○?有了 SELinux: 即使攻擊者利用了該漏洞,發起操作的進程(例如一個被入侵的?untrusted_app?進程)試圖直接與?camera_device?通信,SELinux 策略也絕對不允許?untrusted_app?域直接訪問?camera_device?類型。漏洞被有效遏制,系統依然安全

2)保護系統服務自身
? ? ○?SELinux 不僅是限制應用,也限制系統服務。例如,策略規則會明確規定?cameraserver?域只能訪問相機設備、它的配置文件和一些必要的庫,而不能去訪問網絡、用戶的短信數據等。這極大減少了系統服務被攻破后造成的破壞范圍

3)權限的明確性
? ? ○?Java 權限檢查是“黑盒”的,它只問“有沒有權限”,不管“你要用它做什么”
? ? ○?SELinux 的策略是極其明確的:“A 域的進程可以對 B 類型的文件進行 C 操作”。這種粒度是 Java 層無法提供的

四. 從日志看關系:avc: denied

當 SELinux 拒絕一個操作時,你會在?logcat?中看到類似這樣的信息:

avc: denied  { open } for  pid=1234 comm="cameraserver" path="/dev/video0" dev="tmpfs" ino=5678 scontext=u:r:cameraserver:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0

這條日志是理解 SELinux 的鑰匙,它清晰地告訴我們:

  • scontext=u:r:cameraserver:s0: 源上下文是?cameraserver?域
  • tcontext=u:object_r:camera_device:s0: 目標上下文是?camera_device?類型
  • { open }?和?tclass=chr_file: 試圖進行的操作是“打開”一個“字符設備文件”
  • denied: 因為策略中沒有對應規則,所以被拒絕了

結論

Java 層申請的權限和 SELinux 是互補且正交的安全機制:

  • Java 權限高級別、面向用戶的授權模型,管理應用能否訪問用戶數據敏感功能
  • SELinux?是低級別、面向系統的強制訪問模型,管理進程能否訪問系統資源和其他進程

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

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

相關文章

Screen 三步上手

好的,這是給同事的簡潔版說明:Screen 三步上手 開新窗口:干活前先開個帶名字的窗口,不怕斷連。 screen -S 任務名看所有窗口:隨時查看都有哪些任務在后臺跑。 screen -ls重回窗口:斷連后重新登錄&#xff0…

flink 偽代碼

import java.util.*; import java.util.concurrent.*;// 核心接口定義 interface StreamOperator {void open();void processElement(Object element);void close(); }interface SourceFunction extends StreamOperator {void run(SourceContext ctx); }interface SinkFunction…

一招快速識別你的電腦是機械硬盤還是固態硬盤

你是否經常覺得電腦開機慢、軟件打開卡頓?其中一個關鍵原因,可能就在于你使用的是機械硬盤(HDD)還是固態硬盤(SSD)。固態硬盤讀寫速度快,能顯著提升系統響應速度;而機械硬盤雖然容量…

52核心52線程,Intel下一代CPU憋了個大的

被逼急了的 Intel,可能正在憋大招!如大伙兒所見,Intel 這兩年日子已經不能用「慘」來形容。其過去引以為傲的 PC 處理器,特別是高性能桌面處理器領域,如今算是徹底被 AMD 打懵了。無他,己方產品是連年擺爛&…

【LeetCode 熱題 100】1. 兩數之和——(解法二)哈希表

Problem: 1. 兩數之和 文章目錄整體思路完整代碼時空復雜度時間復雜度:O(N)空間復雜度:O(N)整體思路 這段代碼旨在高效地解決 “兩數之和” 問題。與 O(N^2) 的暴力枚舉法相比,此版本采用了一種經典的 “空間換時間” 策略,利用 …

MySQL主從同步--主從復制進階

MySQL支持一臺主庫同時向多臺從庫進行復制,從庫同時也可以作為其他從服務器的主庫,實現鏈狀復制。1、MySQL支持的binlog二進制日志復制類型- 基于語句(statement)的復制在主服務器上執行SQL語句,在從服務器上執行同樣的…

WPF外部打開html文件

注意:這是一份提供WPF外部瀏覽器打開html的方法,而不是WPF內部嵌入html 需要通過瀏覽器打開,否則無法使用地址欄拼接參數的形式操作html 下面是打開html的方法↓string localHtmlPath "C:\Users\pangb\Downloads\Help\幫助文檔 - 副本.…

Go初級之十:錯誤處理與程序健壯性

Go初級之十:錯誤處理與程序健壯性為什么選這個主題? 錯誤處理是 Go 語言中一個非常獨特且重要的設計哲學。它體現了 Go 的“顯式錯誤處理”思想,與其它語言(如 Java/Python)的異常機制不同。在實際開發中,幾…

Xsens解碼人形機器人訓練的語言

隨著人形機器人在現實世界的應用中變得越來越普遍,了解實現其類似人類運動的技術至關重要。在Xsens我們滿懷熱情地探索這一領域,致力于為人形機器人訓練開發最佳的動作捕捉解決方案。為了幫助您更好地理解所遇到的術語,我們創建了一份概述&am…

25年下載chromedriver.140

前提: 因為我需要用seleium模擬瀏覽器獲取數據,需要用到這個chromedriver 驅動。 1.chrome瀏覽器版本號 先檢查你的chrome 的版本號是多少,就下載對應的 chromedriver 【三個點】--->【幫助】------>【關于 Google chrome 】 我的版本…

深度學習玩游戲, 模型玩游戲,大模型+游戲 llm+game, 機器學習玩游戲,人工智能游戲陪伴,模型陪玩游戲

1. 論文地址 Think in Games: Learning to Reason in Games via Reinforcement Learning with Large Language Models 2. 中文: Think in Games:做一個在王者榮耀中會玩和思考的Agent 3. 我記得幾年前,相關文章還是使用dqn算法。玩雅利達小…

并查集|棧

lc1668不能直接跳class Solution { public:int maxRepeating(string sequence, string word) {int k 0, n sequence.size(), wn word.size(), t 0;for (int i 0; i < n - wn; i) {if (sequence.substr(i, wn) word) {t 1;int j i wn;while (j wn < n &&…

問題三ai思路

好的&#xff0c;我把“路線A&#xff1a;分類建模擇時”的代碼按功能分段給出&#xff0c;并為每段配上簡明解釋。你可以將這些段落依次粘貼到已完成清洗后的 df 變量之后直接運行。 0. 依賴導入&#xff08;一次即可&#xff09; 作用&#xff1a;導入所需庫&#xff1b;后續…

Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦

集合1 Collection接口1.1 集合概述集合是一個裝對象的容器。集合中只能存放引用數據類型的對象。集合中有一些大小是固定的&#xff0c;有一些是不固定的。有一些是有序的&#xff0c;有些是無序的。有些可以有重復元素&#xff0c;有一些不可以有重復元素1.2 集合常用方法publ…

硬件基礎:串口通信

數據傳輸方式&#xff08;按位傳輸方式&#xff09;并行通信通過多條數據線同時傳輸多個數據位&#xff0c;速度較快但成本高&#xff0c;抗干擾能力弱&#xff0c;適用于短距離通信&#xff0c;如早期的打印機接口。串行通信通過單條或少數數據線逐位傳輸數據&#xff0c;線路…

從Java全棧到云原生:一場技術深度對話

從Java全棧到云原生&#xff1a;一場技術深度對話 面試官與應聘者互動記錄 面試官&#xff1a;你好&#xff0c;歡迎來到我們的面試。先簡單介紹一下你自己吧。 應聘者&#xff1a;您好&#xff0c;我叫李明&#xff0c;28歲&#xff0c;碩士學歷&#xff0c;有5年Java全棧開發…

158-EEMD-HHT算法

158-EEMD-HHT#EMD #希爾伯特變換-&#xff08;Hilbert- Huang Transform&#xff0c;HHT&#xff09;#集合經驗模態分解 EEMD #時頻分析 #邊際譜代碼描述1、利用 集合經驗模態分解&#xff08;EEMD&#xff09;方法對信號進行分解&#xff0c;得到模態分量 IMF&#xff1b;2、計…

C#開發中的 token

C# 開發中的 Token 詳解 C# 開發中的 Token 詳解與示例 1. CancellationToken - 異步取消令牌 示例 1:基礎取消機制 示例 2:Web API 中的請求取消 2. JWT Token - 身份驗證令牌 示例 1:JWT Token 生成與驗證 示例 2:ASP.NET Core JWT 認證配置 3. Access Token - API 訪問令…

旅游安全急救實訓室助力應急處置技能實戰化

隨著旅游行業的快速發展&#xff0c;游客安全需求日益突出&#xff0c;應急處置能力已成為旅游服務人才的核心素養之一。在中職教育旅游服務與管理專業中&#xff0c;旅游安全急救實訓室作為關鍵教學場所&#xff0c;正發揮著不可替代的作用。一、旅游安全急救實訓室的建設背景…

分布式微服務--ZooKeeper的客戶端常用命令 Java API 操作

一、ZooKeeper 客戶端常用命令 1. 啟動與退出 bin/zkCli.sh -server 127.0.0.1:2181 # 連接客戶端 quit # 退出客戶端2. 節點操作 # 查看子節點 ls / ls -s / ls /app# 查看節點詳細信息 ls2 /app stat /app# 創建節點 create /node1 "…