正确姿势临时和永久关闭Android的SELinux

Android SELinux开发多场景实战指南目录:

Android SELinux开发入门指南之SELinux基础知识
Android SEAndroid权限问题指南
Android SELinux开发入门指南之如何增加Java Binder Service权限
Android SELinux开发入门指南之权限解决万能规则
Android SELinux开发入门指南之如何增加Native Binder Service权限
Android SELinux开发入门指南之正确姿势解决访问data目录权限问题
正确姿势临时和永久关闭Android的SELinux


引言

   自从Android 4.4强制开启SELinux以后,在开发中我们经常会遇到avc denied的问题,为了方便开发调试我们会将SELinux关闭,那么本章将带领读者怎么临时和永久关闭Android的SELinux。

注意:这里的源码是以Android 8.0为基准的。


正确姿势临时和永久关闭Android的SELinux

1.1 临时关闭Android的SELinux

这个操作比较简单,但是前提条件是机器能被root,且固件里面没有限制setenforce命令的执行。下面让我们看看怎么执行:

XXX:/ # getenforce   //获取当前SELinux状态
Enforcing
XXX:/ #  setenforce 0   //临时关闭SELinux状态
XXX:/ # getenforce      //获取SELinux状态
Permissive
XXX:/ # setenforce 1   //永久开启SELinux状态
XXX:/ # getenforce
Enforcing
XXX:/ #

注意点:

  • 上述的方法是临时关闭SELinux,机器重启以后还是会恢复的
  • 上述命令一定要在Root模式下运行,且必须是终端没有对setenforce进行限制,否则会报如下的错误
setenforce: Could not set enforcing status: Permission denied   //非root情况
  • 对于一些定制了内核的Room来说,哪怕你已经获取了Root权限,当执行setenforce命令时依然会提示如下错误,因为在SELinux模式下,Root不是万能的。
setenforce: Couldn't set enforcing status to '0': Invalid argument //Root情况,但是Room做了定制不允许setenforce

1.2 永久关闭Android的SELinux

init进程是Android内核启动的第一个用户级进程,其中的SELinux也是在init进程中启动的,代码位置在system/core/init/init.cpp中。

