Android 11源码 安全策略SELinux关闭

  • SELinux介绍
  • 背景
  • 关闭Android的SELinux
    • 临时关闭
    • 永久关闭

SELinux介绍

作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。

SELinux 按照默认拒绝的原则运行:任何未经明确允许的行为都会被拒绝。SELinux 可按两种全局模式运行:

  1. 宽容模式:权限拒绝事件会被记录下来,但不会被强制执行。
  2. 强制模式:权限拒绝事件会被记录下来并强制执行。

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关闭相关推荐

  1. Android 11源码 Framework修改默认usb连接模式为MTP模式

    Android 11源码 Framework修改默认usb连接模式为MTP模式 Android 11源码 Framework修改默认usb连接模式为MTP模式 修改Framework层源码 编译修改后 ...

  2. Arch 编译 Android 11 源码

    文章目录 环境准备 下载源码 下载 repo 工具 repo init 原理 初始化仓库 选择同步指定分支 同步代码 切换源 编译代码 遇到的错误 很多人都写,如何在 Ubuntu 下编译 Andro ...

  3. android 11源码开机更改屏幕方向触摸方向

    目录 1.修改屏幕方向 2.配置触摸方向 3.修改触摸相关配置源码 修改屏幕方向以后需要将系统的触摸方向一并配置,否则可能造成坐标错乱情况,修改完毕后重新编译源码烧录后验证结果 1.修改屏幕方向 这里 ...

  4. 修改编译Android 11源码时发现报can‘t find symble的错误

    在/home/wq/android_11_source_repo/packages/apps/Contacts/src/com/android/contacts/activities/ContactS ...

  5. Android Adb 源码分析

    扭起屁股得意洋洋 最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知,好景不长,u ...

  6. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  7. Android系统源码目录及功能介绍

    Android的移植按如下流程:     1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...

  8. 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 配置

    MediaRecorder 录像配置主要涉及输出文件路径.音频来源.视频来源.输出格式.音频编码格式.视频编码格式.比特率.帧率和视频尺寸等. 我们假设视频输入源来自 Camera,Camera2 A ...

  9. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

最新文章

  1. POJ-1860-Currency Exchange
  2. 通过shell将*.txt文本内容批量录入mysql
  3. 基于OpenCV的实时停车地点查找
  4. CentOS7 设置开机直接进入命令行界面
  5. 如何成立一家私募基金公司
  6. 【LeetCode】191. Number of 1 Bits
  7. POJ 3660 Cow Contest【传递闭包】
  8. 修订模式怎么彻底关闭_电脑玩游戏卡顿怎么办?
  9. 小程序 || 语句_C ++开关语句| 查找输出程序| 套装1
  10. UGUI字体不清楚——终极探索
  11. 量子计算时代到来,摩尔定律将要失效?
  12. LeetCode35. 搜索插入位置(二分查找)
  13. WLAN加密技术详解
  14. MyBatis的常见面试题
  15. CSS display属性 – 不显示、显示表格、内联块等
  16. 大项目售前、售中和售后感悟
  17. Java高级技术FastDFS的学习
  18. 网站优化提高网站关键词密度是必要的
  19. ROS2学习笔记(四)-- 用方向键控制小车行走
  20. 国内主流云服务器价格概览

热门文章

  1. 【​观察】解读锐捷新时代价值观 “做精做强”赋能合作伙伴
  2. 这个Dubbo注册中心扩展,有点意思
  3. 龙南分局反电诈宣传防范 防止诈骗,从我做起。
  4. Python2.7对接科大讯飞的语音合成和语音识别接口
  5. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter(2019-10-2)
  6. 51NOD 1351 吃点心 贪心
  7. 电脑如何录屏?3个方法教您win10电脑怎么录屏!
  8. 应用激光透窗摄像机,助力机动车超员检测系统抓拍违章超员驾驶
  9. 哈夫曼树构造哈夫曼编码
  10. mongo存储引擎那些事(一):硬盘数据结构