SeLinux 的编译逻辑

在Android 11 init进程对Selinux的处理一文中,我们知道,在init进程对Selinux的处理过程中,会将precompiled_sepolicy或者动态编译相关目录下的cil文件得到的compiled_sepolicy写入给内核。那么precompiled_sepolicy文件和cil文件是从哪里来的呢?

Selinux的编译逻辑基本都是在system\sepolicy\Android.mk文件中

首先关注Android.mk中的几个宏

PLAT_PUBLIC_POLICY := system/sepolicy/public
PLAT_PRIVATE_POLICY := system/sepolicy/private
PLAT_VENDOR_POLICY := system/sepolicy/vendor
SYSTEM_EXT_PUBLIC_POLICY := $(BOARD_PLAT_PUBLIC_SEPOLICY_DIR)
SYSTEM_EXT_PRIVATE_POLICY := $(BOARD_PLAT_PRIVATE_SEPOLICY_DIR)
PRODUCT_PUBLIC_POLICY := $(PRODUCT_PUBLIC_SEPOLICY_DIRS)
PRODUCT_PRIVATE_POLICY := $(PRODUCT_PRIVATE_SEPOLICY_DIRS)
BOARD_SEPOLICY_DIRS  

其中BOARD_SEPOLICY_DIRS 可以由厂商自定义路径,这样厂商自己的文件也会加到Selinux的编译系统中。比如

BOARD_SEPOLICY_DIRS ?= \
    device/rockchip/common/sepolicy/vendor

precompiled_sepolicy的生成过程

#################################
include $(CLEAR_VARS)

LOCAL_MODULE := precompiled_sepolicy
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_TAGS := optional
LOCAL_PROPRIETARY_MODULE := true

ifeq ($(BOARD_USES_ODMIMAGE),true)
LOCAL_MODULE_PATH := $(TARGET_OUT_ODM)/etc/selinux
else
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/selinux
endif

如果有odm分区,目标文件precompiled_sepolicy就放在odm/etc/selinux目录下,否则就放在vendor/etc/selinux目录。

$(LOCAL_BUILT_MODULE): PRIVATE_CIL_FILES := $(all_cil_files)
$(LOCAL_BUILT_MODULE): PRIVATE_NEVERALLOW_ARG := $(NEVERALLOW_ARG)
$(LOCAL_BUILT_MODULE): $(HOST_OUT_EXECUTABLES)/secilc $(all_cil_files) $(built_sepolicy_neverallows)
	$(hide) $(HOST_OUT_EXECUTABLES)/secilc -m -M true -G -c $(POLICYVERS) $(PRIVATE_NEVERALLOW_ARG) \
		$(PRIVATE_CIL_FILES) -o $@ -f /dev/null

通过secilc,将cil文件编译成目标文件precompiled_sepolicy,其中cil文件包含

all_cil_files := \
    $(built_plat_cil) \
    $(built_plat_mapping_cil) \
    $(built_pub_vers_cil) \
    $(built_vendor_cil)

ifdef HAS_SYSTEM_EXT_SEPOLICY
all_cil_files += $(built_system_ext_cil)
endif

ifdef HAS_SYSTEM_EXT_PUBLIC_SEPOLICY
all_cil_files += $(built_system_ext_mapping_cil)
endif

ifdef HAS_PRODUCT_SEPOLICY
all_cil_files += $(built_product_cil)
endif

ifdef HAS_PRODUCT_PUBLIC_SEPOLICY
all_cil_files += $(built_product_mapping_cil)
endif

ifdef BOARD_ODM_SEPOLICY_DIRS
all_cil_files += $(built_odm_cil)
endif

再来看一下cil文件的生成过程,以built_plat_cil 为例,其它的都类似

built_plat_cil
built_plat_cil是在生成plat_sepolicy.cil的时候赋值的

include $(CLEAR_VARS)

LOCAL_MODULE := plat_sepolicy.cil

//省略
built_plat_cil := $(LOCAL_BUILT_MODULE)

plat_sepolicy.cil 会放在system/etc/selinux目录下

include $(CLEAR_VARS)

LOCAL_MODULE := plat_sepolicy.cil
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/selinux

收集 PLAT_PRIVATE_POLICY和 PLAT_PUBLIC_POLICY 目录下的 文件,通过transform-policy-to-conf 进行宏展开,得到plat_policy.conf文件。其中PLAT_PRIVATE_POLICY和PLAT_PUBLIC_POLICY 对应的目录,参考前面提到的Android.mk中的宏

policy_files := $(call build_policy, $(sepolicy_build_files), \
  $(PLAT_PUBLIC_POLICY) $(PLAT_PRIVATE_POLICY))
