轉自: 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原則
- # Recovery should never touch /data.
- #
- # In particular, if /data is encrypted, it is not accessible
- # to recovery anyway.
- #
- # For now, we only enforce write/execute restrictions, as domain.te
- # contains a number of read-only rules that apply to all
- # domains, including recovery.
- #
- # TODO: tighten this up further.
- neverallow recovery data_file_type:file { no_w_file_perms no_x_file_perms };
- neverallow recovery data_file_type:dir no_w_dir_perms;
- /data(/.*)? u:object_r:system_data_file:s0
而在file.te定義了system_data_file文件屬於data_file_type類型,因此recovery也是不能操作data下面的文件
- ./file.te:56:type system_data_file, file_type, data_file_type;
在我們可以自己定義自己的file類型,我們可以定義data/download屬於download_data_file類型
- /data/download(/.*)? u:object_r:download_data_file:s0
然後在file.te中定義download_data_file類型, 注意是隻屬於file_type類型的。
- type download_data_file, file_type;
- allow recovery download_data_file:dir { write search remove_name };
- allow recovery download_data_file:file { read getattr unlink };
另外我們還需在一個systemapp中先下載升級包,所以需要在system_app.te中增加對如下權限:
- allow system_app download_data_file:dir { search write add_name getattr remove_name };
- allow system_app download_data_file:file { create read write open getattr unlink };
但是最後還是失敗了,爲什麼呢,因爲一開始沒有data/download這個目錄,而是我們再app中自己下載的時候創建的目錄,所以是system_data_file類型的。那麼我們就需要在一開始就有data/download目錄,所以在init.rc中添加如下代碼:
- mkdir /data/download 0771 system system
最後我們還需要在uncrypt.te中增加如下,因爲data目錄有可能需要進行加密處理。
- allow uncrypt download_data_file:dir { search getattr };
- 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;