安卓漏洞学习(二):Android系统序列化漏洞

概述

序列化是android系统中很常用也很重要的一个过程,此类漏洞正是利用序列化过程前后数据不匹配导致的越权操作,可以让攻击者重置手机pin码、安装或卸载用户应用。

漏洞细节

Parcelable是Android中实现序列化的一个接口。需要实现序列化的类只需要实现Parcelable接口和它的几个方法即可。其中writeToParcel、createFromParcel两个方法最为关键。这两个方法提供了序列化和反序列化的能力。writeToParcel中写入需要保存的数据,createFromParcel中按相同的顺序和类型读出。不对称的写入、读出会导致严重的安全问题。
传输Intent时,将Bundle对象转换序列化为包裹在Parcel中的字节数组,然后在从序列化Bundle中读取键和值后自动将其反序列化。在Bundle中,键是字符串,值几乎可以是任何值。 例如,它可以是原始类型,字符串或具有原始类型或字符串的容器。 它也可以是一个Parcelable对象。因此,捆绑包可以包含实现Parcelable接口的任何类型的对象。
当一个Parcelable对象在反序列化过程中使用in.readInt()来读取数据,而在序列化过程中却使用dest.writeLong()来写入数据时,就会导致两次操作的不一致性。这种不一致性会导致在序列化后的二进制表示中多出4个字节的0。由于这额外的4个字节,后续的解析过程会发生整体向后偏移4个字节的情况,从而导致解析异常。恶意攻击者可以利用这个漏洞通过精心构建的序列化数据来执行未授权的操作。这种错位的错误使得攻击者能够绕过安全检查,修改数据,执行未授权的代码,并可能导致权限提升。
举个例子,考虑以下的MyParcelable对象,当它进行反序列化时使用了in.readInt()来读取数据,而在序列化过程中却使用了dest.writeLong()来写入数据。这两次操作的不一致性会导致MyParcelable对象在序列化后的二进制表示中多出4个字节的0。由于这额外的4个字节,后续的解析过程会发生整体向后偏移4个字节的情况,进而导致解析异常。然而,通过巧妙构造的序列化数据,利用这种偏移错误,可以执行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值