文件的安全上下文 ---- 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
分析这个文件:
按照上面的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。
然后根据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中,增加筛选我们的应用的内容:
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 };
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 };
相关文章推荐
- 用户和角色----SEAndroid in Android 5.x
- 概述----SEAndroid in Android 5.x
- 为android编译libkaliumjni和libsodium
- 爲android添加一個新的底層service…
- Android动画_ScaleAnimation
- android输入法ImeOptions
- Android Studio 创建项目的项目R文件不更新问题
- Android开发错误集锦
- Html5启动android app及两者间的数据交互全面总结
- Android Context完全解析
- 底部导航用FragmentTableHost实现
- Android Bundle类
- Android SDK 开发范例大全 ---3.9调用另一个Activity
- ImageView src Background 的区别
- Android动画_AlphaAniamtion
- Android学习笔记——五大基本布局+AbsoluteLayout
- Android--通知之Notification
- Android动画效果生动有趣的通知NiftyNotification(Android Toast替代品)
- NiftyNotification (Android Toast替代品)
- Android 程序框架设计