android 在4.3之后引入了基于selinux的安全机制,称为SEAndroid.在此之前,android使用的主要分为两个方面:应用程序和内核两个级别
应用程序就是通常所说的Permission,一个应用若想访问某个资源或者得到某个权限,需要在AndroidMannifest.xml配置申请,在安装的时候由用户来决定
内核级别就是传统的linux UID/GID,一个用户或者文件就是根据uid gid来进行rwx等操作。
最近在工作中,公司要基于aosp的SeAndroid上定制公司自己的安全策略文件,所以对此做了一些学习。边学边用,在此记录,方便以后阅读。
adb logcat|grep avc
如果设备启用了selinux,可以通过上面的方法看到log
android目前代码里面涉及到的地方主要有
-
external/libsepol(和上面一样是,不集成到设备上)
-
external/checkpolicy(.te检查,编译时调用)
-
external/sepolicy(这个SE for Android特有的部分,里面包含各种策略模块(*.te文件))
编译完成后会生成一个二进制的策略文件,运行时发现某个文件如果没有相应的权限就会执行一些操作
启用方法
device/xx/baytrail/device_name$ vim BoardConfig.mk
# SELinux Policy
BOARD_SEPOLICY_DIRS := device/xx/common/sepolicy
BOARD_SEPOLICY_REPLACE := \
domain.te
device/xx/common/sepolicy$ ls
adbd.te domain.te genfs_contexts init.te mediaserver.te property_contexts service_contexts surfaceflinger.te ueventd.te wpa.te
bluetooth.te drmserver.te gpsd.te kernel.te netd.te property.te service.te system_app.te untrusted_app.te
coreu.te file_contexts hdcpd.te keymaster.te platform_app.te pstore-clean.te setup_fs.te system_server.te userfastboot.te
device.te file.te init_shell.te keystore.te power_hal_helper.te recovery.te shell.te thermal.te vold.te
最重要的是.te文件的编写。
根据SELinux规范,完整的allow相关的语句格式为:
rule_name source_type target_type : class perm_set
下面这条SELinux语句表示 允许(allow )netd域(domain)中的进程 ”写(write)“
类型为proc的文件
avc: denied { getattr } for pid=1840 comm="userfastboot" path="/dev/block/mmcblk0p10" dev="tmpfs" ino=10720 sconte" path="/dev/block/mmcblk0p10" dev="tmpfs" ino=10720 scontext=u:r:userfastboot:s0 tcontext=u:object_r:frp_block_device:s0 tclass=blk_file permissive=1
上面这个是我最近调试userfastboot时遇到的问题,只需要添加如下allow 在userfastboot.te文件就可以解决了。
allow userfastboot frp_block_device:blk_file getattr;
从这个allow 可以看到怎么根据错误来改写相关的te规则。userfastboot是从scontext中获得。frp_block_device从tcontext获得 blk_file是从tclass获得 getattr是要执行的操作
再此只做简单记录,内部详细调用,不敢写的太详细,怕被查水表,虽然水表已经在外面了
阅读(2699) | 评论(0) | 转发(0) |