找回密码
 会员注册
查看: 12|回复: 0

Android本地服务漏洞挖掘技术-上篇

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
67462
发表于 2024-10-9 13:33:21 | 显示全部楼层 |阅读模式
Android本地服务漏洞挖掘技术 - 上篇 OPPO安珀实验室 OPPO安珀实验室 OPPO安珀实验室 OPPO广东移动通信有限公司 以用户数据安全和隐私保护为核心,开展系列研究工作并向开发者开放技术能力,致力为合作伙伴及用户打造信息安全堡垒,为OPPO终端安全保驾护航 43篇内容 2023年11月30日 16:00 四川 概述在过去的一年里,安珀实验室团队重点对Android本地服务进行了漏洞挖掘,截止今日,向多个厂商提交了数百份有效漏洞报告,并已获得了数十个CVE编号。本系列我们会给大家详细分享我们在工作过程取得的一些技术成果。范围本文所有技术分析建立在以下前提:1.读者具备一定的Android或Linux平台的二进制漏洞挖掘能力;2.读者具备一定的逆向能力;3.手机已Root。本文不会对以下技术内容进行展开:1.访问控制权限分析;2.应用场景分析;3.完整利用链分析。基础知识本地服务,顾名思义即为后台运行在本地并通过某种机制监听,解析并答复来自客户端的数据请求的进程。通常来讲,其具有以下特点:1.开机自启动或通过某种特定条件触发启动,并以后台进程的形式运行;2.具备较高的权限;3.进程崩溃后会被重新拉起。按照不同的IPC类型,本地服务大体可分为两大类:基于Linux Socket的服务和基于Android Binder的服务。再根据其不同的命名空间和作用域将其细分,Socket服务可分为File System Socket服务和Abstract Socket服务;Binder服务可分为Origin Binder服务,AIDL Binder服务,HIDL Binder服务和Vendor Binder服务。Socket服务收集所有活动Socket服务通过使用netstap -ap | LISTENING命令,我们可以快速拿到大部分所需信息:类型(STREAM|DGRAM|SEQPACKET), 状态,进程号,进程名和路径。一般来讲,我们会过滤只要状态为LISTENING的服务,从而排除掉大部分的影响项。路径名以@开头的即为Abstract Socket服务,路径名为合法文件路径的则为File System Socket服务,不过在实际的漏洞挖掘中,其两者并没有区别,只是在构造验证程序的时候需要配置不同的参数,因此,后续我们将不再详细区分二者。常见漏洞类型根据历史经验,Socket服务的常见漏洞为:权限配置不当(SeLinux配置不当,白名单校验绕过等),命令注入,目录穿越,业务逻辑漏洞,信息泄露,拒绝服务,内存破坏等。本文重点会对服务在处理客户端数据时可能产生的漏洞进行分析。定位数据处理函数Android在libcutils基础库中提供了多个与socket相关的函数接口:其中android_get_control_socket用于获取指定socket名的文件句柄,socket_local_server和socket_local_server_bind用于创建socket服务。除了使用上述已封装好的接口以外,一些厂商也会直接使用原始的系统调用接口。int socket(int domain, int type, int protocol);找到创建socket句柄的地方后,通过如下调用链:socket -> bind -> listen -> accept -> read/recvfrom,可以快速定位到服务端接收数据的地方,再跟踪数据流,即可找到服务对客户端数据处理的函数。人工审计大部分socket服务的代码逻辑相对简单,而且多数为闭源代码,因此不太适合使用模糊测试(存在部分供应商的socket服务逻辑较为复杂,也适用于模糊测试,我们会在后续文章进行分享),我们是通过人工逆向审计反编译后的代码进行漏洞挖掘。这里以CVE-2023-35694举例,带大家过一下漏洞挖掘的过程。通过netstap 命令,我们可知/vendor/bin/dmd程序创建了一个监听在50002端口的TCP服务。使用反编译工具,定位到socket函数,然后查找函数调用。sub_18d20函数调用了socket -> bind -> listen的调用链,接着继续往上看调用方。根据交叉索引,其调用方为sub_18f50函数,该函数成功绑定套接字后,调用accept函数,然后在一个循环中使用select和recvfrom函数接收各个客户端发送过来的数据。根据recvfrom函数的参数,服务端将接收的数据存储在一个大小为0x10000字节的堆变量中,接着使用sub_1AB40函数对数据进行处理。sub_1AB40的第一个参数buf为指向输入数据头的指针,第二个参数size为输入数据的大小。函数会循环读取数据并完成对应的业务逻辑,漏洞出现在此行代码v4 = *(unsigned __int16 *)(v3 + 1) + 2LL,其中v3指针指向输入数据,那么这里的v4的值可控,其值理论最大值可为0x10001。代码在完全没有校验v4的合法值的情况下,将其作为长度字段,并用于计算指针偏移。那么通过控制v4的值,我们可以使得v3越界指向非法内存区域,从而导致越界读漏洞,进而造成更严重的安全风险。总结实际上,相比其他目标,Socket服务漏洞挖掘所需的技术难度较低,主要靠的是体力活。比如,如果你需要挖掘配置不当漏洞,需要排查其SeLinux规则,而挖掘内存破坏漏洞,需要人工逆向跟踪服务对数据的处理。并且,由于关注这一领域的安全研究者并不多,所以存量代码中存在不少的问题。另外有趣的一点是,不同供应商的Android设备的Socket服务数量存在很大的差异性:Google的全系产品只有极少的Socket服务,而高通和联发科在各个芯片平台上都存在大量的Socket服务,这可能是由于Socket服务具有较好的平台兼容性,可以同时运行在Linux和Android平台下。最后Socket服务通常只和HAL层通讯,因此其通常配置有较严格的SeLinux规则,普通应用或Shell应用均无法与其直接进行通信,因此大多数漏洞利用难度大,危害较低,各个厂商对此类漏洞的评级一般也不会高于中危。参考:1.https://www.blackhat.com/asia-22/briefings/schedule/#unix-domain-socket-a-hidden-door-leading-to-privilege-escalation-in-the-android-ecosystem-257742.https://source.android.com/docs/security/bulletin/pixel/2023-07-01END往期推荐·浅谈Android BLE蓝牙安全隐私问题·手把手系列之——syzkaller原理及实现分析·浅谈 Hybrid App·Android传感器安全分析·安全开发·数智未来 | OPPO安珀实验室,助力第七届安全开发者峰会(2023 SDC)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-3 02:23 , Processed in 0.464819 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表