HQX SELinux 權限問題分析與解決

Google自Android 5.0起強制實施的SELinux安全子系統,通過最小權限原則顯著提升了系統安全性,但這也導致開發過程中頻繁出現權限拒絕問題。值得注意的是,即便設備已獲取root權限,SELinux的強制訪問控制機制仍會限制部分敏感操作。
本文將聚焦實戰場景,通過典型錯誤日志解析,系統化講解如何診斷并解決SELinux權限異常問題。

獲取selinux配置

# getenforce
Enforcing

cmdline:

msmnile_gvmq:/ # cat /proc/cmdline
cgroup_disable=pressure androidboot.verifiedbootstate=orange androidboot.vbmeta.device=/dev/vbmeta androidboot.vbmeta.avb_version=1.1 androidboot.vbmeta.device_state=unlocked androidboot.vbmeta.hash_alg=sha256 androidboot.vbmeta.size=3840 androidboot.vbmeta.digest=aaa6d414b8059e251f9aaf9cd950350c10d51acd494449855bcbbe925c58f052 androidboot.vbmeta.invalidate_on_error=yes androidboot.veritymode=enforcing console=hvc0,115200 debug user_debug=31 loglevel=9 print-fatal-signals=1 androidboot.console=ttyAMA0 androidboot.hardware=qcom androidboot.selinux=enforcing androidboot.memcg=1 init=/init swiotlb=4096 androidboot.usbcontroller=a600000.dwc3 androidboot.recover_usb=1 firmware_class.path=/vendor/firmware_mnt/image kpti=0 msm_cfg.cfg_sel=1 pcie_ports=compat androidboot.dtbo_idx=1 buildvariant=userdebug  androidboot.serialno=2e036b5d  androidboot.force_normal_boot=1  androidboot.fstab_suffix=ufs.qcom

Notes:
enforcing mode: 限制訪問
permissive mode: 只審查權限,不限制

臨時關閉selinux

# setenforce --help
usage: setenforce [enforcing|permissive|1|0]Sets whether SELinux is enforcing (1) or permissive (0).
setenforce 0 (臨時關閉 SELinux 的限制訪問模式)

永久關閉selinux

  1. BoardConfig
    File: device/rockchip/common/BoardConfig.mk
BOARD_SELINUX_ENFORCING ?= false
  1. selinux.cpp
    File: system/core/init/selinux.cpp
