Android5 Lollipop 中关于 SELinux 安全机制调试笔记

来源:互联网 发布:淘宝店铺号系统繁忙 编辑:程序博客网 时间:2024/04/29 12:42

转自: http://jingpin.jikexueyuan.com/article/55398.html



Android5 中,安全机制增强后, 自己写的 操作 串口 的APP 想正确运行, 都需要经过一番折腾.


我从 svn checkout http://android-serialport-api.googlecode.com/svn/trunk/ android-serialport-api-read-only 这里下了个老牌的串口测试程序, 编译到 API 21 版本, 成功生成 APK 文件, 在开发板上运行, 

会出现下面的错误(在android5 以前的版本是可以正常运行的)

[ 2675.458824] type=1400 audit(1435647256.801:4): avc: denied { read } for pid=2147 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 2685.263432] type=1400 audit(1435647266.601:5): avc: denied { read } for pid=2172 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 4740.602723] type=1400 audit(1435649321.941:6): avc: denied { read } for pid=9184 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 4818.779498] type=1400 audit(1435649400.121:7): avc: denied { read } for pid=9815 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 4842.962507] type=1400 audit(1435649424.301:8): avc: denied { read } for pid=9971 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0


google搜索了一下, 是因为SELinux安全机制, 需要grant合适的权限.


grant权限, 必须先知道自己的APP运行在哪种进程类型.

想知道自己的 进程(APP)属于什么 *.te 吗?

用 ps -Z 查看:

