android5.1权限问题导致段异常问题处理思路整理

段异常:


01-01 08:18:37.294   170   170 I DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-01 08:18:37.294   170   170 I DEBUG   : Native Crash TIME: 143572
01-01 08:18:37.294   170   170 I DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-01 08:18:37.294   170   170 I DEBUG   : Build fingerprint: 'Micromax/Q327/Q327:5.1/LMY47D/11221925:eng/test-keys'
01-01 08:18:37.294   170   170 I DEBUG   : Revision: '0'
01-01 08:18:37.294   170   170 I DEBUG   : ABI: 'arm'
01-01 08:18:37.294   170   170 I DEBUG   : pid: 3023, tid: 3099, name: Thread-370  >>> com.sprd.validationtools <<<
01-01 08:18:37.294   170   170 I DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xa3558882
01-01 08:18:37.324   170   170 I DEBUG   :     r0 00000000  r1 00000081  r2 7fffffff  r3 00000000
01-01 08:18:37.324   170   170 I DEBUG   :     r4 afc2adc0  r5 00001000  r6 a52aad68  r7 00ffffff
01-01 08:18:37.324   170   170 I DEBUG   :     r8 01ffffff  r9 afcc7888  sl b6e43ee1  fp a52aadb0
01-01 08:18:37.324   170   170 I DEBUG   :     ip a52aad40  sp a52aad60  lr b6e7fbe9  pc a3558882  cpsr 400e0030
01-01 08:18:37.334   170   170 I DEBUG   : 
01-01 08:18:37.334   170   170 I DEBUG   : backtrace:
01-01 08:18:37.334   170   170 I DEBUG   :     #00 pc a3558882  <unknown>
01-01 08:18:37.334   170   170 I DEBUG   :     #01 pc 00052be5  /system/lib/libc.so (sem_post+136)
01-01 08:18:37.334   170   170 I DEBUG   :     #02 pc 000cd19c  [anon:libc_malloc]




E/SprdOEMCamera( 5180): L 42, camera_init: failed to init camera -1


I/SprdOEMCamera( 5180): L 465, camera_lls_enable: 0


E/SprdOEMCamera( 5180): L 469, camera_lls_enable: camera handle is null


I/SprdOEMCamera( 5180): L 518, camera_set_lls_shot_mode: 0


E/SprdOEMCamera( 5180): L 522, camera_set_lls_shot_mode: camera handle is null


I/SprdOEMCamera( 5180): L 491, camera_vendor_hdr_enable: 0


E/SprdOEMCamera( 5180): L 495, camera_vendor_hdr_enable: camera handle is null


E/SprdOEMCamera( 5180): L 59, camera_deinit: param is null


F/libc    ( 5180): Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa36b888a in tid 5242 (Thread-630)


I/libc    ( 5180): Suppressing debuggerd output because prctl(PR_GET_DUMPABLE)==0


D/InputDispatcher(  614): Window went away: Window{5ec1f46 u0 com.sprd.validationtools/com.sprd.validationtools.itemstest.HardwareInfoTest}


I/WindowState(  614): WIN DEATH: Window{5ec1f46 u0 com.sprd.validationtools/com.sprd.validationtools.itemstest.HardwareInfoTest}


D/BarController.StatusBar(  614): setBarShowingLw state. show = false


D/InputDispatcher(  614): Window went away: Window{4720dd4 u0 com.sprd.validationtools/com.sprd.validationtools.ValidationToolsMainActivity}


D/InputDispatcher(  614): Window went away: Window{f93422 u0 com.sprd.validationtools/com.sprd.validationtools.itemstest.ListItemTestActivity}


I/WindowState(  614): WIN DEATH: Window{4720dd4 u0 com.sprd.validationtools/com.sprd.validationtools.ValidationToolsMainActivity}


D/BarController.StatusBar(  614): setBarShowingLw state. show = false


查看段异常上面的紧接着的log是camera初始化失败导致
查看camera初始化调用的过程log看到
E/sensor_drv_u( 5180): L 1583, sns_load_sensor_type: sns_load_sensor_type: file /data/misc/media/sensor.file open errorermission denied
在获取sensor_type的时候权限出现问题


抓取SLOG在kernellog中搜索avc如下:
01-01 08:02:55.622 <36>[  178.874145] c2 type=1400 audit(1420070575.609:24): avc: denied { read write } for pid=3074 comm="Binder_3" name="hardwareinfo" dev="tmpfs" ino=4355 scontext=u:r:mediaserver:s0 tcontext=ubject_r:hardwareinfo_dev:s0 tclass=chr_file permissive=0


mediaserver发出无权限
在mediaserver下增加hardwareinfo权限即可
allow mediaserver hardwareinfo_dev:chr_file { read write };


