android 8.1 安全機制 — SEAndroid & SELinux

来源:https://www.cnblogs.com/linhaostudy/archive/2020/05/19/12915103.html

1. SELinux 背景知識 1.1 DAC 與 MAC 在 SELinux 出現之前,Linux 上的安全模型叫 DAC,全稱是 Discretionary Access Control,翻譯為自主訪問控制。 DAC 的核心思想很簡單,就是:進程理論上所擁有的許可權與執行它的用戶的許可權相同。比如, ...


1. SELinux 背景知識

1.1 DAC 與 MAC

在 SELinux 出現之前,Linux 上的安全模型叫 DAC,全稱是 Discretionary Access Control,翻譯為自主訪問控制。

DAC 的核心思想很簡單,就是:進程理論上所擁有的許可權與執行它的用戶的許可權相同。比如,以 root 用戶啟動 Browser,那麼 Browser 就有 root 用戶的許可權,在 Linux 系統上能幹任何事情。

顯然,DAD 管理太過寬鬆,只要想辦法在 Android 系統上獲取到 root 許可權就可以了。那麼 SELinux 是怎麼解決這個問題呢?在 DAC 之外,它設計了一種新的安全模型,叫 MAC(Mandatory Access Control),翻譯為強制訪問控制。

MAC 的理論也很簡單,任何進程想在 SELinux 系統上乾任何事情,都必須在《安全策略文件》中賦予許可權,凡是沒有出現在安全策略文件中的許可權,就不行。

關於 DAC 和 MAC,可以總結幾個知識點:

  1. Linux 系統先做 DAC 檢查。如果沒有通過 DAC 許可權檢查,則操作直接失敗。通過 DAC 檢查之後,再做 MAC 許可權檢查
  2. SELinux 有自己的一套規則來編寫安全策略文件,這套規則被稱之為 SELinux Policy 語言。

1.2 SEPolicy 語言

Linux中有兩種東西,一種死的(Inactive),一種活的(Active)。死的東西就是文件(Linux哲學,萬物皆文件。註意,萬不可狹義解釋為File),而活的東西就是進程。此處的 死 和 活 是一種比喻,映射到軟體層面的意思是:進程能發起動作,例如它能打開文件並操作它。而文件只能被進程操作。

根據 SELinux 規範,完整的 Secure Context 字元串為:user:role:type[:range]

1.2.1 進程的 Secure Context

在 SELinux 中,每種東西都會被賦予一個安全屬性,官方說法叫做 Security Context,Security Context 是一個字元串,主要由三個部分組成,例如 SEAndroid 中,進程的 Security Context 可通過 ps -Z 命令查看:

rk3288:/ $ ps -AZ
u:r:hal_wifi_supplicant_default:s0 wifi      1816     1   11388   6972 0                   0 S wpa_supplicant
u:r:platform_app:s0:c512,c768  u0_a14        1388   228 1612844  57396 0                   0 S android.ext.services
u:r:system_app:s0              system        1531   228 1669680 119364 0                   0 S com.android.gallery3d
u:r:kernel:s0                  root           582     2       0      0 0                   0 S [kworker/1:2]
u:r:radio:s0                   radio          594   228 1634876  89296 0                   0 S com.android.phone
u:r:system_app:s0              system         672   228 1686204 141716 0                   0 S com.android.settings
u:r:platform_app:s0:c512,c768  u0_a18         522   223 1721656 152116 0                   0 S com.android.systemui

上面的最左邊的一列就是進程的 Security Context,以第一個進程 wpa_supplicant 為例

u:r:hal_wifi_supplicant_default:s0

其中:

  • u 為 user 的意思,SEAndroid 中定義了一個 SELinux 用戶,值為 u
  • r 為 role 的意思,role 是角色之意,它是 SELinux 中一個比較高層次,更方便的許可權管理思路。簡單點說,一個 u 可以屬於多個 role,不同的 role 具有不同的許可權。
  • hal_wifi_supplicant_default 代表該進程所屬的 Domain 為 hal_wifi_supplicant_default。MAC(Mandatory Access Control)強制訪問控制 的基礎管理思路其實是 Type Enforcement Access Control(簡稱TEAC,一般用TE表示),對進程來說,Type 就是 Domain,比如 hal_wifi_supplicant_default 需要什麼許可權,都需要通過 allow 語句在 te 文件中進行說明。
  • s0 是 SELinux 為了滿足軍用和教育行業而設計的 Multi-Level Security(MLS)機制有關。簡單點說,MLS 將系統的進程和文件進行了分級,不同級別的資源需要對應級別的進程才能訪問