root@sabresd_6dq:/ # ps -Z
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      3     2     ksoftirqd/0
u:r:kernel:s0                  root      5     2     kworker/0:0H
u:r:kernel:s0                  root      7     2     migration/0
u:r:kernel:s0                  root      8     2     rcu_preempt
u:r:kernel:s0                  root      9     2     rcu_bh
u:r:kernel:s0                  root      10    2     rcu_sched
u:r:kernel:s0                  root      11    2     migration/1
u:r:kernel:s0                  root      12    2     ksoftirqd/1
u:r:kernel:s0                  root      13    2     kworker/1:0
u:r:kernel:s0                  root      14    2     kworker/1:0H
u:r:kernel:s0                  root      15    2     migration/2
u:r:kernel:s0                  root      16    2     ksoftirqd/2
u:r:kernel:s0                  root      17    2     kworker/2:0
u:r:kernel:s0                  root      18    2     kworker/2:0H
u:r:kernel:s0                  root      19    2     migration/3
u:r:kernel:s0                  root      20    2     ksoftirqd/3
u:r:kernel:s0                  root      21    2     kworker/3:0
u:r:kernel:s0                  root      22    2     kworker/3:0H
u:r:kernel:s0                  root      23    2     khelper
u:r:kernel:s0                  root      24    2     kdevtmpfs
u:r:kernel:s0                  root      25    2     suspend_sys_syn
u:r:kernel:s0                  root      26    2     suspend
u:r:kernel:s0                  root      28    2     kworker/1:1
u:r:kernel:s0                  root      30    2     kworker/3:1
u:r:kernel:s0                  root      31    2     writeback
u:r:kernel:s0                  root      32    2     bioset
u:r:kernel:s0                  root      33    2     crypto
u:r:kernel:s0                  root      34    2     kblockd
u:r:kernel:s0                  root      35    2     khubd
u:r:kernel:s0                  root      41    2     ipu1_task
u:r:kernel:s0                  root      42    2     ipu1_task
u:r:kernel:s0                  root      43    2     ipu2_task
u:r:kernel:s0                  root      44    2     ipu2_task
u:r:kernel:s0                  root      45    2     rpciod
u:r:kernel:s0                  root      46    2     kswapd0
u:r:kernel:s0                  root      47    2     ksmd
u:r:kernel:s0                  root      48    2     fsnotify_mark
u:r:kernel:s0                  root      49    2     nfsiod
u:r:kernel:s0                  root      86    2     kworker/0:3
u:r:kernel:s0                  root      87    2     spi32766
u:r:kernel:s0                  root      90    2     ci_otg
u:r:kernel:s0                  root      91    2     dm_bufio_cache
u:r:kernel:s0                  root      92    2     cfinteractive
u:r:kernel:s0                  root      93    2     irq/352-2198000
u:r:kernel:s0                  root      94    2     galcore workque
u:r:kernel:s0                  root      95    2     Vivante Kernel 
u:r:kernel:s0                  root      96    2     mmcqd/1
u:r:kernel:s0                  root      97    2     galcore daemon 
u:r:kernel:s0                  root      98    2     galcore daemon 
u:r:kernel:s0                  root      99    2     galcore daemon 
u:r:kernel:s0                  root      100   2     vpu_wq
u:r:kernel:s0                  root      101   2     binder
u:r:kernel:s0                  root      102   2     krfcommd
u:r:kernel:s0                  root      103   2     deferwq
u:r:kernel:s0                  root      104   2     f_mtp
u:r:kernel:s0                  root      105   2     file-storage
u:r:ueventd:s0                 root      106   1     /sbin/ueventd
u:r:watchdogd:s0               root      107   1     /sbin/watchdogd
u:r:kernel:s0                  root      109   2     kworker/0:1H
u:r:kernel:s0                  root      110   2     jbd2/mmcblk1p5-
u:r:kernel:s0                  root      111   2     ext4-dio-unwrit
u:r:kernel:s0                  root      112   2     jbd2/mmcblk1p4-
u:r:kernel:s0                  root      113   2     ext4-dio-unwrit
u:r:kernel:s0                  root      114   2     jbd2/mmcblk1p6-
u:r:kernel:s0                  root      115   2     ext4-dio-unwrit
u:r:kernel:s0                  root      116   2     jbd2/mmcblk1p7-
u:r:kernel:s0                  root      117   2     ext4-dio-unwrit
u:r:logd:s0                    logd      118   1     /system/bin/logd
u:r:healthd:s0                 root      119   1     /sbin/healthd
u:r:lmkd:s0                    root      120   1     /system/bin/lmkd
u:r:servicemanager:s0          system    121   1     /system/bin/servicemanager
u:r:vold:s0                    root      122   1     /system/bin/vold
u:r:surfaceflinger:s0          system    123   1     /system/bin/surfaceflinger
u:r:init_Shell:s0              root      124   1     /system/bin/sh
u:r:netd:s0                    root      125   1     /system/bin/netd
u:r:debuggerd:s0               root      126   1     /system/bin/debuggerd
u:r:drmserver:s0               drm       127   1     /system/bin/drmserver
u:r:mediaserver:s0             media     128   1     /system/bin/mediaserver
u:r:installd:s0                install   129   1     /system/bin/installd
u:r:keystore:s0                keystore  130   1     /system/bin/keystore
u:r:rild:s0                    root      131   1     /system/bin/rild
u:r:zygote:s0                  root      132   1     zygote
u:r:sdcardd:s0                 media_rw  134   1     /system/bin/sdcard
u:r:su:s0                      root      136   1     /sbin/adbd
u:r:kernel:s0                  root      151   2     kauditd
u:r:kernel:s0                  root      152   2     kworker/2:1H
u:r:kernel:s0                  root      157   2     kworker/3:1H
u:r:kernel:s0                  root      160   2     kworker/1:1H
u:r:system_server:s0           system    411   132   system_server
u:r:platform_app:s0            u0_a14    497   132   com.android.systemui
u:r:kernel:s0                  root      512   2     cfg80211
u:r:untrusted_app:s0           u0_a5     518   132   android.process.media
u:r:wpa:s0                     wifi      581   1     /system/bin/rtl_wpa_supplicant
u:r:untrusted_app:s0           u0_a34    620   132   com.android.inputmethod.latin
u:r:radio:s0                   radio     714   132   com.android.server.telecom
u:r:radio:s0                   radio     734   132   com.android.phone
u:r:untrusted_app:s0           u0_a7     775   132   com.android.launcher
u:r:kernel:s0                  root      813   2     RTW_CMD_THREAD
u:r:untrusted_app:s0           u0_a2     830   132   android.process.acore
u:r:untrusted_app:s0           u0_a27    873   132   com.android.deskclock
u:r:system_app:s0              system    1191  132   com.android.settings
u:r:untrusted_app:s0           u0_a10    1276  132   com.android.musicfx
u:r:bluetooth:s0               bluetooth 1379  132   com.android.bluetooth
u:r:dhcp:s0                    dhcp      1584  1     /system/bin/dhcpcd
u:r:untrusted_app:s0           u0_a20    1824  132   com.android.browser
u:r:kernel:s0                  root      1967  2     kworker/u8:1
u:r:platform_app:s0            u0_a39    1983  132   com.android.packageinstaller
u:r:platform_app:s0            u0_a29    2025  132   com.android.documentsui
u:r:platform_app:s0            u0_a3     2080  132   com.android.defcontainer
u:r:untrusted_app:s0           u0_a32    2107  132   com.android.gallery3d
u:r:untrusted_app:s0           u0_a40    2128  132   com.svox.pico
u:r:system_app:s0              system    9097  132   com.android.keychain
u:r:untrusted_app:s0           u0_a49    10723 132   android_serialport_api.sample
u:r:kernel:s0                  root      10994 2     kworker/0:1
u:r:su:s0                      root      11004 136   /system/bin/sh
u:r:su:s0                      root      11017 136   logcat
u:r:kernel:s0                  root      17033 2     kworker/u8:0
u:r:untrusted_app:s0           u0_a37    17138 132   com.android.music
u:r:kernel:s0                  root      19474 2     kworker/2:2
u:r:su:s0                      root      29110 11004 ps
root@sabresd_6dq:/ # 


