我在 /system/bin/ 目录中有一个 shell 脚本(AutoStartSvc.sh),它具有可执行权限。我想在按下遥控器的键码时从 IR 远程驱动程序触发这个 shell 脚本。我在远程驱动程序中使用“call_usermodehelper”API 来调用匹配 IR 密钥代码的 shell 脚本。
shell脚本内容:ifconfig wlan0 192.168.23.1 up
IR 远程驱动程序更改:
int result=-1;
char* argv[] = {"/system/bin/sh", "-c","/system/bin/DVBT2_WiFi_indoor_v11", NULL };
static char* envp[] = {"HOME=/","TERM=linux","PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin", NULL};
if(iscodematched() == 0) // checks the code match
{
free_irq(chip->irqno, chip);// call_usermodehelper won't work in interrupt mode so exit from the interrupt mode
printk("Key code matched. \n");
result = call_usermodehelper(argv[0], argv, envp, UMH_NO_WAIT);
printk("return value of call_usermodehelper: %d \n", result);
}
内核错误日志:
Key code matched.
[ 922.686115@2] type=1400 audit(1420080107.660:117): avc: denied { execute } for pid=7665 comm="kworker/u8:0" name="sh" dev="mmcblk0p12" ino=351 scontext=u:r:kernel:s0 tcontext=u:object_r:shell_exec:s0 tclass=file permissive=0
[ 922.667383@1] return value of call_usermodehelper: 0
我的试验:这是一个 avc:由于 android 的 sepolicy 而被拒绝。为了解决这个问题,我在 android 源代码的 /system/sepolicy/kernel.te 中做了以下更改
#added this line:
allow kernel shell_exec:file { getattr open read execute execute_no_trans rx_file_perms };
#uncommented the following line
neverallow kernel { file_type fs_type -rootfs }:file { entrypoint execute_no_trans };
即使在 kernel.te 中进行了上述更改,shell 脚本也没有被触发 no service denial 但是这次没有服务拒绝消息消失。但是“call_usermodehelper”的返回值为零。任何帮助表示赞赏。