SELinux和SEAndroid

模式

策略文件

位置

SELinux策略文件用于定义域和标签,以*.te结尾。

Android自带的策略文件位于AOSP中的system/sepolicy中,我们尽量不要去修改这里的策略,而是应修改位于device/manufacturer/device-name/sepolicy目录下(其实就是croot/device/制造商/设备/sepolicy/)的.te文件,同时也尽量不要去新建.te文件,而是应该在原有的基础上修改

其实这里说的尽量不要,主要是针对企业,因为google有可能会找你麻烦,而且后续更新也会遇到问题,但是如果自己玩的话,想改就改。不过还是不建议改默认实现,否则升级之后又回退了。

格式

1
allow source target:class permissions;

eg:

1
allow untrusted_app app_data_file:file {read write}; 

如果要添加的权限很多,为了简化规则定义,SEAndroid提供了宏,比如上面的例子可以这样写:

eg:

1
allow untrusted_app app_data_file:file rw_file_perms; 

上下文描述文件

device/manufacturer/device-name/sepolicy中存在各种上下文描述文件,主要负责为target打标签

列举

格式

我们打开file_contexts文件,查看一下格式:

1
2
/mnt/vendor/crypto(/.*)?                            u:object_r:mnt_vendor_crypto_file:s0
/(vendor|system/vendor)/bin/delete7dayslog.sh       u:object_r:delete_seven_day_log-sh_exec:s0

就是目录+标签的方式,看起来很像host的定义。

这里要注意的是:

BoardConfig.mk

当修改或添加了策略文件和上下文描述文件后,需要更新/device/manufacturer/device-name/BoardConfig.mk来引用生效。

eg:

1
2
3
4
5
6
7
BOARD_SEPOLICY_DIRS += \
        <root>/device/manufacturer/device-name/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te

最后需要需要重新编译才能生效!

启动用SELinux

  1. 在内核中启用(eg:在kernel/msm-5.4/kernel/configs/android-base.config)中配置:CONFIG_SECURITY_SELINUX=y;
  2. 更改Kernel_cmdline参数:BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive,发版前应该移除此参数以变更为强制模式;

查看开机时的拒绝事件

1
2
adb root
adb shell dmesg | grep audit | grep av

返回:

1
[    1.979517] audit: type=1400 audit(1.969:4): avc:  denied  { relabelfrom } for  pid=261 comm="init" name="/" dev="tmpfs" ino=10968 scontext=u:r:vendor_init:s0 tcontext=u:object_r:tmpfs:s0 tclass=dir permissive=0

查看SContext

标准的SContext格式如下:

1
user:role:type[:range]

文件的SContext

命令:ls -Z

1
 u:object_r:system_file:s0         system

进程的SContext

命令:ps -Z

1
2
3
LABEL          USER        PID   PPID    VSZ     RSS     WCHAN       ADDR S NAME                       
u:r:su:s0      root       25497  8935    9320    3144   sigsuspend      0 S sh
u:r:su:s0      root       27256  25497   11788   3128   0               0 R ps

最左侧LABEL这一列就是进程的SContext

==================================================to be continue========