某大厂如何利用系统漏洞,控制用户整个手机系统
- 如果评论区没有及时回复,欢迎来公众号:ByteCode 咨询
- 公众号:ByteCode。致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、算法、译文、系统源码相关的文章
hi 大家好,我是 DHL。公众号:ByteCode ,专注有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、大厂面经。
近期研究机构在 「DarkNavy」 发文披露某国产 APP 利用系统漏洞提权,控制用户整个手机系统,达到了以下违规目的:
- 攻击竞争对手 App
- 窃取用户隐私数据
- 逃避隐私合规监管
- 用户无法卸载
- 改写系统配置文件为自身保活
- 隐蔽安装,提升装机量
- 伪造提升 DAU/MAU
- 通过远端“云控开关”控制非法行为的启动与暂停
- ……
PS:我已经将相关违规的 dex 转成了 Java 文件放到文末了,有兴趣的同学可以前往下载
在国外该 APP 已经被 GooglePlay 下架。谷歌公司发言人埃德·费尔南德斯在一份声明中表示:“将拼多多 APP 下架是一种安全预防措施,谷歌的软件防护服务 Google Play Protect 将会阻止用户从谷歌商店中下载拼多多的 APP,并且已经下载了该 APP 的用户也会收到警告,提示他们进行卸载”。
https://techcrunch.com/2023/03/20/google-flags-apps-made-by-popular-chinese-e-commerce-giant-as-malware/
俄罗斯知名的反病毒软件卡巴斯基也石锤它,该实验室的研究人员证实该 App 安装恶意代码,操控用户的手机系统。
该 APP 利用了 Android Parcel 序列化和反序列化不匹配系列漏洞,绕过系统校验,进行提权,获取系统级 StartAnyWhere 能力。这个漏洞最早是由 @BednarTildeOne 在 2014 年提交的 ParceledListSlice 漏洞。
什么是序列化和反序列化不匹配?
在 Android 中通过 Parcelable 序列化对象,而实现 Parcelable 接口,需要实现 readFromParcel
和 writeToParcel
函数。
public void writeToParcel(Parcel dest, int flags) { |
对变量 txPower
在写入的时候通过 writeLong
方法写入,但是在读取的时候通过 readInt
方法读取。这就是序列化和反序列化不匹配。
由于 Android 系统在大量的使用 IPC 都会进行序列化和反序列化,许多操作都会在 system_server 、Settings 应用、普通应用中来回传递。所以这个问题是非常常见的,这类问题对于普通人来说一般不会引起注意,但是 hacker 却可以利用它做出很多高危的事情,比如利用 Settings 和 system_server 进程的权限进行提权,发送任意 Intent,启动任意 Activity。
我们用 CVE-2017-13288 漏洞来举个例子:
- 普通 AppB 传递一个 Bundle 对象到
system_server
进程,这个 Bundle 对象中包含的一个恶意键值对{KEY_INTENT:intent}
- 在
system_server
进程中进行反序列化,将恶意KEY_INTENT
的内容读入到mData
中,此时,恶意KEY_INTENT
不是一个单独的键值对,因此可以逃避系统的checkIntent
检查 - 在
system_server
进程中再次将这个 Bundle 序列化,此时通过writeLong
方法写入到 Bundle 中,因此为占据 8 个字节 - 最终会传递到 Settings 系统应用(高权限 system 用户),在反序列化过程中,通过
readInt
方法进行读取,发生了 4 个字节的错位,因此把后面恶意KEY_INTENT
的 4 字节 length (ByteArray 4 字节对齐)当做mData
至此,键值对反序列化完成,恶意 KEY_INTENT
作为一个新的键值对就堂而皇之的出现了,最终的结果是取得 Settings 应用的权限(高权限 system 用户)发送任意 Intent,启动任意 Activity 的能力。例如,在 intent 中指定 Settings 中的 com.android.settings.password.ChooseLockPassword
为目标 Activity, 则可以在不需要原锁屏密码的情况下重设锁屏密码。
在整个过程中,最重要的就是如何绕过系统的 checkIntent
检查,需要在 Bundle 中精确布置数据,详细的可以参考 Bundle风水——Android序列化与反序列化不匹配漏洞详解 文章中的案例。
https://xz. aliyun. com/t/2364 #toc -2
这类漏洞并不是个例,历史上由于代码编写人员的粗心大意,曾经出现过许多因为「序列化与反序列化不匹配系列漏洞」 导致的提权漏洞,如下所示:
- CVE-2017-0806 GateKeeperResponse
- CVE-2017-0664 AccessibilityNodelnfo
- CVE-2017-13288 PeriodicAdvertisingReport
- CVE-2017-13289 ParcelableRttResults
- CVE-2017-13286 OutputConfiguration
- CVE-2017-13287 VerifyCredentialResponse
- CVE-2017-13310 ViewPager’s SavedState
- CVE-2017-13315 DcParamObject
- CVE-2017-13312 ParcelableCasData
- CVE-2017-13311 ProcessStats
- CVE-2018-9431 OSUInfo
- CVE-2018-9471 NanoAppFilter
- CVE-2018-9474 MediaPlayerTrackInfo
- CVE-2018-9522 StatsLogEventWrapper
- CVE-2018-9523 Parcel. wnteMapInternal0
- CVE-2021-0748 ParsingPackagelmpl
- CVE-2021-0928 OutputConfiguration
- CVE-2021-0685 ParsedIntentInfol
- CVE-2021-0921 ParsingPackagelmpl
- CVE-2021-0970 GpsNavigationMessage
- CVE-2021-39676 AndroidFuture
- CVE-2022-20135 GateKeeperResponse
- 更多……
在 2021 年的时候,AOSP 中针对 Bundle 提交了一个称为 LazyBundle(9ca6a5) 的的修复,主要修复思想,在序列化时的时候,将对应数据的大小添加到头部,然后在反序列化的时候,通过检查头部去选择性跳过,在实际用到这些值的时候再去对特定数据进行反序列化。
根据 「 深蓝洞察 」的报道,该 APP 第一步利用了多个安卓手机厂商 OEM 代码中的反序列化漏洞,进行提权,当提权成功之后,通过 App 控制了用户的整个手机系统,绕过隐私合规监管,大肆收集用户的隐私信息(包括社交媒体账户资料、位置信息、Wi-Fi 信息、基站信息甚至路由器信息等)。
另外还利用手机厂商 OEM 代码中导出的 root-path FileContentProvider
,进行 System App
和敏感系统应用文件读写。进而突破沙箱机制、绕开权限系统改写系统关键配置文件为自身保活,修改用户桌面 (Launcher) 配置隐藏自身或欺骗用户实现防卸载。
不仅如此,它还进一步通过覆盖动态代码文件的方式劫持其他应用注入后门执行代码,进行更加隐蔽的长期驻留。甚至还实现了和间谍软件一样的遥控机制,通过远端“云控开关”控制非法行为的启动与暂停,来躲避检测。已有大量终端用户投诉反馈:该 App 存在莫名安装、泄漏隐私、无法卸载等问题。
我将相关违规的 dex 转成了 Java 文件,并放到了 Android 项目中,方便有兴趣的同学查看,但是这个不方便公开,有兴趣的小伙伴,可以在后台留言,回复:pdd。
原始的 dex 文件。
地址: https://github.com/davinci1010/pinduoduo_backdoor
漏洞详细的分析报告。
地址: https://github.com/davincifans101/pinduoduo_backdoor_detailed_report
拼多多 VMP 脱壳机。
地址:https://github.com/davinci1012/pinduoduo_backdoor_unpacker
拼多多脱壳后的部分代码。
地址:https://github.com/poorjobless/pinduoduo_backdoor_code
参考文章
全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎在看、点赞、分享给身边的小伙伴,我会持续分享原创干货!!!
真诚推荐你关注我,公众号:ByteCode ,持续分享硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、动画、大厂面经。
我开了一个云同步编译工具(SyncKit),主要用于本地写代码,然后同步到远程设备,在远程设备上进行编译,最将编译的结果同步到本地,代码已经上传到 Github,欢迎前往仓库 hi-dhl/SyncKit 查看。
近期必读热门文章
- 广播 goAsync 源码分析,为什么 Google 大佬都在使用它
- 国外大厂面试题, 7 个 Android Lifecycle 重要的知识点
- Android 13这些权限废弃,你的应用受影响了吗?
- Android 利器,我开发了云同步编译工具
- Twitter 上有趣的代码
- 谁动了我的内存,揭秘 OOM 崩溃下降 90% 的秘密
- 反射技巧让你的性能提升 N 倍
- 90%人不懂的泛型局限性,泛型擦除,星投影
- 90%的人都不知道的知识点,Kotlin 和 Java 的协变和逆变
- 揭秘反射真的很耗时吗,射 10 万次耗时多久
- Android 12 已来,你的 App 崩溃了吗?
- Google 宣布废弃 LiveData.observe 方法
- 影响性能的 Kotlin 代码(一)
- 揭秘 Kotlin 中的 == 和 ===
开源新项目
云同步编译工具(SyncKit),本地写代码,远程编译,欢迎前去查看 SyncKit
KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 KtKit
最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 AndroidX-Jetpack-Practice
LeetCode / 剑指 offer,包含多种解题思路、时间复杂度、空间复杂度分析,在线阅读
- 本文作者:hi-dhl
- 本文标题:某大厂如何利用系统漏洞,控制用户整个手机系统
- 本文链接:https://hi-dhl.com/2023/04/09/Note/pingduoduo/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 hi-dhl