美文网首页
第三方App访问SystemProperty遇到的一些坑

第三方App访问SystemProperty遇到的一些坑

作者: 蜗牛是不是牛 | 来源:发表于2023-06-06 16:18 被阅读0次

需求背景

之前介绍了App访问驱动节点所需要解决的权限问题,但只是针对某个项目,如果换一个项目,App和framework里面的节点路径都需要修改。现在需要优化一下,定义一个SystemProperty,将节点的值存放到该Property里面,第三方app直接读写这个Property,这样换项目之后,只需要修改framework的节点路径即可,app的源码不需要修改。

定义SystemProperty

device/qcom/msmnile_gvmq/system.prop中新增一个属性

#usb mode
persist.vendor.usb.mode=none

persist.vendor.usb已经在device/qcom/sepolicy_vndr/generic/vendor/common/property_contexts中定义了域空间名为vendor_usb_prop

persist.vendor.usb.        u:object_r:vendor_usb_prop:s0
ro.vendor.usb.             u:object_r:vendor_usb_prop:s0

vendor_usb_prop文件类型的定义device/qcom/sepolicy_vndr/legacy/vendor/common/property.te

type vendor_usb_prop, property_type;

adb shell中读写自定义property

image.png

第三方app中读写自定义property

因为SystemProperties类是系统私有类

image.png

第三方app无法直接访问此类中的方法,但是我们可以通过反射间接访问

public class SysProp {
    private static Method sysPropGet;
    private static Method sysPropSet;

    private SysProp() {
    }