我的  android_serialport_api.sample 进程安全策由 untrusted_app 这个组配置, 即是 需要修改  untrusted_app.te 文件. 可参见 http://blog.csdn.net/tung214/article/details/44461985 这篇文件

只是我修改的   untrusted_app.te 文件的位置不同, 我的是freescale开发板, 我修改的是  (android_root_file)/device/fsl/imx6/sepolicy/untrusted_app.te

添加:

<span courier="" new',courier,mono,serif;="" line-height:18px;="" orphans:2;="" widows:2"="" style="box-sizing: border-box;">allow untrusted_app tty_device:chr_file rw_file_perms



///////////////////////////

用 ls -Z 查看object的所属 domain,

ps -Z 查看进行 所属 domain

id -Z 查看当前用户信息


调试 SELinux 的权限设置, 需要学会看懂 log 中的信息

======================================================================================================

======================================================================================================


如果要让系统添加新的硬件支持, 比如添加一个4G模块, 这需要修改kernel和android framework层.


4G 模块驱动正确添加之后, 一般会生成 一个 网络接口 例如: eth0,  一个/dev 下的设备节点,  和 /dev 下 几个 ttyUSB*   虚拟串口....

在android 5 中使用这些节点, 需要做些审核策略设置.


查看设备节点的信息:

root@sabresd_6qd:/dev # ls -Z

crw------- root     root              u:object_r:device:s0 mxs_viim
crw------- root     root              u:object_r:device:s0 network_latency
crw------- root     root              u:object_r:device:s0 network_throughput
crw-rw-rw- root     root              u:object_r:null_device:s0 null
crw-rw---- radio    vpn               u:object_r:ppp_device:s0 ppp
crw-rw-rw- root     root              u:object_r:ptmx_device:s0 ptmx
drwxr-xr-x root     root              u:object_r:devpts:s0 pts
crw------- root     root              u:object_r:device:s0 qcqmi0
crw-rw-rw- root     root              u:object_r:random_device:s0 random
crw------- root     root              u:object_r:device:s0 rfkill
crw-r----- system   system            u:object_r:device:s0 rtc0
crw-rw---- bluetooth net_bt_stack          u:object_r:hci_attach_dev:s0 rtk_btusb
drwxr-xr-x root     root              u:object_r:audio_device:s0 snd
drwxr-xr-x root     root              u:object_r:socket_device:s0 socket
crw------- root     root              u:object_r:device:s0 sw_sync
crw-rw-rw- root     root              u:object_r:owntty_device:s0 tty


上面列表中, 设备节点归属哪个用户组, 哪个用户,  是在 一个 名称为  ueventd.freescale.rc 这个文件中定义的(每个platform 不同 , 名称也可能不同),

例如 

rtk_btusb 这个节点, 上面显示 属于 bluetooth 组, net_bt_stack 用户 所有, 参见下表, 正好与下表中定义吻合

