Parcel Bundle漏洞学习

文章介绍了Android中Bundle序列化过程中的一个安全漏洞,由于Parcel在写入和读取时的不严格对应,恶意构造的Bundle可以导致数据错位,从而绕过权限检查。举例说明了如何利用此类漏洞,并强调了规范使用Parcel的重要性,防止类似的安全问题发生。
摘要由CSDN通过智能技术生成

Bundle的序列化细节看上去还是有些复杂的,在之前已经讨论过,一般我们使用Parcel的时候,都是严格的write和read相对应。一些疏漏,不对应,竟然就可以成为漏洞,

https://xz.aliyun.com/t/2364 里介绍了Bundle漏洞的情况,详情可以去查看,

这里补充一些理解,

引用里面的原理图,

Bundle可以存储map键值对,存储 key-value数量 key1 value1 key2 value2 ...

根据key-value数量来控制读的次数,来进行反序列化。

  1. 当恶意bundle中存的data有<key, intent>

  1. 第一个key-value存储的是有bug的对象,这里是PeriodicAdvertisingReport

@Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(syncHandle);
        dest.writeLong(txPower);
        dest.writeInt(rssi);
        dest.writeInt(dataStatus);
        if (data != null) {
            dest.writeInt(1);
            dest.writeByteArray(data.getBytes());
        } else {
            dest.writeInt(0);
        }
    }
    private void readFromParcel(Parcel in) {
        syncHandle = in.readInt();
        txPower = in.readInt();
        rssi = in.readInt();
        dataStatus = in.readInt();
        if (in.readInt() == 1) {
            data = ScanRecord.parseFromBytes(in.createByteArray());
        }
    }

txPower的读写类型不一致,会造成错位。

系统中的这样有漏洞的Parcelable对象会被这样利用起来作为错位工具。

  1. 构造恶意Bundle,使用了特意的组装,而不是调用Parcelable对象里定义的构造方法。

        pcelData.writeString("mismatch");
        pcelData.writeInt(4); // VAL_PACELABLE
        pcelData.writeString("android.bluetooth.le.PeriodicAdvertisingReport"); // name of Class Loader
        pcelData.writeInt(1);//syncHandle
        pcelData.writeInt(1);//txPower
        pcelData.writeInt(1);//rssi
        pcelData.writeInt(1);//dataStatus
        pcelData.writeInt(1);// flag for data

就这样,错位后的结构中,原内容里的 <key, intent>数据 就冒充了Bundle中的第2个键值对来进行使用。

<key, intent>逃脱了权限检查。

如同这样一个命令字串,

  1. aaaabb'2.cccc

  1. dddd

第一条数据是aaaabb'2.cccc

第二条数据是dddd

当解析错位,以为2.cccc 是第二行,就会以为第二条数据是cccc

这个和sql注入有些相似。

一些不经意的漏洞,就会被别有用心的人利用,甚至做出更加卑劣的行为。

这里可以看出,Parce的读写要规范,不遵守规范,各种机缘巧合或者机关算尽下,就会出现匪夷所思的问题,如下面这个汽车上树。

参考资料

https://xz.aliyun.com/t/2364

https://blog.csdn.net/u010206565/article/details/129020951

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值