【问题标题】:Selinux: How to get another system service inside a system serviceSelinux:如何在系统服务中获取另一个系统服务
【发布时间】:2019-05-06 07:48:34
【问题描述】:

我有一个系统服务 KioskService。在这个系统服务中,我这样调用另一个系统服务 DpcService:

public class KioskService extends IKioskService.Stub{

    private Context mContext;
    private IDpcService dpcService;

    public KioskService(Context context) {
        mContext = context;
    }

    @Override
    public void exitKiosk()  {
        try{
            String[] emptyArray = {""};
            dpcService = IDpcService.Stub.asInterface(getBinder("dpc"));
            dpcService.setLockTaskPackages(emptyArray);
        }
        catch(Exception e){
            Log.e("TAG","Exit Kiosk Exception",e);
        }
    }

    private IBinder getBinder(String serviceName) {
        IBinder serviceBinder;
        serviceBinder = ServiceManager.getService(serviceName);

        if (serviceBinder == null) {
            return null;
        }

        return serviceBinder;
    }
}

但是我得到了这个错误:

05-06 06:40:00.088 604 604 E SELinux : avc: denied { find } for 服务=msi_dpc pid=5375 uid=1000 scontext=u:r:kiosk_app:s0 tcontext=u:object_r:dpc_service:s0 tclass=service_manager permissive=0

我猜,原因是因为使用 Selinux 策略,我必须允许我的 kiosk 服务使用我的 dpc 服务。如果是这样,我该怎么办?

【问题讨论】:

    标签: android selinux system-services


    【解决方案1】:

    是的,你是对的。您正在尝试通过 ServiceManager.getService 方法调用查找其他服务。因此,您的系统为此搜索操作生成了拒绝访问。可以有多种解决方案。对于我的建议,您必须拥有 audit2allow 库。(您可以轻松谷歌并下载) 但最简单的一个: 首先拉取当前系统策略文件;

    adb pull /sys/fs/selinux/policy SEPOLICY_FILE
    

    然后用那个 SEPOLICY 文件执行这个命令;

    cat /logs/logfile.log | audit2allow -p SEPOLICY_FILE
    

    它给你一些建议。日志文件显示您的完整访问拒绝消息。

    我希望它对你有用。

    【讨论】:

      猜你喜欢
      • 2015-06-03
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多