1.2.2 文件的 Secure Context

文件的 Secure Context 可以通過 ls -Z 來查看,如下

rk3288:/vendor/lib $ ls libOMX_Core.so -Z
u:object_r:vendor_file:s0 libOMX_Core.so
  • u:同樣是 user 之意,它代表創建這個文件的 SELinux user
  • object_r:文件是死的東西,它沒法扮演角色,所以在 SELinux 中,死的東西都用 object_r 來表示它的 role
  • vendor_file:type,和進程的 Domain 是一個意思,它表示 libOMX_Core.so 文件所屬的 Type 是 vendor_file
  • s0:MLS 的等級

1.3 TE 介紹

MAC 基本管理單位是 TEAC(Type Enforcement Accesc Control),然後是高一級別的 Role Based Accesc Control。RBAC 是基於 TE 的,而 TE 也是 SELinux 中最主要的部分。上面說的 allow 語句就是 TE 的範疇。

根據 SELinux 規範,完整的 SELinux 策略規則語句格式為:

allow domains types:classes permissions;

- Domain - 一個進程或一組進程的標簽。也稱為域類型,因為它只是指進程的類型。
- Type - 一個對象(例如,文件、套接字)或一組對象的標簽。
- Class - 要訪問的對象(例如,文件、套接字)的類型。
- Permission - 要執行的操作(例如,讀取、寫入)。

= allow : 允許主體對客體進行操作
= neverallow :拒絕主體對客體進行操作
= dontaudit : 表示不記錄某條違反規則的決策信息
= auditallow :記錄某項決策信息,通常 SElinux 只記錄失敗的信息,應用這條規則後會記錄成功的決策信息。

使用政策規則時將遵循的結構示例:

語句:
allow appdomain app_data_file:file rw_file_perms;

這表示所有應用域都可以讀取和寫入帶有 app_data_file 標簽的文件

—> 相關實例

1. SEAndroid 中的安全策略文件 policy.conf
# 允許 zygote 域中的進程向 init 域中的進程(Object Class 為 process)發送 sigchld 信號
allow zygote init:process sigchld;
2. # 允許 zygote 域中的進程 search 或 getattr 類型為 appdomain 的目錄。
# 註意,多個 perm_set 可用 {} 括起來
allow zygote appdomain:dir { getattr search };

3. # perm_set 語法比較奇特,前面有一個 ~ 號。
   # 它表示除了{entrypoint relabelto}之外,{chr_file #file}這兩個object_class所擁有的其他操作 
  allow unconfineddomain {fs_type dev_type file_type}:{ chr_file file }   \
  ~{entrypoint relabelto};

您的分享是我們最大的動力!

更多相關文章
  • --ORACLE表被鎖原因:具體操作某一個FORM界面,或者後臺資料庫操作某一個表時發現一直出於"假死"狀態, --可能是該表被某一用戶鎖定,導致其他用戶無法繼續操作 --查詢被鎖的表 select b.owner, b.object_name, a.session_id, a.locked_mod ...
  • 資料庫索引: 索引有單列索引複合索引之說 如何某表的某個欄位有主鍵約束和唯一性約束,則Oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。 建設原則: 1、索引應該經常建在Where 子句經常用到的列上。如果某個大表經常使用某個欄位進行查詢,並且檢索行數小於總表行數的 ...
  • 前言 數據科學部為想從事大數據方向學習的小伙伴總結了一下大數據的學習路線,供大家學習參考。由於大數據是一個基礎門檻較高就業前景較好的學習方向。所以打算學習大數據的小伙伴要加油啦! 大數據學習路線: 首先我要瞭解大數據處理流程: 第一步:數據收集 第二部:數據存儲 第三步:數據分析 第四步:數據應用 ... ...
  • 問題 經常在PG群里看到有人在問“為什麼我對錶賦予了許可權;但是還是不能訪問表” 解析 若你看懂德哥這篇文章PostgreSQL邏輯結構和許可權體系介紹;上面對你就不是困擾你的問題 解決這個問題很簡單;在解決之前;我們要先瞭解PostgreSQL的邏輯結構、以及與用戶之間的關係。盜用德哥的圖;來詮釋下邏 ...
  • #獲取會員的上二級 drop view if exists vwMemberL2Parent; create view vwMemberL2Parent as select m.id, m.parent_id, m.nickname, m.realname, m.avatar, m.mobile, ...
  • 這是大數據入門常識第二篇,主要討論大數據工作的方向問題。第一篇沒看的同學可以補一下: "3000字長文教你大數據該怎麼學!" 有不少剛入門的同學在後臺會問類似這樣的問題 看招聘網站上,大數據相關的方向好多,不知道自己適合哪個怎麼辦? 關註我公眾號的同學應該有不少是剛入門的,所以我把內容好好地整理總結 ...
  • IsEqual與Hash個人理解 isEqual NSObject類的實例方法: 主要是根據對象的記憶體地址來判斷兩個對象是否相等,這裡與 效果相同。 isEqualToString (BOOL)isEqualToString:(NSString )aString 是NSString類的實例方法,它主 ...
  • 希望通過這篇文章從頭到尾梳理一下 iOS 中涉及到渲染原理相關的內容,會先從電腦渲染原理講起,慢慢說道 iOS 的渲染原理和框架,最後再深入探討一下離屏渲染。 希望能對大家有點幫助~ 1. 電腦渲染原理 CPU 與 GPU 的架構 對於現代電腦系統,簡單來說可以大概視作三層架構:硬體、操作系統 ...
