SELinux权限问题解决参考

查看权限命令:
        cat /proc/kmsg | grep avc 
        dmesg | grep avc
        logcat | grep avc     

        ps -Z  查看进程上下文(主体)

        ls -Z 查看文件上下文(客体)


临时解决:
        setenforce 0   关闭权限
        setenforce 1   打开权限


永久性解决:由报错分析

  (服务权限)

E ServiceManager: add_service('godv',33) uid=1000 - PERMISSION DENIED
I zygote64: option[47]=Xfingerprint:Android/aosp_x86_64/generic_x86_64:8.1.0/OPM1.171019.011/godv06271014:eng/test-keys
D godv    : GodvService::godv_open
E SELinux : avc:  denied  { add } for service=godv pid=6508 uid=1000 scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0

分析过程:

        缺少什么权限:      { write }权限,

        谁缺少权限:        scontext=u:r:kernel:s0,

        对哪个文件缺少权限:tcontext=u:object_r:block_device

        什么类型的文件:    tclass=blk_file

解决方法:

        kernel.te                                                            (谁缺少权限  scontext)

        allow kernel block_device:blk_file write;      (添加的命令语句)

分析过程:
        缺少什么权限:      { add }权限,
        谁缺少权限:         system_server
        对哪个文件缺少权限:default_android_service
        什么类型的文件:    tclass=service_manager

解决方法:

        1.在service_contexts文件中添加,在service_contexts中声明godv_service服务对象

                godv        u:object_r:godv_service:s0                      (这个要与service名称一致) 

                路径(8.0)  AOSP/system/sepolicy/private

        2.在service.te文件中添加, 在service.te文件中定义godv_service的类型

                type godv_service, app_api_service, service_manager_type; (逗号内为6.0权限)

                路径(8.0)   AOSP/system/sepolicy/public

        3.在system_server.te文件中添加

                allow system_server  godv_service: service_manager add;

                路径(8.0)  AOSP/system/sepolicy/private

        4.还需要修改两个文件 Android : 為系統服務添加 SELinux 權限 (Android 9.0) - 开发者知识库

               参考链接


(可执行程序权限) 

12-25 11:51:27.260   147   147 W init    : type=1400 
		audit(0.0:4): avc: denied {execute_no_trans } for 
		path="/system/bin/test" dev="nandd" ino=476 
		scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 
		tclass=file permissive=0

分析过程:

        缺少什么权限:              execute_no_trans 
        谁缺少权限:                  init
        对哪个文件缺少权限:   system_file
        什么类型的文件:           file
解决方法:

    把缺少的权限添加上去,添加的过程如下。
        cd  fspad-733/androidL/external/sepolicy
        ①新建test.te文件中添加
         type test,domain;
        type test_exec,exec_type,file_type;
        init_daemon_domain(test) 
        ②在file_contexts文件中添加
         /system/bin/test           u:object_r:test_exec:s0
        ③在init.te文件中添加
            allow test system_file:file execute_no_trans;


设备权限:
        [53692.570392] type=1400 audit(12565266.940:42): avc: denied 
        { read write } for pid=10794 comm="m.example.hello" name="led1" 
        dev="tmpfs" ino=39430 scontext=u:r:untrusted_app:s0 
        tcontext=u:object_r:device:s0 tclass=chr_file permissive=0
        分析过程:
        缺少什么权限:            read  write
        谁缺少权限:                 scontext=u:r:untrusted_app:s0     untrusted_app
        对那个文件缺少权限:tcontext=u:object_r:device:s0    device 
        什么类型的文件:         tclass=chr_file       chr_file 
        解决方法:untrusted_app.te
        Allow untrusted_app device:chr_file {read write }

        把缺少的权限添加上去,添加的过程如下。
        cd  fspad-733/androidL/external/sepolicy
        ①修改file_contexts
              /dev/led1    u:object_r:led1_device:s0
        ②修改device.te
             type led1_device, dev_type(, mlstrustedobject); (括号内为6.0权限)
        ③修改  untrusted_app.te
             allow untrusted_app    led1_device:chr_file rw_file_perms; 
        添加好了之后重新编译Android的源码,烧写system.img和boot.img

你可能感兴趣的:(android)