Android5 Lollipop 中關於 SELinux 安全機制調試筆記

轉自: 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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章