#/dev/ttymxc4              0660   bluetooth  bluetooth
/dev/snd/*                0660   system     audio
/dev/ttyUSB*              0640   radio      radio
/dev/ttyACM*              0640   radio      radio
/dev/video*               0660   system     camera
/dev/video0               0660   system     camera
/dev/video1               0660   system     camera
/dev/video2               0660   system     camera
/dev/video16              0660   system     graphics
/dev/mxc_ipu              0660   media      system
/dev/mxc_vpu              0660   media      system
/dev/uinput               0660   system     bluetooth
#/dev/ttymxc2              0660   system     gps
/dev/ttya0                0660   system     gps
/dev/ptya0                0660   system     gps
/dev/ttya1                0660   system     gps
/dev/ptya1                0660   system     gps
/dev/ion                  0666   media      system
/dev/galcore          0666  system     graphics
/dev/graphics/fb0         0660   system     graphics
/dev/watchdog             0660   system     root
/dev/ir                   0660   system     system
/dev/mma8x5x              0640   compass     system
/dev/caam_kb              0660   system     system
/dev/rtk_btusb            0660   bluetooth  net_bt_stack

设备节点所属的 domain (域)  , 就由一个 名称为 file_contexts 的文件定义的 

在我的 file_contexts 中有一行关于 

rtk_btusb
的定义:

/dev/rtk_btusb u:object_r:hci_attach_dev:s0

这句话定义 rtk_btusb 这个设备节点属于 hci_attahc_dev 这个域中了

如果新的设备节点没有在 file_contexts 中定义, 那么默认属于  root 组 , root 所有





下面是定义 某个应用程序 能够使用某个节点  , 在rild.te中,  最后一行, 定义 rild 这个程序能够使用 tty_device 域中的节点, 

allow rild net_radio_prop:property_service {set};
allow rild ctl_default_prop:property_service {set};
#tootzoe
allow rild tty_device:chr_file rw_file_perms;



以下转自: 

http://blog.csdn.net/kc58236582/article/details/51752765


selinux(案例) recovery删除data目录下的文件



在recover升级的时候,我们有个需要从服务器上下载升级包,然后放在data/download,这部分工作是放在一个systemapp中完成的。

然后重启进入recoveyr模式,在recovery升级完之后,我们需要在recovery中删除这个文件,这部分是在recovery中完成。

功能很简单,但是在android6.0上碰到selinux的问题。

我们先来看recovery.te中是不允许recovery操作data下面的目录,也就是下面这个neverallow原则

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. # Recovery should never touch /data.  
  2. #  
  3. # In particular, if /data is encrypted, it is not accessible  
  4. # to recovery anyway.  
  5. #  
  6. # For now, we only enforce write/execute restrictions, as domain.te  
  7. # contains a number of read-only rules that apply to all  
  8. # domains, including recovery.  
  9. #  
  10. # TODO: tighten this up further.  
  11. neverallow recovery data_file_type:file { no_w_file_perms no_x_file_perms };  
  12. neverallow recovery data_file_type:dir no_w_dir_perms;  
我们再来看下system_data_file在file_contexts.te中的定义

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /data(/.*)?     u:object_r:system_data_file:s0  

而在file.te定义了system_data_file文件属于data_file_type类型,因此recovery也是不能操作data下面的文件
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ./file.te:56:type system_data_file, file_type, data_file_type;  

在我们可以自己定义自己的file类型,我们可以定义data/download属于download_data_file类型

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /data/download(/.*)?           u:object_r:download_data_file:s0  

然后在file.te中定义download_data_file类型, 注意是只属于file_type类型的。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. type download_data_file, file_type;   
然后在recovery.te中增加对download_data_file的权限
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. allow recovery download_data_file:dir { write search remove_name };  
  2. allow recovery download_data_file:file { read getattr unlink };  

另外我们还需在一个systemapp中先下载升级包,所以需要在system_app.te中增加对如下权限:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. allow system_app download_data_file:dir { search write add_name getattr remove_name };  
  2. allow system_app download_data_file:file { create read write open getattr unlink };  


但是最后还是失败了,为什么呢,因为一开始没有data/download这个目录,而是我们再app中自己下载的时候创建的目录,所以是system_data_file类型的。那么我们就需要在一开始就有data/download目录,所以在init.rc中添加如下代码:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. mkdir /data/download 0771 system system  

最后我们还需要在uncrypt.te中增加如下,因为data目录有可能需要进行加密处理。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. allow uncrypt download_data_file:dir { search getattr };  
  2. allow uncrypt download_data_file:file { getattr read open };  


最后这个问题就解决了。








allow rild net_radio_prop:property_service {set};
allow rild ctl_default_prop:property_service {set};
#tootzoe
allow rild tty_device:chr_file rw_file_perms;

0 0
原创粉丝点击