01-01 08:02:42.012 <36>[  115.302551] c3 type=1400 audit(1420070561.996:15): avc: denied { read write } for pid=2649 comm="Thread-295" name="sprd_sensor" dev="tmpfs" ino=7519 scontext=u:r:system_app:s0 tcontext=ubject_r:sensors_device:s0 tclass=chr_file permissive=0
01-01 08:03:01.632 <36>[  113.867340] c1 type=1400 audit(1420070581.615:15): avc: denied { open } for pid=2566 comm="Thread-272" path="/dev/sprd_sensor" dev="tmpfs" ino=8442 scontext=u:r:system_app:s0 tcontext=ubject_r:sensors_device:s0 tclass=chr_file permissive=0
01-01 08:02:24.092 <36>[  132.335388] c3 type=1400 audit(1420070544.073:14): avc: denied { ioctl } for pid=2975 comm="Thread-296" path="/dev/sprd_sensor" dev="tmpfs" ino=8501 scontext=u:r:system_app:s0 tcontext=ubject_r:sensors_device:s0 tclass=chr_file permissive=0


system_app
在system_app下增加sprd_sensor权限即可
allow system_app sensors_device:chr_file { ioctl open read write };




01-01 08:01:56.368 <36>[  104.612091] c3 type=1400 audit(1420070516.356:20): avc: denied { read write } for pid=2370 comm="Thread-231" name="sprd_isp" dev="tmpfs" ino=6576 scontext=u:r:system_app:s0 tcontext=ubject_r:camera_device:s0 tclass=chr_file permissive=0
01-01 08:01:56.378 <36>[  104.624359] c3 type=1400 audit(1420070516.366:21): avc: denied { read write } for pid=2366 comm="Thread-231" name="sprd_jpg" dev="tmpfs" ino=6577 scontext=u:r:system_app:s0 tcontext=ubject_r:graphics_device:s0 tclass=chr_file permissive=0
system_app
在system_app下增加sprd_sensor权限即可
allow system_app camera_device:chr_file rw_file_perms;
allow system_app graphics_device:chr_file rw_file_perms;


./wt bootimage
编译boot.img单独烧录boot.img即可验证


此时碰到了neverallow准则
libsepol.report_failure: neverallow on line 219 of external/sepolicy/app.te (or line 4203 of policy.conf) violated by allow system_app camera_device:chr_file { read write };
libsepol.check_assertions: 1 neverallow failures occurred


打开app.te可以看到
# Access to any of the following character devices.
neverallow appdomain {
    audio_device
    camera_device
    dm_device
    radio_device
    gps_device
    rpmsg_device
}:chr_file { read write };
而在4.4中并没有这个规范的限制,所以是可以使用的,在5.1上增加了规范,如下是展讯方的解释方案:


Android为了安全增加了很多neverallow策略,cts也有大量测试防止程序过度访问系统。比如app特别是untrusted_app有大量的限制。
遇到这类问题,分析步骤是:
首先可以确定的是nerverallow、cts是标准不可以修改的,必须通过其他方法来实现访问目的。


看是否可以修改主体的domain,并且为其配置相应权限来解决。明显不管什么apk都属于appdomain group,
无法怎么办都跳不出这个圈。因此修改domian方法在这里行不通。


看是否可以修改客体资源的上下文,这里的客体是dev_type group, 包含了所有的device,当然包括了mmc_blockdevice。
所以通过为客体指定文件上下文的方法在这里也是行不通的。
注意:faq的为xxx增加sysfs权限就是基于此思路解决问题的。当时问题的情况是系统neverallow app访问sysfs type文件, 这个sysfs不是group。所以可以为特定的sys文件指定新的上下文,这样就可以绕过了neverallow的限制了。


到了这里,实际上selinux已经没有其他办法了。这个时候需要修改代码让更高权限的domain来实现该功能。比如增加sys节点进行驱动,增加service进行服务或者其他方式。


我尝试了使用system_server.te下增加的camera_device的权限是有的
想尝试增加system_server的应用接口调用camera_init


如下是我搜索到的有用讯息,看意思是要再framework层增加一个随系统启动的自己的service,看样子代码工程量巨大:


为了更好地控制访问权限,如果存在APP层和framework层都要访问某个设备节点,笔者认为最好
以此模式来访问设备节点,即不让system_app进程访问,仅仅允许system_server进程来访问,
如下: allow system_server sysfs_wingtk_leds:file rw_file_perms; 
缺点:需要在framework层添加随系统启动的service,增加代码量 
优点:1.可以自由控制哪些应用可以访问,哪些应用禁止访问已经开放的设备节点,可以更好的
保护安全问题        
2.framework层和APP层都可以访问该设备节点.不用再另外进行权限申请 


最后我使用了本来就拥有camera_device权限的接口android.hardware.camera.open和android.hardware.camera.release成对开关
camera就解决了camera初始化缺乏型号的问题了,这个段异常的问题也解决了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值