Android selinux权限

一.SE 概述

SELinux 是由美国NSA(国安局)和 SCC 开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。从 fedora core 2开始, 2.6内核的版本都支持SELinux。

在 SELinux 出现之前,Linux 上的使用的安全模型是 DAC( Discretionary Access Control 自主访问控制)。

DAC 的核心思想很简单:进程理论上所拥有的权限与执行它的用户的权限相同。例如,以 root 用户启动 Browser,那么 Browser 就有 root 用户的权限,在 Linux 系统上能干任何事情。

显然,DAD 管理太过宽松,只要想办法在系统上获取到 root 权限就可以了。所以后面有了 SELinux,在 DAC 之外,SELinux设计了一种新的安全模型,叫 MAC(Mandatory Access Control 强制访问控制)。

MAC 的核心思想也很简单:任何进程想在 SELinux 系统上干任何事情,都必须在《安全策略文件》中赋予权限。

实际使用中,Linux 系统先做 DAC 检查。如果没有通过 DAC 权限检查,则操作直接失败。通过 DAC 检查之后,再做 MAC 权限检查。关于 MAC 的安全策略文件,SELinux 有自己的一套规则来编写,这套规则被称之为 SELinux Policy 语言。

SEAndroid:

Google在 Android 4.4 上正式添加以 SELinux 为基础的系统安全机制,命名为SEAndroid。SEAndroid 在架构和机制上与 SELinux 完全一样,基于移动设备的特点,SEAndroid 的只是所以移植 SELinux 的一个子集。SEAndroid 的安全检查覆盖了包括域转换、类型转换、进程相关操作、内核相关操作、文件目录相关操作、文件系统相关操作、对设备相关操作、对app相关操作、对网络相关操作、对IPC相关操作等内容。

selinux访问控制:

二.命令行打开/关闭Selinux

打开selinux:

打开Selinux即将Selinux处于enforcing模式,所以权限事件都会被记录下来并强制执行。

adb root
adb shell setenforce 1
adb shell getenforce
Enforcing           (返回结果)

如果Selinux处于打开状态下,权限事件的log如下, 可以看到permissive=0,即可以确定当前处于enforcing模式,这时候test进程是不可以读取test.json的,会被明确拒绝。

01-01 20:15:07.355  1035  1035 I auditd  : type=1400 audit(0.0:23): avc: denied { read } for comm="test" name="test.json" dev="sda12" ino=25609 scontext=u:r:test:s0 tcontext=u:object_r:test_file:s0 tclass=file permissive=0 

关闭selinux:

关闭Selinux即将Selinux处于permissive模式,所以权限事件都会被记录下来,但不会强制执行。

adb root
adb shell setenforce 0
adb shell getenforce
Permissive     (返回结果)

如果Selinux处于关闭状态下,权限事件的log如下, 可以看到permissive=1,即可以确定当前处于permissive模式,这时候test进程可以读取test.json的,虽然log也打印出来了,但是这个log只是打印出来供用户读取,并不会起到任何拒绝的作用。

01-01 20:15:07.355  1035  1035 I auditd  : type=1400 audit(0.0:23): avc: denied { read } for comm="test" name="test.json" dev="sda12" ino=25609 scontext=u:r:test:s0 tcontext=u:object_r:test_file:s0 tclass=file permissive=1

三.RK3568上关闭selinux

project/device/rockchip/rk356x/xxxx/BoardConfig.mk 

在这个文件中关闭SELINUX,, BOARD_SELINUX_ENFORCING := false;

修改OK后,编译userdebug模式,Selinux已经关闭,但是切换到USER模式后Selinux还是打开状态。

查看代码发现system/core/init/selinux.cpp 有个isEnforcing()方法,

bool IsEnforcing() {
    if (ALLOW_PERMISSIVE_SELINUX) {
        return StatusFromCmdline() == SELINUX_ENFORCING;
    }
    return true;
}

Android.go 定义ALLOW_PERMISSIVE_SELINUX,默认值是0,debug模式下ALLOW_PERMISSIVE_SELINUX值是1,所以userdebug模式有效果,user模式没有效果,修改下默认值,如下补丁

Index: Android.bp
===================================================================
--- Android.bp    (revision 572)
+++ Android.bp    (revision 573)
@@ -109,7 +109,7 @@
         "-Wthread-safety",
         "-DALLOW_FIRST_STAGE_CONSOLE=0",
         "-DALLOW_LOCAL_PROP_OVERRIDE=0",
-        "-DALLOW_PERMISSIVE_SELINUX=0",
+        "-DALLOW_PERMISSIVE_SELINUX=1",
         "-DREBOOT_BOOTLOADER_ON_PANIC=0",
         "-DWORLD_WRITABLE_KMSG=0",
         "-DDUMP_ON_UMOUNT_FAILURE=0",

编译android后,关闭Selinux成功。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值