diff --git a/init/selinux.cpp b/init/selinux.cpp
index 5a0255acd..db22d7b61 100755
--- a/init/selinux.cpp
+++ b/init/selinux.cpp
@@ -104,6 +104,7 @@ EnforcingStatus StatusFromCmdline() {}bool IsEnforcing() {
+    return false;if (ALLOW_PERMISSIVE_SELINUX) {return StatusFromCmdline() == SELINUX_ENFORCING;}

or:

diff --git a/init/selinux.cpp b/init/selinux.cpp
index 5a0255acd..42608a18b 100755
--- a/init/selinux.cpp
+++ b/init/selinux.cpp
@@ -476,6 +476,7 @@ void SelinuxInitialize() {bool kernel_enforcing = (security_getenforce() == 1);bool is_enforcing = IsEnforcing();
+       is_enforcing = 0;if (kernel_enforcing != is_enforcing) {if (security_setenforce(is_enforcing)) {PLOG(FATAL) << "security_setenforce(" << (is_enforcing ? "true" : "false")
  1. Boardconfig.mk
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -194,7 +194,7 @@ BOARD_VENDOR_KERNEL_MODULES += $(shell ls $(KERNEL_MODULES_OUT)/*.ko)TARGET_USES_ION := trueTARGET_USES_NEW_ION_API :=trueTARGET_USES_QCOM_BSP := false
-BOARD_KERNEL_CMDLINE := console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video
=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 swiotlb=4096 firmware_class.path=/vendor/firmware_mnt/image loop.max_part=7androidboot.usbcontroller=a600000.dwc3 androidboot.recover_usb=1 androidboot.selinux=enforcing hibernate=nocompress noswap_randomize pcie_ports=compat kpti=
0
+BOARD_KERNEL_CMDLINE := console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video
=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 swiotlb=4096 firmware_class.path=/vendor/firmware_mnt/image loop.max_part=7androidboot.usbcontroller=a600000.dwc3 androidboot.recover_usb=1 androidboot.selinux=permissive hibernate=nocompress noswap_randomize pcie_ports=compat kpti
=0

androidboot.selinux=enforcing --> androidboot.selinux=permissive

  1. system.build.tmpl

File: apps/qnx_ap/target/hypervisor/host/build_files/system.build.tmpl

-cmdline "console=ttyAMA0 earlycon=pl011,0x1c090000 debug user_debug=31 loglevel=9 print-fatal-signals=1 no_console_suspend androidboot.console=ttyAMA0       androidboot.hardware=qcom androidboot.selinux=enforcing androidboot.memcg=1 androidboot.bootdevice=/dev/disk/system_b swiotlb=2048 gvmip=192.168.1.3        androidboot.serialno="$env{SERIAL_NO\}" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f rootwait skip_initramfs=1 ro init=/init root=/dev/dm-0       dm=\\\"system none ro,0 1 android-verity /dev/vda\\\""+cmdline "console=ttyAMA0 earlycon=pl011,0x1c090000 debug user_debug=31 loglevel=9 print-fatal-signals=1 no_console_suspend androidboot.console=ttyAMA0       androidboot.hardware=qcom androidboot.selinux=permissive androidboot.memcg=1 androidboot.bootdevice=/dev/disk/system_b swiotlb=2048 gvmip=192.168.1.3        androidboot.serialno="$env{SERIAL_NO\}" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f rootwait skip_initramfs=1 ro init=/init root=/dev/dm-0       dm=\\\"system none ro,0 1 android-verity /dev/vda\\\""

androidboot.selinux=enforcing --> androidboot.selinux=permissive

  1. Kernel 中關閉selinux
    config
CONFIG_SECURITY_SELINUX=y

關閉以上配置。

可通過以下命令確實kernel中配置:

# zcat /proc/config.gz | grep SELINUX
CONFIG_SECURITY_SELINUX=y
  1. Others
    某些平臺中,可能需要修改devicetree中chosen字段

增加SElinux權限

  1. 通過以下命令獲取selinux
logcat | grep audit > selinux.txt
or:
dmesg | grep audit > selinux.txt
cat /proc/kmsg | grep audit 

Example:

type=1400 audit(0.0:29830): avc:  denied  { getattr } for property=ro.ril.ecclist pid=1 uid=0 gid=0 scontext=u:r:test_init:s0 tcontext=u:object_r:radio_prop:s0 tclass=property_service permissive=0
  1. Log解析
    avc: denied { 操作權限 } for pid=7201 comm=“進程名” scontext=u:r:源類型:s0 tcontext=u:r:目標類型:s0 tclass=訪問類型 permissive=0

#============= 源類型 ==============
allow 源類型 目標類型:訪問類型 操作權限;
完整的意思是: "源類型"進程對"目標類型"的"訪問類型"缺少 “操作權限”

  1. 手動添加權限
    File path:
#============= test_init ==============
allow test_init radio_prop:property_service getattr;
  1. 工具添加權限
    使用 audit2allow 工具解析avc.txt。
    在aosp源碼中執行如下命令:
source ./build/envsetup.sh
lunch msmnile_au-userdebug
audit2allow -i avc.txt 

解析出來如下圖所示:

#============= test_init ==============
allow test_init automotive_display_service:dir getattr;
allow test_init hal_broadcastradio_default:dir getattr;
allow test_init network_stack:dir getattr;
allow test_init platform_app:dir getattr;
allow test_init secure_element:dir getattr;

上述步驟解析完了報出的權限問題,接下來需要把,這些權限添加到對應的 te 文件中,直接將上述的四條 allow xxx 拷貝到 te即可。
絕大多數的情況下 avc denied的報錯不會一次性的全部暴露出來,要解決完一個,才會報下一個問題。
比如:一個進程需要讀、寫和打開的權限,但是一般情況下,可能會先報其中一個權限缺失,等你加了這個權限后,才會報另一個權限缺失,以此類推。

  1. te文件路徑
    Path:
device/qcom/sepolicy_vndr;
device/qcom/sepolicy;
/system/sepolicy

盡量只修改device目錄下的te文件,修改system目錄下te會影響Google CTS測試。

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

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

相關文章

SpringBoot集成Kafka實戰應用

目錄 使用Kafka-Client實現消息收發 引入依賴 發送端&#xff1a; 消費端&#xff1a; SpringBoot集成 引入maven依賴 消費端 在上一篇我們深度解析了Kafka的運行操作原理以及集群消息消費機制等&#xff0c;請點擊下方鏈接獲取 Kafka消息隊列深度解析與實戰指南 本篇我…

單元測試總結2

1、重載和重寫的區別01、定義不同&#xff1a;重載是在同一個類中定義多個方法名相同但參數列表不同的方法&#xff1b;重寫是子類對父類中同名同參數列表的方法進行重新實現02、范圍不同&#xff1a;重載發生在同一個類中&#xff0c;重寫發生在子類和父類中03、參數要求不同&…

Wi-Fi技術——MAC特性

有線和無線網絡在數據鏈路層的特性存在差異&#xff0c;具體為&#xff1a; CSMA/CD 用于有線網絡&#xff0c;通過檢測和處理沖突來維持網絡的穩定性。CSMA/CA 用于無線網絡&#xff0c;強調沖突的預防&#xff0c;以應對無線信道共享的挑戰 1 有線網 CSMA/CD 有線網 CSMA/…

OpenHarmony 分布式感知中樞深度拆解:MSDP 框架從 0 到 1 的實戰指南

MSDP設備狀態感知框架技術開發文檔 1. 系統概述 1.1 框架定位 MSDP (Multi-Sensor Data Processing) 設備狀態感知框架是OpenHarmony系統中負責設備狀態識別和分發的核心服務,基于多傳感器融合技術,為系統應用提供設備狀態感知能力。 1.2 核心功能 靜止狀態識別:基于加速…

圖像 OSD層數據 顯示--OSD LOGO單色黑色顯示,按區域大小申請MMZ內存的優缺點分析

在監控攝像機、嵌入式顯示設備等場景中,OSD(On-Screen Display,屏幕顯示)LOGO 常需單色黑色顯示,且按區域大小申請 MMZ(Multi-Media Zone,多媒體專用內存)內存,該方案的優缺點需結合硬件資源、顯示效率、功能適配性等維度綜合分析,具體如下: 一、核心優勢:針對性優…

徐真妍最新雜志封面大片曝光,探索鏡頭下的多面魅力

近日&#xff0c;青年演員徐真妍拍攝的一組大片正式曝光。這組以 “森林系” 為主題的大片&#xff0c;登上時尚雜志《慵懶LAZY DAYS》8-9月刊封面。融合了優雅與現代先鋒感&#xff0c;展現了徐真妍甜美溫婉的表現力。鏡頭前的她&#xff0c;在多種風格間自如切換&#xff0c;…

廣度優先搜索(BFS, Breadth-First Search)

好的&#xff0c;我給你講 廣度優先搜索&#xff08;BFS, Breadth-First Search&#xff09;&#xff0c;并配一個直觀例子。1?? 什么是廣度優先廣度優先搜索的特點&#xff1a;按層訪問&#xff1a;先訪問根節點&#xff0c;然后訪問它的直接子節點&#xff0c;再訪問子節點…

GD32入門到實戰22--紅外NEC通信協議

ir_drv.c紅外傳輸協議地位在前&#xff0c;所以我們可以這樣保存數據到數組假使接收到1就>>1再|0x80&#xff0c;如果接收到0就>>1新建紅外驅動層代碼ir_drv.c#include <stdio.h> #include "gd32f30x.h" #include <stdbool.h> static voi…

zkML-JOLT——更快的ZK隱私機器學習:Sumcheck +Lookup

1. 引言 ICME團隊開源的zkML項目&#xff1a; https://github.com/ICME-Lab/jolt-atlas&#xff08;Rust&#xff09; zkML-JOLT&#xff08;JOLT ‘Atlas’&#xff09;構建在a16z Crypto團隊的JOLT研究和實現基礎上&#xff0c;其性能比其他zkML項目快了3到7倍。 a16z Cr…

【大模型記憶-Mem0詳解-2】系統架構

概述 Mem0 實現了雙架構系統&#xff0c;通過兩種主要部署模型為 AI 應用提供智能內存能力&#xff1a; 托管平臺 &#xff1a;通過 MemoryClient 和 AsyncMemoryClient 類訪問的托管服務開源 &#xff1a;以 Memory 類為中心的自托管組件&#xff0c;具有可插拔提供程序 此架構…

[Java]PTA:jmu-Java-01入門-取數字浮點數

本題目要求讀入若干以回車結束的字符串表示的整數或者浮點數&#xff0c;然后將每個數中的所有數字全部加總求和。輸入格式:每行一個整數或者浮點數。保證在浮點數范圍內。輸出格式:整數或者浮點數中的數字之和。題目保證和在整型范圍內。輸入樣例:-123.01 234輸出樣例:7 9代碼…

FFmpeg音視頻處理解決方案

核心組件&#xff1a; ffmpeg&#xff1a;主要的命令行工具&#xff0c;用于轉碼、轉換格式等 ffprobe&#xff1a;用于分析多媒體文件信息的工具 ffplay&#xff1a;簡單的媒體播放器 主要功能&#xff1a; ? 格式轉換&#xff08;轉碼&#xff09; ? 視頻裁剪、合并 ? 調整…

機器學習回顧——決策樹詳解

決策樹基礎概念與應用詳解1. 決策樹基礎概念1.1 什么是決策樹決策樹是一種樹形結構的預測模型&#xff0c;其核心思想是通過一系列規則對數據進行遞歸劃分。它模擬人類決策過程&#xff0c;廣泛應用于分類和回歸任務。具體結構包括&#xff1a;內部節點&#xff1a;表示對某個特…

Linux開發必備:yum/vim/gcc/make全攻略

目錄 1.學習yum、apt?具&#xff0c;進?軟件安裝 1-1 什么是軟件包 1-2 yum/apt具體操作 2. 編輯器Vim 2-1 Linux編輯器-vim的引入 2-2 vim的基本概念 2-3 vim的基本操作 2-4 vim正常模式命令集 2-5 vim末?模式命令集 3. 編譯器gcc/g 3-1 背景知識 3-2 gcc編譯選…

【Linux系統】萬字解析,進程間的信號

前言&#xff1a; 上文我們講到了&#xff0c;進程間通信的命名管道與共享內存&#xff1a;【Linux系統】命名管道與共享內存-CSDN博客?????? 本文我們來講一講&#xff0c;進程的信號問題 點個關注&#xff01; 信號概念 信號是OS發送給進程的異步機制&#xff01;所謂異…

AI時代SEO關鍵詞實戰解析

內容概要 隨著人工智能技術深度融入搜索引擎的運行機制&#xff0c;傳統的SEO關鍵詞研究方法正經歷著根本性的變革。本文聚焦于AI時代背景下&#xff0c;如何利用智能化的策略精準定位目標用戶&#xff0c;實現搜索可見度的實質性躍升。我們將深入探討AI技術如何革新關鍵詞研究…

Spring Boot + Spring MVC 項目結構

下面一個既能返回 JSP 頁面&#xff0c;又能提供 JSON API 的 Spring Boot Spring MVC 項目結構&#xff0c;這樣你就能同時用到 Controller 和 RestController 的優勢。 &#x1f3d7; 項目結構 springboot-mvc-mixed/ ├── src/main/java/com/example/demo/ │ ├── …

通俗易懂的講解下Ceph的存儲原理

Ceph存儲原理解析 要理解 Ceph 的存儲原理&#xff0c;我們可以用一個 “分布式倉庫” 的比喻來拆解 —— 把 Ceph 想象成一個由多個 “倉庫管理員”&#xff08;硬件節點&#xff09;共同打理的大型倉庫&#xff0c;能高效存儲、管理海量貨物&#xff08;數據&#xff09;&…

軟件測試小結(1)

一、什么是測試&#xff1f;1.1 生活中常見的測試例如去商場買衣服&#xff1a;①、選擇一件符合審美的衣服 -> 外觀測試&#xff1b;②、穿上身上試試是否合身 -> 試穿測試&#xff1b;③、 看看衣服的材料是否純棉 -> 材料測試&#xff1b;④、 詢問衣服的價格 ->…

Python未來3-5年技術發展趨勢分析:從AI到Web的全方位演進

Python作為全球最流行的編程語言之一&#xff0c;在開發者社區中占據核心地位。其簡潔語法、豐富庫生態和跨領域適用性&#xff0c;使其在AI、Web開發、數據科學等領域持續領先。本文基于當前技術演進趨勢&#xff08;如2023-2024年的開源項目、社區討論和行業報告&#xff09;…