plat_policy.conf := $(intermediates)/plat_policy.conf
$(plat_policy.conf): PRIVATE_MLS_SENS := $(MLS_SENS)
$(plat_policy.conf): PRIVATE_MLS_CATS := $(MLS_CATS)
$(plat_policy.conf): PRIVATE_TARGET_BUILD_VARIANT := $(TARGET_BUILD_VARIANT)
$(plat_policy.conf): PRIVATE_TGT_ARCH := $(my_target_arch)
$(plat_policy.conf): PRIVATE_TGT_WITH_ASAN := $(with_asan)
$(plat_policy.conf): PRIVATE_TGT_WITH_NATIVE_COVERAGE := $(with_native_coverage)
$(plat_policy.conf): PRIVATE_ADDITIONAL_M4DEFS := $(LOCAL_ADDITIONAL_M4DEFS)
$(plat_policy.conf): PRIVATE_SEPOLICY_SPLIT := $(PRODUCT_SEPOLICY_SPLIT)
$(plat_policy.conf): PRIVATE_COMPATIBLE_PROPERTY := $(PRODUCT_COMPATIBLE_PROPERTY)
$(plat_policy.conf): PRIVATE_TREBLE_SYSPROP_NEVERALLOW := $(treble_sysprop_neverallow)
$(plat_policy.conf): PRIVATE_POLICY_FILES := $(policy_files)
$(plat_policy.conf): $(policy_files) $(M4)
	$(transform-policy-to-conf)
	$(hide) sed '/^\s*dontaudit.*;/d' $@ | sed '/^\s*dontaudit/,/;/d' > $@.dontaudit

sepolicy_build_files 包含的文件有:

sepolicy_build_files := security_classes \
                        initial_sids \
                        access_vectors \
                        global_macros \
                        neverallow_macros \
                        mls_macros \
                        mls_decl \
                        mls \
                        policy_capabilities \
                        te_macros \
                        attributes \
                        ioctl_defines \
                        ioctl_macros \
                        *.te \
                        roles_decl \
                        roles \
                        users \
                        initial_sid_contexts \
                        fs_use \
                        genfs_contexts \
                        port_contexts

收集到的文件,宏展开得到plat_policy.conf后,通过checkpolicy生成plat_sepolicy.cil目标文件

