您的位置:首页 > 移动开发 > Android开发

文件的安全上下文 ---- SEAndroid in Android 5.x

2015-12-02 15:21 441 查看
Android系统中的文件生成方式有两种:

1.ROM里面预设的。对于ROM里面预设的文件,我们使用预先定义的方式来确定他们的安全上下文。

2.动态生成的。对于动态生成的文件,原则上继承父目录的安全上下文。但有一些特别的情况下,我们会遵循预先设定的规则来设置他们的安全上下文。

在SEAndroid使用三种方式来设置文件的安全上下文。

1.设置打包在ROM里面的文件的安全上下文

      external/sepolicy/file_contexts

   文件部分内容如下:

# Root

/         u:object_r:rootfs:s0

# Data files

/adb_keys      u:object_r:adb_keys_file:s0

/default\.prop      u:object_r:rootfs:s0

/fstab\..*      u:object_r:rootfs:s0

/init\..*      u:object_r:rootfs:s0

/res(/.*)?      u:object_r:rootfs:s0

/ueventd\..*      u:object_r:rootfs:s0

这个文件中的所有路径都是定义在ROM中的,而不是在系统运行时动态生成的。也就是说,这些路径的安全上下文必须预先设置好。这个文件编译好之后,会存放在$OUT/root/file_contexts

路径按照最佳匹配的原则进行匹配,当遇到类似下面这种时,选择最符合的那一项:

/dev/block(/.*)?   u:object_r:block_device:s0

/dev/block/loop[0-9]*   u:object_r:loop_device:s0

/dev/block/ram[0-9]*   u:object_r:ram_device:s0

 2. 设置虚拟文件系统的安全上下文

external/sepolicy/genfs_contexts

文件内容如下:

# Label inodes with the fs label.

genfscon rootfs / u:object_r:rootfs:s0

# proc labeling can be further refined (longest matchingprefix).

genfscon proc / u:object_r:proc:s0

genfscon proc /net u:object_r:proc_net:s0

genfscon proc /net/xt_qtaguid/ctrl u:object_r:qtaguid_proc:s0

genfscon proc /cpuinfo u:object_r:proc_cpuinfo:s0

genfscon proc /sysrq-trigger u:object_r:proc_sysrq:s0

genfscon proc /sys/fs/protected_hardlinksu:object_r:proc_security:s0

genfscon proc /sys/fs/protected_symlinksu:object_r:proc_security:s0

genfscon proc /sys/fs/suid_dumpableu:object_r:proc_security:s0

genfscon proc /sys/kernel/core_patternu:object_r:usermodehelper:s0

genfscon proc /sys/kernel/dmesg_restrictu:object_r:proc_security:s0

genfscon proc /sys/kernel/hotplugu:object_r:usermodehelper:s0

genfscon proc /sys/kernel/kptr_restrictu:object_r:proc_security:s0

genfscon proc /sys/kernel/modprobeu:object_r:usermodehelper:s0

genfscon proc /sys/kernel/modules_disabledu:object_r:proc_security:s0

genfscon proc /sys/kernel/poweroff_cmdu:object_r:usermodehelper:s0

genfscon proc /sys/kernel/randomize_va_spaceu:object_r:proc_security:s0

genfscon proc /sys/kernel/usermodehelperu:object_r:usermodehelper:s0

genfscon proc /sys/net u:object_r:proc_net:s0

genfscon proc /sys/vm/mmap_min_addru:object_r:proc_security:s0

genfscon proc /sys/vm/dirty_ratio u:object_r:proc_dirty_ratio:s0

# selinuxfs booleans can be individually labeled.

genfscon selinuxfs / u:object_r:selinuxfs:s0

genfscon cgroup / u:object_r:cgroup:s0

# sysfs labels can be set by userspace.

genfscon sysfs / u:object_r:sysfs:s0

genfscon inotifyfs / u:object_r:inotify:s0

genfscon vfat / u:object_r:vfat:s0

genfscon debugfs / u:object_r:debugfs:s0

genfscon fuse / u:object_r:fuse:s0

genfscon pstore / u:object_r:pstorefs:s0

genfscon functionfs / u:object_r:functionfs:s0

genfscon usbfs / u:object_r:usbfs:s0

3. 设置应用程序数据文件的安全上下文

首先查看external/sepolicy/mac_permissions.xml

分析这个文件:
<!-- Platform dev key in AOSP -->
< signer signature="@PLATFORM" >
< seinfo value="platform" />
< /signer>


按照上面的signer的内容,表明当APP签名为@PLATFORM的时,则这个APP的seinfo为platform。

