Android 11源码——安全策略SELinux关闭
Android 11源码 安全策略SELinux关闭
- SELinux介绍
- 背景
- 关闭Android的SELinux
- 临时关闭
- 永久关闭
SELinux介绍
作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。
SELinux 按照默认拒绝的原则运行:任何未经明确允许的行为都会被拒绝。SELinux 可按两种全局模式运行:
- 宽容模式:权限拒绝事件会被记录下来,但不会被强制执行。
- 强制模式:权限拒绝事件会被记录下来并强制执行。
Android 中包含 SELinux(处于强制模式)和默认适用于整个 AOSP 的相应安全政策。在强制模式下,非法操作会被阻止,并且尝试进行的所有违规行为都会被内核记录到 dmesg 和 logcat。开发时,您应该先利用这些错误信息对软件和 SELinux 政策进行优化,再对它们进行强制执行。
此外,SELinux 还支持基于域的宽容模式。在这种模式下,可将特定域(进程)设为宽容模式,同时使系统的其余部分处于全局强制模式。简单来说,域是安全政策中用于标识一个进程或一组进程的标签,安全政策会以相同的方式处理所有具有相同域标签的进程。借助基于域的宽容模式,可逐步将 SELinux 应用于系统中越来越多的部分,还可以为新服务制定政策(同时确保系统的其余部分处于强制模式)。
背景
Android 安全模型部分基于应用沙盒的概念。每个应用都在自己的沙盒内运行。在 Android 4.3 之前的版本中,这些沙盒是通过为每个应用创建独一无二的 Linux UID(在应用安装时创建)来定义的。Android 4.3 及更高版本使用 SELinux 进一步定义 Android 应用沙盒的边界。
基于 Android 4.3(宽容模式)和 Android 4.4(部分强制模式),在 Android 5.0 及更高版本中,已全面强制执行 SELinux。通过此项变更,Android 已从对有限的一组关键域(installd、netd、vold 和 zygote)强制执行 SELinux 转为对所有域(超过 60 个)强制执行 SELinux。具体而言:
- 在 Android 5.x 及更高版本中,所有域均处于强制模式。
- init 以外的任何进程都不应在 init 域中运行。
- 出现任何常规拒绝事件(对于 block_device、socket_device、default_service),都表示设备需要一个特殊域。
Android 6.0 通过降低我们政策的宽容度强化了系统安全,从而实现更好的用户隔离和 IOCTL 过滤、降低可从设备/系统之外访问的服务面临的威胁、进一步强化 SELinux 域,以及高度限制对 /proc 的访问。
Android 7.0 更新了 SELinux 配置,以进一步锁定应用沙盒并缩小受攻击面。此版本还将单片式 mediaserver 堆栈拆分为较小的进程,以缩小其权限范围。
Android 8.0 更新了 SELinux 以便与 Treble 配合使用,后者可将较低级别的供应商代码与 Android 系统框架分离开来。此版本更新了 SELinux 政策以允许设备制造商和 SOC 供应商更新自己的政策部分、构建自己的映像(vendor.img、boot.img 等),然后更新这些映像而不受平台影响,反之亦然。
虽然可以在设备上运行更高/更新版本的平台(框架),但反之并不成立;供应商映像 (vendor.img/odm.img) 的版本不能高于平台 (system.img) 的版本。因此,较新版平台可能会带来 SELinux 兼容性问题,因为平台 SELinux 政策的版本要比该政策的供应商 SELinux 部分更新。Android 8.0 模型提供了一种保持兼容性的方法,以免进行不必要的同时 OTA。
关闭Android的SELinux
为什么需要关闭:
由于应用层访问设备节点的时候,因为selinux权限问题而访问不了,所以就先关闭selinux。
查看当前样机的SELinux状态值:
adb shell getenforce
Enforcing:表示SELinux处于开启状态;
Permissive:表示SELinux处于关闭状态。
临时关闭
临时关闭SELinux操作比较简单,但是前提是样机能被root,setenforce 命令修改的是 /sys/fs/selinux/enforce
节点的值,是 kernel 意义上的修改 selinux 的策略。
adb root
adb shell setenforce 0 // 开SELinux:设置成模式permissive
adb shell setenforce 1 // 关SELinux:设置成模式enforce
XXX:/ # getenforce // 获取当前SELinux状态
Enforcing
XXX:/ # setenforce 0 // 临时关闭SELinux状态
XXX:/ # getenforce // 获取SELinux状态
Permissive
XXX:/ # setenforce 1 // 永久开启SELinux状态
XXX:/ # getenforce
Enforcing
XXX:/ #
注意点:
- 该方式仅适用于
userdebug
版本,系统重启修改会失效 - 在
root
模式下运行,且必须是终端没有对setenforce进行限制,否则会报如下的错误:
setenforce: Couldn't set enforcing status to '0': Permission denied //非root情况
永久关闭
init进程是Android内核启动的第一个用户级进程,其中的SELinux也是在init进程中启动的,代码位置在system/core/init/init.cpp
中:
main()方法中调用SelinuxInitialize();
方法对selinux进行初始化,该方法的实现位于system/core/init/selinux.cpp
中:
int main(int argc, char** argv) {...SelinuxInitialize();...
}
init会通过security_getenforce()和selinux_is_enforcing()的值是否一致来判断是否开启SELinux,当不一致的时候会设置security_setenforce的值为is_enforcing。
void SelinuxInitialize() {Timer t;LOG(INFO) << "Loading SELinux policy";if (!LoadPolicy()) {LOG(FATAL) << "Unable to load SELinux policy";}bool kernel_enforcing = (security_getenforce() == 1);bool is_enforcing = IsEnforcing();if (kernel_enforcing != is_enforcing) {if (security_setenforce(is_enforcing)) {PLOG(FATAL) << "security_setenforce(%s) failed" << (is_enforcing ? "true" : "false");}}if (auto result = WriteFile("/sys/fs/selinux/checkreqprot", "0"); !result) {LOG(FATAL) << "Unable to write to /sys/fs/selinux/checkreqprot: " << result.error();}// init's first stage can't set properties, so pass the time to the second stage.setenv("INIT_SELINUX_TOOK", std::to_string(t.duration().count()).c_str(), 1);
}
在/selinux.cpp
文件中IsEnforcing()
方法中直接返回false就是关闭selinux权限了。
bool IsEnforcing() {//if (ALLOW_PERMISSIVE_SELINUX) {// return StatusFromCmdline() == SELINUX_ENFORCING;//}//return true;return false;
}
参考:
https://source.android.google.cn/security/selinux?hl=zh-cn
https://blog.csdn.net/wq892373445/article/details/120823080
https://blog.csdn.net/tkwxty/article/details/103938287?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_paycolumn_v3&utm_relevant_index=5
https://www.jianshu.com/p/f1a6f248c607
https://blog.csdn.net/u012932409/article/details/114632885
Android 11源码——安全策略SELinux关闭相关推荐
- Android 11源码 Framework修改默认usb连接模式为MTP模式
Android 11源码 Framework修改默认usb连接模式为MTP模式 Android 11源码 Framework修改默认usb连接模式为MTP模式 修改Framework层源码 编译修改后 ...
- Arch 编译 Android 11 源码
文章目录 环境准备 下载源码 下载 repo 工具 repo init 原理 初始化仓库 选择同步指定分支 同步代码 切换源 编译代码 遇到的错误 很多人都写,如何在 Ubuntu 下编译 Andro ...
- android 11源码开机更改屏幕方向触摸方向
目录 1.修改屏幕方向 2.配置触摸方向 3.修改触摸相关配置源码 修改屏幕方向以后需要将系统的触摸方向一并配置,否则可能造成坐标错乱情况,修改完毕后重新编译源码烧录后验证结果 1.修改屏幕方向 这里 ...
- 修改编译Android 11源码时发现报can‘t find symble的错误
在/home/wq/android_11_source_repo/packages/apps/Contacts/src/com/android/contacts/activities/ContactS ...
- Android Adb 源码分析
扭起屁股得意洋洋 最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知,好景不长,u ...
- 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析
[Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...
- Android系统源码目录及功能介绍
Android的移植按如下流程: 1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. 2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...
- 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 配置
MediaRecorder 录像配置主要涉及输出文件路径.音频来源.视频来源.输出格式.音频编码格式.视频编码格式.比特率.帧率和视频尺寸等. 我们假设视频输入源来自 Camera,Camera2 A ...
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
最新文章
- POJ-1860-Currency Exchange
- 通过shell将*.txt文本内容批量录入mysql
- 基于OpenCV的实时停车地点查找
- CentOS7 设置开机直接进入命令行界面
- 如何成立一家私募基金公司
- 【LeetCode】191. Number of 1 Bits
- POJ 3660 Cow Contest【传递闭包】
- 修订模式怎么彻底关闭_电脑玩游戏卡顿怎么办?
- 小程序 || 语句_C ++开关语句| 查找输出程序| 套装1
- UGUI字体不清楚——终极探索
- 量子计算时代到来,摩尔定律将要失效?
- LeetCode35. 搜索插入位置(二分查找)
- WLAN加密技术详解
- MyBatis的常见面试题
- CSS display属性 – 不显示、显示表格、内联块等
- 大项目售前、售中和售后感悟
- Java高级技术FastDFS的学习
- 网站优化提高网站关键词密度是必要的
- ROS2学习笔记(四)-- 用方向键控制小车行走
- 国内主流云服务器价格概览
热门文章
- 【​观察】解读锐捷新时代价值观 “做精做强”赋能合作伙伴
- 这个Dubbo注册中心扩展,有点意思
- 龙南分局反电诈宣传防范	防止诈骗,从我做起。
- Python2.7对接科大讯飞的语音合成和语音识别接口
- DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter(2019-10-2)
- 51NOD 1351 吃点心 贪心
- 电脑如何录屏?3个方法教您win10电脑怎么录屏!
- 应用激光透窗摄像机,助力机动车超员检测系统抓拍违章超员驾驶
- 哈夫曼树构造哈夫曼编码
- mongo存储引擎那些事(一):硬盘数据结构