当前位置: 首页 > news >正文

Parcel Bundle漏洞学习

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

@Overridepublic 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_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>逃脱了权限检查。

如同这样一个命令字串,

  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

http://www.lryc.cn/news/38702.html

相关文章:

  • RTP载荷H264(实战细节)
  • 软考高级信息系统项目管理师系列之四十三:信息系统安全管理
  • 并发编程之AtomicUnsafe
  • GDB调试快速入门
  • Vim一次复制,多次粘贴
  • 如何修改Win11上的默认程序?
  • 安装Linux虚拟机和Hadoop平台教程汇总及踩坑总结
  • Shell脚本的使用和介绍
  • 机械学习 - 基础概念 - scikit-learn - 数据预处理 - 1
  • OLCNE cluster 配置 NFS Storage(英文)
  • RabbitMQ高级特性
  • 利用Dockerfile开发定制镜像实战.
  • PyInstaller 将DLL文件打包进exe
  • 【JVM篇2】垃圾回收机制
  • LeetCode598. 范围求和 II(python)
  • 观察者模式与发布订阅模式
  • 磨金石教育摄影技能干货分享|烟花三月下扬州,是时候安排了!
  • Kafka 消费组位移
  • Python|数学|贪心|数组|动态规划|单选记录:实现保留3位有效数字(四舍六入五成双规则)|用Python来创造一个提示用户输入数字的乘法表|最小路径和
  • 【MySQL】MySQL的索引
  • 弱监督实例分割 Box-supervised Instance Segmentation with Level Set Evolution 论文笔记
  • Springboot是什么
  • LeetCode 134. 加油站(函数图像法 / 贪心)
  • 王道计算机组成原理课代表 - 考研计算机 第三章 存储系统 究极精华总结笔记
  • Flask-mock接口数据流程
  • springboot项目配置序列化,反序列化器
  • c++11 标准模板(STL)(std::unordered_map)(九)
  • Seay代码审计工具
  • 界面开发(4)--- PyQt5实现打开图像及视频播放功能
  • 核心系统国产平台迁移验证