一 查看文件的Selinux屬性
ls -Zd /dev/
drwxr-xr-x root root u:object_r:device:s0
則/dev文件夾在android selinux中的domain是device
ls -Z /dev/video0
crw-rw---- system camera u:object_r:video_device:s0 video0
則/dev/video0在android selinux中的domain是video_device
二 查看自己的app進程的Selinux屬性
ps -Z | grep XXX
u:r:system_app:s0 system 13218 308 xxx.xxx.xxx
可以看到自己的app進程id為「system」, 在android selinux中的domain是system_app
三 查看自己的app在訪問/dev/video0時被selinux阻止的規則
點開自己的app(里面有打開/dev/video0的操作)
adb shell su root dmesg | grep 'avc: ' 或者直接在logcat中,就可以看到相應的selinux阻止操作的打印
<14>[ 274.162831] type=1400 audit(10202.409:93): avc: denied { getattr } for pid=2233 comm=".xxx.xxx" path="/dev/video2" dev="tmpfs" ino=8650 scontext=u:r:system_app:s0 tcontext=u:object_r:video_device:s0 tclass=chr_file permissive=0
<14>[ 274.162959] type=1400 audit(10202.409:94): avc: denied { read } for pid=2252 comm=".xxx.xxx" name="/" dev="tmpfs" ino=9783 scontext=u:r:system_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
我這里有兩個操作被阻止了
1. 對/dev/video2的getattr操作
denied { getattr }: 表明是getattr操作
path="/dev/video2": 表明是對/dev/video2的操作
scontext=u:r:system_app: 表明subject 的domain 是system_app
tcontext=u:object_r:video_device: 表明 target 的doumain 是 video_device
tclass=chr_file : 表明 target 的class 是chr_file
2. 對/dev文件夾的open操作
分析見上
四 那么如何修改sepolicy 使得權限對system_app放開呢
因為我有boot.img所以直接修改ramdisk里的sepolicy
1 解壓boot.img
2 使用xda 上提供的工具:selinux-inject修改sepolicy
a) selinux-inject: http://forum.xda-developers.com/android/software/setools-android-sepolicy-inject-t2977563
b) 修改規則:
-s 是subject
-t 是target
-c 是class
-p 是要添加的allow 的規則
./sepolicy-inject -s system_app -t video_device -c file -p getattr -P sepolicy2 -o sepolicy2 // 使得system_app對video_device有getattr權限
./sepolicy-inject -s system_app -t device -c dir -p open -P sepolicy2 -o sepolicy2 // 使得system_app對/dev有open權限
sesearch -A -s system_app -t device -c dir sepolicy2
sesearch -A -s system_app -t video_device -c chr_file sepolicy2 // 用來查看權限是否改成功了
3 壓縮回boot.img
4 fastboot flash boot new_boot.img
fastboot reboot
