Android Selinux 实战

说明:以下内容为网上收集的资料,这里把有用的干货收集起来,去掉冗长的selinux一般性知识,只留下精华。

SELINUX 入门

1. SELINUX是可以理解为一种android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统
我们可以通过配置SELINUX的相关policy,来定制自己的手机的一些权限,比如,我们可以完全让root用户没有任何的权限和user一样
2. 在android里面,有两个类型,一种是文件,一种是进程。
针对这两种类型,我们可以先来看看他们的不同。
在android上面,adb shell之后进入手机,ps -Z可以查看当前进程所拥有的selinux的权限。

举例:

LABEL                          USER     PID   PPID  NAME
u:r:init:s0                    root      1     0     /init
u:r:kernel:s0                  root      2     0     kthreadd
...
u:r:kernel:s0                  root      258   2     irq/322-HPH_R O
u:r:logd:s0                    logd      259   1     /system/bin/logd
u:r:healthd:s0                 root      260   1     /sbin/healthd
u:r:lmkd:s0                    root      261   1     /system/bin/lmkd
u:r:servicemanager:s0          system    262   1     /system/bin/servicemanager
u:r:vold:s0                    root      263   1     /system/bin/vold
u:r:surfaceflinger:s0          system    264   1     /system/bin/surfaceflinger
u:r:tctd:s0                    root      265   1     /system/bin/tctd
u:r:rfs_access:s0              system    268   1     /system/bin/rfs_access
u:r:tee:s0                     system    271   1     /system/bin/qseecomd
u:r:kernel:s0                  root      280   2     kworker/3:1H
u:r:kernel:s0                  root      290   2     kauditd
u:r:rmt_storage:s0             nobody    291   1     /system/bin/rmt_storage
u:r:shell:s0                   shell     292   1     /system/bin/sh
u:r:netd:s0                    root      295   1     /system/bin/netd
u:r:debuggerd:s0               root      296   1     /system/bin/debuggerd
u:r:tee:s0                     system    297   271   /system/bin/qseecomd
在这个例子中,我们可以进行分析。
在android中,只定义了一个user即为u. 另外,如果是进程的话,都会统一定义为r,如果是文件的话,会被定义为object_r. 第三个是这个进程type,在andorid里面,定义了100多个type.按照目前我的理解,这个是进程所属的>类型。第四个是s0,这个是一个安全的等级。但是暂时还没有接触到配置这个的地方。

另外就是文件,文件想要查看相关SELINUX权限的话,需要去执行ls -Z
drwxr-x--x root     sdcard_r          u:object_r:rootfs:s0 storage
drwx--x--x root     root              u:object_r:tmpfs:s0 synthesis
dr-xr-xr-x root     root              u:object_r:sysfs:s0 sys
drwxr-xr-x root     root              u:object_r:system_file:s0 system
drwxrwxr-x system   tctpersist          u:object_r:tct_persist_file:s0 tctpersist
lrwxrwxrwx root     root              u:object_r:rootfs:s0 tombstones -> /data/tombstones
-rw-r--r-- root     root              u:object_r:rootfs:s0 ueventd.qcom.rc
-rw-r--r-- root     root              u:object_r:rootfs:s0 ueventd.rc
在这个例子中,结合上面的分析,我们知道了object_r是代表的文件,u是android的唯一的用户,rootfs是这个文件所对应的类型,s0是一个安全的等级限制。

标签、规则和域

SELinux 依靠标签来匹配操作和政策。标签用于决定允许的事项。套接字、文件和进程在 SELinux 中都有标签。SELinux 决定基本上是根据为这些对象分配的标签以及定义这些对象可以如何交互的政策做出的。在 SELinux 中,标签采用以下形式:user:role:type:mls_level,其中 type 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。

政策规则采用以下形式:allow domains types:classes permissions;,其中:

  • Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
  • Type - 一个对象(例如,文件、套接字)或一组对象的标签。
  • Class - 要访问的对象(例如,文件、套接字)的类型。
  • Permission - 要执行的操作(例如,读取、写入)。

使用政策规则时将遵循的结构示例:

allow appdomain app_data_file:file rw_file_perms;

这表示所有应用域都可以读取和写入带有 app_data_file 标签的文件。请注意,该规则依赖于在 global_macros 文件中定义的宏,您还可以在 te_macros 文件中找到一些其他非常实用的宏。这两个文件均位于 AOSP 源代码树的 system/sepolicy 目录中,其中提供了一些适用于常见的类、权限和规则分组的宏。应尽可能使用这些宏,以便降低因相关权限被拒而导致失败的可能性。

Type定义


type rootfs, fs_type;

上述语句表明类型rootfs具有属性file_type,即它是用来描述文件的安全上下文的。

type init, domain;

这样就可以表明init描述的类型是用来描述进程的安全上下文的。sepolicy文件类型定义:

type init, domain;

实战案例:


接下来我们以miui自带的服务shelld为例来描述如何给其配置安全上下文,使其能够正常工作。shelld: 这是一个使用binder通讯的binder服务,其是从init进程fork出来运行的进程.我们给shelld配置的相关SEAndroid的安全上下文如下te文件所示:

路径:miui/device/common/sepolicy/common/file_contexts

/system/xbin/shelld    u:object_r:shelld_exec:s0

如上所示te语句表明,将/system/xbin/shelld文件在打包system.img时设置安全上下文为u:object_r:shelld_exec:s0,用于保护其不被别的进程可以随意调用执行/system/xbin/shelld, 只有具有权限执行type为shelld_exec的进程才可以执行shelld.为了使其能够添加到servicemanager中去并且能够访问系统资源,我们作了如下配置:

路径:miui/device/common/sepolicy/common/shelld.te

# shelld

type shelld, domain;                                    # 设置shelld属于domain域,是一个进程的type

type shelld_exec, exec_type, file_type;      # 设置shelld_exec属于可执行文件的类型.

typeattribute shelld mlstrustedsubject;        # 设置shelld是一个可信任的主题

# init_daemon_domain是定义在external/sepolicy/te_macros中的一个宏,如果没有设置该条语句当shelld 从init进程fork出来执行后,shelld会被设置成和init进程拥有一模一样的安全上下文,其拥有和init进程一样的权限

# 设置之后,则当其从init进程fork出来之后,将被设置成shelld.te为shelld进程配置的安全上下文,其拥有同init进程不一样的权限.

init_daemon_domain(shelld)

#domain_auto_trans 也是定义在external/sepolicy/te_macros中的一个宏,设置了如下语句之后,表明shelld进程fork出shell进程来通 过exec执行shell程序时,shell程序将使用其自身的安全上下文,而不是shelld的

domain_auto_trans(shelld, shell_exec, shell)

#unix_socket_connect同样是定义在external/sepolicy/te_macros中的一个宏,设置完如下语句,表明shelld进程可以通过socket同本地服务进行通讯.

unix_socket_connect(shelld, property, init);

#binder_use宏表明shelld可以使用Binder同servicemanager进程进行IPC通讯

binder_use(shelld)

#binder_call允许shelld同对应domain的Binder服务端进程进行binder IPC通讯

binder_call(shelld, binderservicedomain)

binder_call(shelld, appdomain)

#binder_service宏表明shelld是Binder通讯的服务端进程

binder_service(shelld)

#如下语句允许shelld进程来设置自身DAC控制系统权限

allow shelld self:capability

{ setgid setuid dac_override chown fowner fsetid };

...

#如下语句表明允许scontext=shelld的shelld进程来访问tcontext=system_app_data_file安全上下文的目录和文件

# /data/data subdirectory for system UID apps.

allow shelld system_app_data_file:dir create_dir_perms;

allow shelld system_app_data_file:file create_file_perms;

...

# shell

#如下语句表明允许shelld进程可以执行type为shell_exec的文件

allow shelld shell_exec:file { rx_file_perms };

...

#如下语句允许shelld进程将shelld_service添加到servicemanager进程中去

allow shelld shelld_service:service_manager add;

shelld_service是一种service的安全上下文,其定义如下所示:

路径:android/device/common/sepolicy/common/service_contexts

*.shell        u:object_r:shelld_service:s0 #该条语句将名称为miui.shell的binder进程设置安全上下文为 u:object_r:shelld_service:s0

在将shelld_service设置为service_manager_type属性

路径:android/device/common/sepolicy/common/service.te

type shelld_service,        service_manager_type; #该条语句将shelld_service表明为一个service_manager_type的属性,具有这个属性的service才能够添加到 servicemanager中去.

进行了如下配置之后,再将如下添加到Makefile中的变 量BOARD_SEPOLICY_UNION,并将这些te配置文件所在的目录名称添加到BOARD_SEPOLICY_DIRS变量中,则运行命令$ make bootimage, 就能将对应的安全策略文件build进boot.img中在重启之后就能够由init进程加载到内核中去.或者可以将生成的sepolicy文件push到/data/security/current/sepolicy之后接着调用

$ adb push sepolicy /data/security/current/sepolicy

$ setprop selinux.reload_policy 1

使得init重新加载sepolicy,由于/data目录下有了sepolicy,所以它将使用这个新的。

为违反SEAndroid策略的进程配置安全上下文:

一般如果有进程违反SEAndroid策略,我们将在logcat或者dmesg中发现如下类似的log:

<12>[  12.835933] type=1400 audit(1325843.199:6): avc: denied { write } for pid=295 comm="installd" name="/" dev="mmcblk0p35" ino=2 scontext=u:r:installd:s0 tcontext=u:object_r:cache_file:s0 tclass=dir permissive=0

这样我们可以直接到对应的installd进程的安全策略文件中去添加如下类似语句就能够消除对应的违反规则:

路径:external/sepolicy/installd.te

allow installd cache_file:dir { write };

其中,installd就是log中scontext=u:r:installd:s0表明的domain主体安全上下文,cache_file就是log中tcontext=u:object_r:cache_file:s0的客体安全上下文,客体的类型是tclass=dir表明的dir类型,违反的规则是{ write }。



作者:恶魔殿下_HIM
链接:http://www.jianshu.com/p/a3572eee341c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。








  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值