$(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CIL_FILES := \
  $(call build_policy, $(sepolicy_build_cil_workaround_files), $(PLAT_PRIVATE_POLICY))
$(LOCAL_BUILT_MODULE): PRIVATE_NEVERALLOW_ARG := $(NEVERALLOW_ARG)
$(LOCAL_BUILT_MODULE): $(plat_policy.conf) $(HOST_OUT_EXECUTABLES)/checkpolicy \
  $(HOST_OUT_EXECUTABLES)/secilc \
  $(call build_policy, $(sepolicy_build_cil_workaround_files), $(PLAT_PRIVATE_POLICY)) \
  $(built_sepolicy_neverallows)
	@mkdir -p $(dir $@)
	$(hide) $(CHECKPOLICY_ASAN_OPTIONS) $(HOST_OUT_EXECUTABLES)/checkpolicy -M -C -c \
		$(POLICYVERS) -o $@.tmp $<
	$(hide) cat $(PRIVATE_ADDITIONAL_CIL_FILES) >> $@.tmp
	$(hide) $(HOST_OUT_EXECUTABLES)/secilc -m -M true -G -c $(POLICYVERS) $(PRIVATE_NEVERALLOW_ARG) $@.tmp -o /dev/null -f /dev/null
	$(hide) mv $@.tmp $@

总结编译的整体逻辑

在这里插入图片描述

1,查找相关目录下的te文件,进行宏展开,转化成policy.conf文件。
2,将 policy.conf 文件,通过checkpolicy,编译成中间文件*.cil
3,通过secilc工具,编译成二进制文件precompiled_sepolicy

最终根目录系统结构为

console:/ # ls -al system/etc/selinux/
total 1764
drwxr-xr-x  3 root root    4096 2024-01-17 18:00 .
drwxr-xr-x 14 root root    4096 2024-01-24 16:47 ..
drwxr-xr-x  2 root root    4096 2024-01-17 17:59 mapping
-rw-r--r--  1 root root   41949 2024-01-17 17:59 plat_file_contexts
-rw-r--r--  1 root root    8752 2024-01-17 17:59 plat_hwservice_contexts
-rw-r--r--  1 root root    7371 2024-01-17 17:59 plat_mac_permissions.xml
-rw-r--r--  1 root root   47325 2024-01-17 17:59 plat_property_contexts
-rw-r--r--  1 root root    2898 2024-01-17 18:00 plat_seapp_contexts
-rw-r--r--  1 root root 1646622 2024-01-17 17:59 plat_sepolicy.cil
-rw-r--r--  1 root root      65 2024-01-17 17:59 plat_sepolicy_and_mapping.sha256
-rw-r--r--  1 root root   18876 2024-01-17 17:59 plat_service_contexts
console:/ # ls -al vendor/etc/selinux/
total 1184
drwxr-xr-x  2 root shell   4096 2024-01-17 18:00 .
drwxr-xr-x 13 root shell   4096 2024-01-24 16:46 ..
-rw-r--r--  1 root root  926046 2024-01-17 18:00 plat_pub_versioned.cil
-rw-r--r--  1 root root       5 2024-01-17 17:59 plat_sepolicy_vers.txt
-rw-r--r--  1 root root    1511 2024-01-17 17:59 selinux_denial_metadata
-rw-r--r--  1 root root   21807 2024-01-17 17:59 vendor_file_contexts
-rw-r--r--  1 root root     280 2024-01-17 17:59 vendor_hwservice_contexts
-rw-r--r--  1 root root    6751 2024-01-17 17:59 vendor_mac_permissions.xml
-rw-r--r--  1 root root    3900 2024-01-17 17:59 vendor_property_contexts
-rw-r--r--  1 root root       0 2024-01-17 18:00 vendor_seapp_contexts
-rw-r--r--  1 root root  216664 2024-01-17 18:00 vendor_sepolicy.cil
-rw-r--r--  1 root root     214 2024-01-17 17:59 vendor_service_contexts
-rw-r--r--  1 root root     130 2024-01-17 18:00 vndservice_contexts
console:/ # ls -al odm/etc/selinux/
total 556
drwxr-xr-x 2 root root   4096 2024-01-17 18:00 .
drwxr-xr-x 3 root root   4096 2024-01-17 18:00 ..
-rw-r--r-- 1 root root 545403 2024-01-17 18:00 precompiled_sepolicy
-rw-r--r-- 1 root root     65 2024-01-17 18:00 precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
-rw-r--r-- 1 root root     65 2024-01-17 18:00 precompiled_sepolicy.product_sepolicy_and_mapping.sha256
-rw-r--r-- 1 root root     65 2024-01-17 18:00 precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256

上面只是简要的分析了一下编译过程,具体的还需要分析Android.mk文件。

参考Android.mk文件,我们如果更改了Selinux某些内容,可以执行make selinux_policy或者mmma system/sepolicy 进行模块编译就行了,不用整编系统,然后替换system/vendor 下相关的文件即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/510141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自己动手写数据库:基于哈希的静态索引设计

数据库设计中有一项至关重要的技术难点&#xff0c;那就是给定特定条件进行查询时&#xff0c;我们需要保证速度尽可能快。假设我们有一个 STUDENT 表&#xff0c;表中包含学生名字&#xff0c;年龄&#xff0c;专业等字段&#xff0c;当我们要查询给定年龄数值的记录&#xff…

如何一键展示全平台信息?Python手把手教你搭建自己的自媒体展示平台

前言 灵感源于之前写过的Github中Readme.md中可以插入自己的js图片和动态api解析模块&#xff0c;在展示方面十分的美观&#xff1a; 这方面原理可以简化为&#xff0c;在Markdown中&#xff0c;你可以使用HTML标签来添加图像&#xff0c;就像这样&#xff1a; <tr><…

轻松设置Facebook自动隐藏评论和删除评论功能

Facebook作为海外营销的最大流量平台之一&#xff0c;是很多跨境卖家争夺的市场&#xff0c;希望可以通过Facebook这个全球性的平台来推广自己的产品或服务。身处这个竞争激烈的市场&#xff0c;任何一条负面评论或不当言论出现在你的品牌页面上都可能影响到品牌形象&#xff0…

晶核新手必备攻略,干货满满!

晶核游戏以其独特的玩法和丰富的内容吸引着众多玩家。然而&#xff0c;对于一些追求效率和资源的玩家来说&#xff0c;单开游戏往往难以满足他们的需求。多开游戏成为了一个不错的选择&#xff0c;它能帮助玩家更快地获取资源&#xff0c;提升账号实力。下面将为大家分享一些晶…

ardupilot开发 --- 远程标识 篇

1. wifi协议 https://zhuanlan.zhihu.com/p/660568077 AP 无线接入点 路由器STA 站点 接入路由器的终端SSID 标识符 无线网络的名称信标祯 Beacon AP通过广播Beacon祯来告诉想要接入者(STA)无线网络的信息&#xff0c;如SSIDWLAN数据帧 Wi-Fi网络中传输数据时所使用的数据帧格…

Docker部署Nexus Maven私服并且实现远程访问Nexus界面

目录 ⛳️推荐 1. Docker安装Nexus 2. 本地访问Nexus 3. Linux安装Cpolar 4. 配置Nexus界面公网地址 5. 远程访问 Nexus界面 6. 固定Nexus公网地址 7. 固定地址访问Nexus ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&am…

Linux:基本指令篇

文章目录 前言1.ls 指令2.pwd命令3.cd 指令4.touch指令5.mkdir指令&#xff08;重要&#xff09;6.rmdir指令 && rm 指令&#xff08;重要&#xff09;7.man指令&#xff08;重要&#xff09;8.cp指令&#xff08;重要&#xff09;9.mv指令&#xff08;重要&#xff09…

【THM】Passive Reconnaissance(被动侦察)-初级渗透测试

介绍 欢迎来到网络安全模块的第一个房间,该模块涵盖: 1.被动侦察 2.主动侦察 3.Nmap实时主机发现 4.Nmap基本端口扫描 5.Nmap高级端口扫描 6.Nmap后端口扫描 7.协议和服务器 8.协议和服务器2 9.网络安全挑战 在这个房间里,在我们定义被动侦察和主动侦察之后,我们…

友思特方案 | 构建缤纷:可调谐光源的荧光成像的应用

导读 生物荧光分析常常伴随使用多种荧光染料的需求。结合多通道光源技术与高性能成像设备&#xff0c;友思特可调谐光源荧光检测成像方案&#xff0c;以其灵活的系统组成&#xff0c;满足了丰富的荧光检测应用需求。 生物荧光分析技术 激发荧光成像技术是研究生物学过程的一种…

Python基于微博的大数据舆论情感分析、微博大数据舆论分析可视化系统

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

无需注册即可使用 ChatGPT;Poe 创始人:大模型幻觉是创业公司的机会丨RTE 开发者日报 Vol.176

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

如何重塑IT运维核心竞争力?擎创夏洛克智能观测中心这么做

数字化浪潮的涌动&#xff0c;推进着金融企业业务全面进入线上时代。在云原生的环境下&#xff0c;为满足业务敏捷构建、高效交付、高性能并发等需求&#xff0c;企业对运维技术的要求日益增加。同时&#xff0c;在不断转型的过程中&#xff0c;受敏稳“双态”业务发展的影响&a…

YB4051系列设备是高度集成的 Li-lon 和 Li-Pol 线性充电器

概述&#xff1a; YB4051系列设备是高度集成的 Li-lon 和 Li-Pol 线性充电器&#xff0c;针对便携式应用的小容量电池。它是一个完整的恒流/恒压线性充电器。不需要外部感应电阻&#xff0c;由于内部 MOSFET 结构&#xff0c;不需要阻塞二极管。它可以提供高达300mA 的充电电流…

SpringBoot登录校验(三)JWT令牌

SpringBoot 登录认证&#xff08;一&#xff09;-CSDN博客 SpringBoot 登录认证&#xff08;二&#xff09;-CSDN博客 SpringBoot登录校验&#xff08;三&#xff09;-CSDN博客 前面我们介绍了传统的会话跟踪技术cookie和sesstion&#xff0c;本节讲解令牌技术。这里所提到的…

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…

基于粒子群算法的多目标搜索算法

粒子速度类似于梯度下降的方向 粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读 - 知乎 (zhihu.com) 粒子群优化算法介绍 与多种群遗传算法有相似之处

未来购物新篇章:臻奶惠无人新零售

未来购物新篇章&#xff1a;臻奶惠无人新零售 随着科技的不断进步和消费者购物习惯的变化&#xff0c;无人新零售已经成为零售行业的一大趋势&#xff0c;它不仅重新定义了购物体验&#xff0c;也为零售行业带来了前所未有的变革。无人新零售&#xff0c;一种融合了AI技术、物…

保护Android应用安全:全面探究代码混淆在加固中的作用

Android APP 加固是优化 APK 安全性的一种方法&#xff0c;常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码 使用 ipaguard工具可以对代码进行混淆&#xff0c;使得反编译出来的代码很难阅读和理解&#xff…

c++的STL(6)-- map和multimap

map和multimap概述 map和multimap中存储的是使用pair对象的键值对。 map和multimap底层也是使用红黑树的数据结构进行实现的。所以&#xff0c;map和multimap内部存储的键值对也是有序的。并且内部数据也是使用链表的形式进行关联。所以其的迭代器和指针&#xff0c;也只能进行…

淘宝商品详情用于选品上架,数据分析,代购商城建站,ERP系统商品数据选品,价格监控业务场景

大数据时代&#xff0c; 数据收集不仅是科学研究的基石&#xff0c; 更是企业决策的关键。 然而&#xff0c;如何高效地收集数据 成了摆在我们面前的一项重要任务。 本文将为你揭示&#xff0c; 一系列实时数据采集方法&#xff0c; 助你在信息洪流中&#xff0c; 找到…