关于@PLATFORM的具体内容,在/external/sepolicy/keys.conf当中:

[@PLATFORM]

ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/platform.x509.pem

这个路径也就是:/build/target/product/security/platform.x509.pem

再看下面的default部分的内容,表明不符合上面筛选条件的APP,最后都会得到seinfo为default。
<!-- All other keys -->
<default>
<seinfo value="default" />
</default>


然后根据seinfo的内容platform,查看external/sepolicy/seapp_contexts,内容如下:

isSystemServer=true domain=system_server

user=system domain=system_app type=system_app_data_file

user=bluetooth domain=bluetooth type=bluetooth_data_file

user=nfc domain=nfc type=nfc_data_file

user=radio domain=radio type=radio_data_file

user=shared_relro domain=shared_relro

user=shell domain=shell type=shell_data_file

user=_isolated domain=isolated_app

user=_app seinfo=platform domain=platform_apptype=app_data_file

user=_app domain=untrusted_app type=app_data_file

根据匹配最符合项的规则,当一个签名为@PLATFORM的app安装时会得到seinfo=platform,对应这一行:

user=_app seinfo=platform domain=platform_apptype=app_data_file

该应用的进程domain就是platform_app ,该应用的数据文件的type就是app_data_file。

而一般的第三方应用得到的seinfo是default,并没有这个seinfo的条目,根据最匹配规则,则会对应到:

user=_app domain=untrusted_app type=app_data_file

进程domain为untrusted_app,应用的数据文件的type为app_data_file。

如果我们想要在系统中为自己的应用们增加一个特定的domain,名为anrom,那么需要做的事情是:

1./build/target/product/security/目录下,增加我们的签名pem文件:anrom.pem

2.在/external/sepolicy/keys.conf当中,增加我们的pem条目:

[@ANROM]

ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/anrom.pem

3.在external/sepolicy/mac_permissions.xml中,增加筛选我们的应用的内容:
  
<signer signature="@ANROM" >

<seinfo value="anrom" />

<package name="com.anrom.aaa">
<seinfo value="aaa" />
</package>

<package name="com.anrom.bbb">
<seinfo value="bbb" />
</package>

</signer>

<!-- All other keys --> <default> <seinfo value="default" /> </default>


signature="@ANROM",表示签名为@ANROM的APP,会进入这个标签筛选的范围中。

signer标签中有三个部分:

第一部分: 直接给出了一个seinfo

第二部分和第三部分:分别给出了两个package name "com.anrom.aaa" 和 "com.anrom.bbb"他们分别对应着seinfo "aaa" 和 "bbb"。

根据第二部分的内容,当一个APP签名为@ANROM,包名为“com.anrom.aaa”,这个APP会得到seinfo为aaa。

第三部分作用类似。

而其他签名为@ANROM的APP,则根据第一部分的内容,得到seinfo为anrom。

4.在external/sepolicy/seapp_contexts中,为seinfo指定domain和type。

user=_app seinfo=anrom domain=anrom_apptype=anrom_app_data_file

user=_app seinfo=aaa domain=aaa_app type=aaa_app_data_file

user=_app seinfo=bbb domain=bbb_app type=bbb_app_data_file

5.在external/sepolicy/路径下,创建新文件anrom_app.te,aaa_app.te和bbb_app.te

具体的文件内容,可以在platform_app.te的基础上进行修改。

6.在app.te文件中查看neverallow部分是否有不符合我们需求的部分,比如我们可能需要在neverallow规则中去掉anrom_app,那就需要我们将文件中所有出现的

neverallow { appdomain -platform_app}

全部改成

neverallow { appdomain -platform_app -anrom_app}

7.在file.te中,增加

type anrom_app_data_file, file_type, data_file_type;

type aaa_app_data_file, file_type, data_file_type;

type bbb_app_data_file, file_type, data_file_type;

8.在installd.te里面,为installld增加anrom_app_data_file类文件的操作权限(这里只列举anrom_app_data_file,剩下两个type类似操作)

allow installd { system_app_data_file bluetooth_data_filenfc_data_file radio_data_file shell_data_file app_data_fileanrom_app_data_file }:dir { create_dir_perms relabelfrom relabelto};

allow installd { system_app_data_file bluetooth_data_filenfc_data_file radio_data_file shell_data_file app_data_fileanrom_app_data_file }:lnk_file { create setattr getattr unlinkrename relabelfrom relabelto };

allow installd { system_app_data_file bluetooth_data_filenfc_data_file radio_data_file shell_data_file app_data_fileanrom_app_data_file }:{ file sock_file fifo_file } { getattr unlinkrename relabelfrom relabelto setattr };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: