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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;…