    static {
        try {
            Class<?> S = Class.forName("android.os.SystemProperties");
            Method M[] = S.getMethods();
            for (Method m : M) {
                String n = m.getName();
                if (n.equals("get")) {
                    sysPropGet = m;
                } else if (n.equals("set")) {
                    sysPropSet = m;
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static String get(String name, String default_value) {
        try {
            return (String) sysPropGet.invoke(null, name, default_value);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return default_value;
    }

    public static void set(String name, String value) {
        try {
            sysPropSet.invoke(null, name, value);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

但此时会报avc错误

image.png

device/qcom/sepolicy_vndr/qva/vendor/common/untrusted_app.te中添加权限

allow untrusted_app property_socket:sock_file write;
allow untrusted_app vendor_usb_prop:file read;

编译报错

编译报neverallow冲突问题

image.png

不止这一个,还有很多其他的neverallow冲突问题,但最终都是根据报错信息,解除neverallow限制

image.png image.png

解除限制后,仍然报上述错误

image.png

查询资料得知可能跟MLS权限判断有关

mlsconstrain dir { read getattr search }
         (t2 == app_data_file or t2 == privapp_data_file or l1 dom l2 or t1 == mlstrustedsubject or t2 == mlstrustedobject);

mlsconstrain { file lnk_file sock_file chr_file blk_file } { read getattr execute }
         (t2 == app_data_file or t2 == privapp_data_file or t2 == appdomain_tmpfs or l1 dom l2 or t1 == mlstrustedsubject or t2 == mlstrustedobject);

于是给vendor_usb_prop的定义加上mlstrustedobject类型

type vendor_usb_prop, property_type, mlstrustedobject;

但仍然报上述错误。后请教同事得知,device/qcom/sepolicy_vndr/qva/vendor/common/untrusted_app.te根本没有编译到,我在此文件中随便修改后编译不报错,不仅如此,device/qcom/sepolicy_vndr/qva/vendor/common/device/qcom/sepolicy_vndr/legacy/vendor/common/路径下的te文件均没有被编译,就这个地方被坑了一个星期。

重新在device/qcom/sepolicy_vndr/generic/vendor/common/untrusted_app_25.te中添加权限,编译生效,但仍然存在nerverallow冲突的问题,但没有具体说明跟哪条neverallow规则冲突了

image.png

正常报错如下:

image.png

这个地方也琢磨了好几天,查阅了许多资料,并无收获。后经过逐步排查,跟untrusted_app、untrusted_app_all、untrusted_app_25、all_untrusted_apps这几个定义的区别有关,这几个定义不能随便使用,应该根据当前module中的定义来,尤其是untrusted_app_all和all_untrusted_apps。实际应用当中可以根据当前te文件里面来,当前te文件用的啥,我们就用啥,如果当前te文件没有用到,可以搜索当前module是如何定义的

image.png image.png

也可以两个都试一下,如果使用不对编译会报错

image.png

修改为正确的定义后仍然报上述错误,崩溃中......

selinux宏函数

静下心来,仔细思考问题原因,既然唯一声明vendor_usb_prop类型的te文件没有被编译到,那vendor_usb_prop到底在哪里声明类型的呢,再次全局搜索vendor_usb_prop,在device/qcom/sepolicy_vndr/generic/vendor/common/property.te中搜到了如下配置

vendor_internal_prop(vendor_usb_prop);

去研究了一下这种写法的含义,这是selinux的宏函数,表示一组selinux语法的组合,使用m4语言来写的,所以编译AOSP需要安装m4环境

sudo apt-get install m4

回到上面,vendor_internal_prop()函数的定义为

define(`vendor_internal_prop', `
  define_prop($1, vendor, internal)
  treble_sysprop_neverallow(`
# init and dumpstate are in coredomain, but should be able to read all props.
    neverallow { coredomain -init -dumpstate } $1:file no_rw_file_perms;
  ')
')

里面又引用了define_prop()函数,其定义为

define(`define_prop', `
  type $1, property_type, $2_property_type, $2_$3_property_type;
')

可以看到,vendor_usb_prop其实是在vendor_internal_prop(vendor_usb_prop)里面声明类型的,并且里面还声明了neverallow,之所以没有报具体冲突的代码行号,是因为neverallow定义在了宏函数里面,那么现在在宏函数里面剔除untrusted_app的限制,即加上-untrusted_app_all

define(`vendor_internal_prop', `
  define_prop($1, vendor, internal)
  treble_sysprop_neverallow(`
# init and dumpstate are in coredomain, but should be able to read all props.
# 剔除untrusted_app限制
    neverallow { coredomain -init -dumpstate -untrusted_app_all } $1:file no_rw_file_perms;
  ')
')

然后在device/qcom/sepolicy_vndr/generic/vendor/common/untrusted_app_25.te中添加该有权限配置

allow untrusted_app property_socket:sock_file write;
allow untrusted_app init:unix_stream_socket connectto;
allow untrusted_app vendor_usb_prop:file { map read write open getattr };
allow untrusted_app vendor_usb_prop:property_service set;

一个一个试,缺啥补啥,最终第三方app可以读写第三方属性了

image.png

总结

写完这个工具,现在对selinux有了更加深入的了解了,以后再遇到权限相关的问题,那不是手拿把掐。

相关文章

  • MacApp 自定义按钮关闭模态Window

    初入Mac App,过程坑定会遇到一些坑。但是经过不断的尝试,总归有解决的方式。 先说下我遇到的问题吧,在view...

  • Can't bind to 'rows' since it is

    angular 使用 ngx-datatable 遇到的坑 开始用这个组件的时候就遇到坑爹的事情,访问

  • react-native 文件上传

    作为react-native 的初级小白,项目中遇到文件上传的问题,遇到了一些坑点,记录如下: 第三方库的选择re...

  • 总结Hybrid App遇到的一些坑

    Hybrid App就是混合式App了,简单点说就是原生App里打开webApp,相当于原生给你提供了一个浏览器内...

  • App定位和地图的那些坑

    开发App时会遇到各种坑,本文分享我们在iOS/Android系统中定位和地图中遇到的坑,以及携程App的解决方案...

  • cordova:跳转第三方地图APP

    跳转第三方地图APP 本文章记录2020.08.10~2020.08.11给APP增加地图跳转踩过的坑 参考1:h...

  • iOS 指纹识别常见问题汇总

    最近公司的 app 要使用指纹支付了;总体来说还是蛮顺利的;但是中间有遇到一些坑;下面就对坑进行汇总; 一.基本知...

  • HyBrid APP遇到的坑

    1.webVIew reload方法不会带上请求头 2.okhttp在debug模式下会自动调用一次respons...

  • 使用uniapp开发app遇到的一些坑

    开发前10问10答 问 1、只需要编译成app,页面是否全部用nvue性能更好?2、nvue编译成app,是否全部...

  • iOS10 遇到的坑

    遇到的坑之一:[access] This app has crashed because it attempted...

网友评论

      本文标题:第三方App访问SystemProperty遇到的一些坑

      本文链接:https://www.haomeiwen.com/subject/byugedtx.html