一周排行
  • 文章篇幅較長,閱讀完大概20min,建議收藏閱讀, 讀完會有收穫。歡迎點贊關註 原文鏈接:https://www.softwaretestinghelp.com/types-of-software-testing/ 有多少軟體測試類型呢? 我們作為測試人員瞭解很多種不同的軟體測試類型,例如功能測試( ...
  • 過場CG: 接到公司領導的文件指示,“小熊”需要在6月底去海外執行一個行動代號為【定時任務】的營救計劃,這個計劃關係到公司某個項目的生死(數據安全漏洞),作戰部擬定兩個作戰方案: 方案一:使用務定時任務框架quartz; 方案二:使用windows Service服務。 最終的作戰方案為:兩者配套使 ...
  • 為什麼編寫TaskSchedulerEx類? 因為.NET預設線程池只有一個線程池,如果某個批量任務一直占著大量線程,甚至耗盡預設線程池,則會嚴重影響應用程式域中其它任務或批量任務的性能。 特點: 1、使用獨立線程池,線程池中線程分為核心線程和輔助線程,輔助線程會動態增加和釋放,且匯流排程數不大於參數 ...
  • 前幾天,公眾號後臺有朋友在問Core的中間件,所以專門抽時間整理了這樣一篇文章。 一、前言 中間件(Middleware)最初是一個機械上的概念,說的是兩個不同的運動結構中間的連接件。後來這個概念延伸到軟體行業,大家把應用操作系統和電腦硬體之間過渡的軟體或系統稱之為中間件,比方驅動程式,就是一個典型 ...
  • 參考文檔: https://www.cnblogs.com/liaods/p/10101513.html https://www.cnblogs.com/zyz-Notes/p/12030281.html 本示例使用MVC項目做演示(不推薦,推薦直接用WebAPI),框架版本使用 4.6.2 為了支 ...
  • 引用NModbus 在NuGet搜索NModbus,添加引用。 封裝ModbusTcp類 public class ModbusTCP { private ModbusFactory modbusFactory; private IModbusMaster master; private TcpCl ...
  • 系列文章 基於 abp vNext 和 .NET Core 開發博客項目 - 使用 abp cli 搭建項目 基於 abp vNext 和 .NET Core 開發博客項目 - 給項目瘦身,讓它跑起來 基於 abp vNext 和 .NET Core 開發博客項目 - 完善與美化,Swagger登場 ...
  • Microsoft.AspNetCore.Mvc.Versioning //引入程式集 .net core 下麵api的版本控製作用不需要多說,可以查閱https://www.cnblogs.com/dc20181010/p/11313738.html 普通的版本控制一般是通過鏈接、header此類 ...
  • 結合 AOP 輕鬆處理事件發佈處理日誌 Intro 前段時間,實現了 EventBus 以及 EventQueue 基於 Event 的事件處理,但是沒有做日誌(EventLog)相關的部分,原本想增加兩個介面, 處理事件發佈日誌和事件處理日誌,最近用了 AOP 的思想處理了 EntityFrame ...
  • 什麼是sam 轉換 Single Abstract Method 實際上這是java8中提出的概念,你就把他理解為是一個方法的介面的就可以了 看一下我們每天都在使用的線程池 ExecutorService executorService= Executors.newScheduledThreadPo ...