公司网站建设比较好的公司,梅花手表网站,宁波网站建设seo,个人网站开发的现状Bundle的序列化细节看上去还是有些复杂的#xff0c;在之前已经讨论过#xff0c;一般我们使用Parcel的时候#xff0c;都是严格的write和read相对应。一些疏漏#xff0c;不对应#xff0c;竟然就可以成为漏洞#xff0c;https://xz.aliyun.com/t/2364 里介绍了Bundle漏…Bundle的序列化细节看上去还是有些复杂的在之前已经讨论过一般我们使用Parcel的时候都是严格的write和read相对应。一些疏漏不对应竟然就可以成为漏洞https://xz.aliyun.com/t/2364 里介绍了Bundle漏洞的情况详情可以去查看这里补充一些理解引用里面的原理图Bundle可以存储map键值对存储 key-value数量 key1 value1 key2 value2 ...根据key-value数量来控制读的次数来进行反序列化。当恶意bundle中存的data有key, intent第一个key-value存储的是有bug的对象这里是PeriodicAdvertisingReportOverridepublic 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对象会被这样利用起来作为错位工具。构造恶意Bundle使用了特意的组装而不是调用Parcelable对象里定义的构造方法。 pcelData.writeString(mismatch);pcelData.writeInt(4); // VAL_PACELABLEpcelData.writeString(android.bluetooth.le.PeriodicAdvertisingReport); // name of Class LoaderpcelData.writeInt(1);//syncHandlepcelData.writeInt(1);//txPowerpcelData.writeInt(1);//rssipcelData.writeInt(1);//dataStatuspcelData.writeInt(1);// flag for data就这样错位后的结构中原内容里的 key, intent数据 就冒充了Bundle中的第2个键值对来进行使用。 key, intent逃脱了权限检查。如同这样一个命令字串aaaabb2.ccccdddd第一条数据是aaaabb2.cccc第二条数据是dddd当解析错位以为2.cccc 是第二行就会以为第二条数据是cccc这个和sql注入有些相似。一些不经意的漏洞就会被别有用心的人利用甚至做出更加卑劣的行为。这里可以看出Parce的读写要规范不遵守规范各种机缘巧合或者机关算尽下就会出现匪夷所思的问题如下面这个汽车上树。参考资料https://xz.aliyun.com/t/2364https://blog.csdn.net/u010206565/article/details/129020951