int main(int argc, char** argv) {...selinux_initialize(true);...
}static void selinux_initialize(bool in_kernel_domain) {Timer t;selinux_callback cb;cb.func_log = selinux_klog_callback;selinux_set_callback(SELINUX_CB_LOG, cb);cb.func_audit = audit_callback;selinux_set_callback(SELINUX_CB_AUDIT, cb);if (in_kernel_domain) {LOG(INFO) << "Loading SELinux policy";if (!selinux_load_policy()) {panic();}bool kernel_enforcing = (security_getenforce() == 1);//判断条件1bool is_enforcing = selinux_is_enforcing();//判断条件2if (kernel_enforcing != is_enforcing) {if (security_setenforce(is_enforcing)) {PLOG(ERROR) << "security_setenforce(%s) failed" << (is_enforcing ? "true" : "false");security_failure();}}std::string err;if (!WriteFile("/sys/fs/selinux/checkreqprot", "0", &err)) {LOG(ERROR) << err;security_failure();}// 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);} else {selinux_init_all_handles();}
}

通过代码我们可以看出,init会通过security_getenforce()和selinux_is_enforcing()的值是否一致来判断是否开启SELinux,当不一致的时候会设置security_setenforce的值为is_enforcing。

下面让我么看看security_getenforce()的实现,通过全局搜索我们发现,该代码的位置在在external/selinux/libselinux/src/getenforce.c目录下:

int security_getenforce(void)
{int fd, ret, enforce = 0;char path[PATH_MAX];char buf[20];if (!selinux_mnt) {errno = ENOENT;return -1; }   snprintf(path, sizeof path, "%s/enforce", selinux_mnt);fd = open(path, O_RDONLY | O_CLOEXEC);if (fd < 0)return -1; memset(buf, 0, sizeof buf);ret = read(fd, buf, sizeof buf - 1); close(fd);if (ret < 0)return -1; if (sscanf(buf, "%d", &enforce) != 1)return -1; return !!enforce;
}

这里有个要注意点,sizeof path,这个不是错误的,因为这里的sizeof是一个运算符,这里的代码所以首先获取一个节点数值,Android改节点路为/sys/fs/selinux/enforce,这个值表示是否开启selinux,让我们手动cat一下该节点,然后查看一下值:

XXX:/ # cat /sys/fs/selinux/enforce
1

这里另一个判定条件是selinux_is_enforcing()函数。其定义如下:

enum selinux_enforcing_status { SELINUX_PERMISSIVE, SELINUX_ENFORCING };static selinux_enforcing_status selinux_status_from_cmdline() {selinux_enforcing_status status = SELINUX_ENFORCING;import_kernel_cmdline(false, [&](const std::string& key, const std::string& value, bool in_qemu) {if (key == "androidboot.selinux" && value == "permissive") {status = SELINUX_PERMISSIVE;}});     return status;
}           static bool selinux_is_enforcing(void)
{       if (ALLOW_PERMISSIVE_SELINUX) {return selinux_status_from_cmdline() == SELINUX_ENFORCING;}       return true;
}

此处从cmdline中获取androidboot.selinux的值,如果是permissive,则返回SELINUX_PERMISSIVE,即0,否则返回SELINUX_ENFORCING。如果enforce节点和cmdline设置不一致,则调用security_setenforce重新设置selinux的enforce节点值。
因此想要关闭selinux,可以直接将selinux_is_enforcing返回false,网上也有人从驱动返回,这个驱动这边不是很熟悉,所以就在这里直接注释掉从驱动获取的值直接返回false即可。

static bool selinux_is_enforcing(void)
{             return false;
}

最后重新编译boot.img,烧入固件这样重新启。启动完成后调用getenforce命令可以看到已经特地关闭SELinux了。

关于从驱动层返回修改的,可以参考下面的这篇博文:
https://blog.csdn.net/zhangdaxia2/article/details/98243665


结语

   关于SELinxu都是些偏向实战类型的博客,所以也没有过多好说的,跟着规则实际操作几把就基本OK了。好了今天的博客正确姿势临时和永久开启关闭Android的SELinux到这里就结束了,各位青山不改绿水长流,江湖见!欢迎点赞或者关注本博主,当然由于博主知识有限,批评或者踩也无妨!

正确姿势临时和永久开启关闭Android的SELinux相关推荐

  1. WIN7/WIN10 临时及永久 强制关闭驱动签名验证

    怎么进入安装模式可参照此博文:链接 临时关闭驱动签名验证 WIN7:重启系统,启动期间按F8进入,选择-禁用驱动程序签名强制 WIN10:按住SHIFT重启系统,选择-禁用驱动程序签名强制 永久关闭驱 ...

  2. Android SELinux开发入门指南之正确姿势解决访问data目录权限问题

      Android SELinux开发入门指南之正确姿势解决访问data目录权限问题 Android SELinux开发多场景实战指南目录: Android SELinux开发入门指南之SELinux ...

  3. android永久关闭linux,Android临时和永久关闭selinux

    当我们想要临时关闭selinux时,如果可以获得root权限,通过adb如下指令可以临时关闭selinux: setenforce 0 如果需要长期关闭,则需要用其他方法,先看slinue启动的位置: ...

  4. Ubuntu下正确姿势使用GDB调试Android Native进程

        Ubuntu下正确姿势使用GDB调试Android Native进程 前言   对于Android Native进程大家是既爱又恨啊,爱的是它能为我们的Android世界带来别样的精彩,狠的是 ...

  5. linux core 永久生效,【调试】Core Dump是什么?Linux下如何正确永久开启?

    内容简介 [调试]Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么? Core Dump乍听之下很抽象. 当 ...

  6. Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

    Android PermissionUtils:运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6 Permis ...

  7. Android获取设备状态栏status bar高度的正确姿势

    Android获取设备状态栏高度的正确姿势 正确代码方式: int height = 0;int resourceId = getApplicationContext().getResources() ...

  8. android javamail获取邮件太多太慢_结合 Spring 发送邮件的4种正确姿势,你知道几种?...

    Java程序猿阿谷:面试字节跳动三轮凉凉,内推4面终拿下抖音offer(Java后台研发)​zhuanlan.zhihu.com 一.前言 测试所使用的环境 测试使用的环境是企业主流的SSM 框架即 ...

  9. 分析Android studio3.0的instant run开启关闭对APK大小的影响

    分析Android studio3.0的instant run开启关闭对APK大小的影响 首先看下默认开启instant run的截图: Android studio2.0后新增加的功能默认开启ins ...

最新文章

  1. 【Web安全】DVWA+CSRF跨站请求伪造-生成链接修改password
  2. 既然有 GC 机制,为什么还会有内存泄露的情况
  3. 数据库切换时的一个傻逼的错误。
  4. 这代码她不美吗?——试题 基础练习 十六进制转八进制
  5. Linux下安装并使用MySQL数据库
  6. Tensorflow快餐教程(6) - 矩阵分解
  7. 深度学习编译:MLIR初步
  8. 数据结构之串:串的模式匹配
  9. 双非本科上岸北大,复试成绩专业第一!
  10. 吐血整理全网最全Spring面试题之高级篇(一)(共25题,附超详细解答)
  11. 远秋规培系统服务器地址,远秋住培管理系统
  12. 帆软finereport决策系统自定义登录界面
  13. 亲测!Jquery2.0不支持IE8-了
  14. 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
  15. 大数据可视化的优点有哪些
  16. 编译原理教程_7 语法制导的语义计算
  17. Lightbox图片展示特效
  18. matlab 求公因数,符号运算提取多项式系数和公因数
  19. Reporting报表开发知识汇总[个人原创]
  20. U盘在电脑上不显示怎么办?

热门文章

  1. JavaGuide-关于Dubbo的重要知识点
  2. Go 1.13版本介绍
  3. 基本的计算机结构知识----基础向
  4. java有道_java实现有道翻译爬虫
  5. 如何用大数据做行为预测的?
  6. TabLayout+ViewPager2联动
  7. 文本分析常用R包的安装(Rweibo、wordcloud、tm、tmcn、Rwordseg、Rcharts、xlsx、XLConnect)
  8. 检查你的python代码是否符合PEP8规范
  9. 基于 LuCI 的开源主题 luci-them-rosy
  10. C/C++ Qt StatusBar 底部状态栏应用