之前一直在看的每月补丁分析的博客 https://wrlus.com/ 看起来是不再更新了,想了想反正自己每个月也要去追着看,干脆写一下分析得了,方便自己后面找。

本人很菜,分析的大部分都是 Java 层漏洞,大佬别骂我 QAQ

最初发表在我的 telegram 频道。每月补丁都会在此文中更新。

最后更新时间:2024/05/10 更新内容:添加 2024-05

2024-05-01

Framework

CVE-2024-0024 EoP High
创建用户时限制将用户名、账号名、账号类型这三个字符串的长度,否则长度可能会超出 BinaryXmlSerializer 的写入限制,导致后续 user restrictions 写入失败,创建出没有限制的用户。
疑问:我在今年1月4号就已经在 aosp 上看见了这个提交,为什么现在才放在安全公告里?

CVE-2024-0025 EoP High
发送非 PendingIntent 类型的 IntentSender 时避免携带 allowlist token。因为这个时候传入的 IIntentSender 实际上可能是 app 的一个 binder,再在上面调用 send 实际上相当于把 allowlist token 直接发送给了 app,然后这个 token 可以用来绕过很多的后台限制。
大概猜测一下利用方法:
创建一个自定义 IIntentSender
把它塞进一个 PendingIntent 里(PendingIntent 存放着一个 IIntentSender,这是它的真正实现)
把 PendingIntent 放进 notification deleteIntent 里
发送 notification 然后立刻取消,触发 deleteIntent 执行
PendingIntent.send() 把内部的 IIntentSender 传递到 sendIntentSender,因为这个 IIntentSender 不是 PendingIntentRecord,所以 IIntentSender.send() 被调用,此时会直接把 allowlist token 发给 app
妙啊,太妙了
疑问:1月4号我也看见了这个补丁,为什么现在才发出来?

CVE-2024-23705 EoP High
在 CVE-2024-0024 补丁的基础上限制 accountOptions 的大小,防止类似的问题。

CVE-2024-23708 EoP High
让系统发出的 toast 优先显示,保证其他应用不能通过发送大量 toast 的方式延后系统 toast 显示。同时把粘贴剪贴板文字的 toast 的显示时长加到 long。

System

(跳过 CVE-2024-23709)

CVE-2024-23706 EoP Critical
android health 相关的功能,禁止插入 record types 为空的 changelog。对这模块不是很熟,没看懂能干啥,也没看懂为啥定级这么高,待进一步分析。CVE 描述:In multiple locations, there is a possible bypass of health data permissions due to an improper input validation. This could lead to local escalation of privilege with no additional execution privileges needed. User interaction is not needed for exploitation.

CVE-2024-0043 EoP High
在 PermissionController 后端禁止给 work profile 中的应用授权监听通知。

CVE-2024-23707 EoP High
系统设置里 SearchResultTrampoline 把原来的用 getCallingActivity 判断调用者改成用 getLaunchedFromPackage,前者返回的是哪个 activity 会收到 onActivityResult 回调,后者返回的是实际启动 Activity 的人(Pending intent 按创建者算)

2024-04-01

这次补丁给我的感觉就是,像愚人节特辑

Framework

CVE-2024-23710 EoP High
如果一个 app 和特权 app 共享 UID,并且设置了 sharedUserMaxSdkVersion 且处于生效状态,那么 sharedUserId 的设置是无效的,这个时候不应该把它标记为特权 app

CVE-2024-23713 EoP High
NotificationManagerService migrateNotificationFilter 内如果传入的 disallowApps 并没有被安装就跳过它。猜测问题是可以传入超长字符串阻止 mRequestedNotificationListeners 被序列化,从而阻止数据变更被保存?

CVE-2024-0022 ID High
CompanionDeviceManagerService requestNotificationAccess 没有检查传入的 user id,而是留了个 TODO 在那里(写到一半想着先这样完事然后就忘了?),然后直接用这个 user id 取得一个 PendingIntent 并返回,然后发送这个 pending intent 实际上可以跳到对应用户的通知访问管理页面。这个问题我很早就注意到了,但是反馈被标 duplicate 了。

CVE-2024-23712 DoS High
AppOpsService 里过滤未被定义的 proxyAttributionTag (这啥?),同时把一个包里最大能定义的标签的数量从 10000 下调到 1000,防止大量数据造成 DoS。有待进一步分析。

System

CVE-2024-23704 EoP High
如果当前用户有 DISALLOW_ADD_WIFI_CONFIG 这个限制,不允许打开 WifiDialogActivity。

CVE-2023-21267 ID High
去年12月的补丁,原问题是有 app pining 的时候尝试按电源键 lockdown 会因为逻辑错误跳过锁屏。原来的补丁有问题,回滚了之后修复了问题重新提交。

CVE-2024-0026/CVE-2024-0027 DoS High
大量 snoozed notifications 可能导致的拒绝服务问题(这个问题不是修过几次吗怎么又来了?)。判断 snooze notification 数量是否超限的时候要把已经存进文件里的(mPersistedSnoozedNotifications 和 mPersistedSnoozedNotificationsWithContext)一并纳入计算。还修复了 repostGroupSummary 方法里没有把通知从 mPersistedSnoozedNotifications 和 mPersistedSnoozedNotificationsWithContext 里移除的问题,会导致不需要的通知数据始终被序列化,可能被滥用导致资源耗尽拒绝服务。

2024-03-01

Framework

(跳过了 CVE-2024-0049/CVE-2024-0050/CVE-2024-0051,三个都是 libstagefright 中的内存错误)

CVE-2024-0044 EoP High
过滤应用的“安装者包名”(可以通过 pm install -i 指定)里的非法字符。此漏洞细节:攻击者可以在“安装者包名”内插入换行符,之后系统会把该字段原样写进 /data/system/packages.list 里,伪造出新的条目,之后可以通过伪造的条目欺骗 run-as 从而获得受害应用的权限,可以操作内部目录等。
发现者的博客写的很清楚了:https://rtx.meta.security/exploitation/2024/03/04/Android-run-as-forgery.html
数据取证专用漏洞了属于是

CVE-2024-0046 EoP High
阻止系统应用被升级为 instant app(免安装应用 谷歌小程序)。免安装应用只能获得很小的一部分权限,攻击者可以利用该漏洞使特定系统应用的权限失效,从而绕过运营商限制。

CVE-2024-0048 EoP High
AccountManagerService 又上新补丁了。AccountManagerService 内部有一个超时机制,bind 到 Authenticator 后如果它长时间没响应就 unbind。搞笑的是,代码里根本没有任何地方启动这个机制,整个超时机制根本不会被触发。AccountManager API 最初在 Android 2.1 里加入,十几年过去了还能有这种问题,提前预定一个 2024 年最搞笑漏洞。

CVE-2024-0053 ID High
如果打印服务返回的自定义的打印机图标里的 URI 指向其他用户就把它过滤掉,防止看见其他用户的图像。最近这种漏洞真的好多好多。

CVE-2024-0047 DoS High
Android 14 中对设备管理(Android for Work 的功能)的重构中引入的 bug,设备管理员设置的 global restriction(对整个设备的限制)可能会被错误识别为 local restriction(对单个用户的限制),导致管理员无法撤销限制,设备功能受限。就算 bug 修好了,已经损坏的配置文件仍然是损坏的,为了让这些设备不清除数据就能正常工作还要加个 workaround。

System

(跳过了 CVE-2024-0039、CVE-2024-23717、CVE-2024-0045)

CVE-2023-40081 ID High
SystemUI 加载多媒体文件的图标时检查 URI 权限,防止跨用户读取

CVE-2024-0052 ID High
对 Android Health 这个功能不是很熟,看提交信息是如果调用者没有权限,部分 API 返回的数据要去除掉用户运动的路线信息。

2024-02-01

Framework

CVE-2024-0029 EoP High
DevicePolicyManagerService 里的逻辑 bug,保存禁止截屏的状态的时候只用了一个 int 保存被禁用的用户 id,在未受管用户启动的时候会覆盖掉之前设置的。

CVE-2024-0032 EoP High
DownloadStorageProvider 正确重写带有 includeHidden 参数的 queryChildDocuments()。
更多可参考 https://t.me/qianqianzhuang/4

CVE-2024-0034 EoP High
阻止壁纸服务从后台启动 activity。因为前台客户端绑定壁纸服务之后,会满足这一条豁免条件 “该应用的一项服务被另一个可见的应用绑定。绑定到该服务的应用必须保持可见,以便后台应用成功启动 activity。”
安卓 14 的 BAL 强化中限制了 target>=U 时必须指定 BIND_ALLOW_ACTIVITY_STARTS 才允许服务进程借用客户进程的状态启动,故该漏洞不影响 14

CVE-2024-0036 EoP High
startNextMatchingActivity 中设置 setAvoidMoveToFront 阻止后台启动 activity,具体可见 https://mp.weixin.qq.com/s/dbupJ3D-i0Da9ml1Pamu-w
这个接口漏了这么久都没人注意到确实挺难得的,当然我也没注意到,但是你看别人都没注意到,所以也不能怪我,你说是吧

CVE-2024-0038 EoP High
injectInputEventToInputFilter 中缺失调用者权限检查,只影响 14

CVE-2024-0041 EoP High
removePersistentDot 里的竞态条件,有可能导致 persistent dot 不会移除(然后会覆盖新显示的状态?)

CVE-2023-40122 & CVE-2024-0037 EoP High
检查自动填充相关传入的 URI,确保不会读取到其他用户的数据

CVE-2024-0040 ID High
MTP 协议处理中没有正确增大缓冲区大小,可能发生越界读

System

CVE-2024-0031 RCE Critical
蓝牙 GATT 协议栈里的越界写,理论可实现 RCE。这玩意真的几乎每个月都能搞一个 RCE 出来。

CVE-2024-0014 EoP High
该漏洞未公开补丁链接,似乎是 GMS 私有组件。漏洞描述:In startInstall of UpdateFetcher.java, there is a possible way to trigger a malicious config update due to a logic error. This could lead to local escalation of privilege with no additional execution privileges needed. User interaction is not needed for exploitation.

CVE-2024-0033 EoP High
libbinder 打开 memfd 时指定 F_SEAL_GROW | F_SEAL_SHRINK 阻止后续其他进程更改大小造成错误

CVE-2024-0035 EoP High
TileService 返回 null 时正确释放资源,阻止绕过后台启动前台 activity 的限制。更多可以参考 https://wrlus.com/android-security/bindservice-error-handle/

CVE-2023-40093 ID High
升级 pdfium 到 Chrome 114.0.5735.130 的

CVE-2024-0030 ID High
蓝牙组件里不充分的检查可能造成越界读

2024-01-01

Framework

CVE-2023-21245 EoP High
阻止在设备设置向导完成之前进入锁屏,可以插入一张需要 PIN/PUK 码解锁的 SIM 卡复现。应该是可以绕过恢复出厂保护(FRP,Factory Reset Protection),也就是所谓的激活锁。

CVE-2024-0015 EoP High
保证 DreamService 配置的 settingsActivity 属于应用自身,防止调用到非公开的 activity 造成 launch anywhere。向上搜索可以发现 SettingsLib 的 DreamBackend launchSettings() 这个方法会直接 startActivity,这里在 Settings 里运行所以是 system 权限。
题外话:DreamService 是 Android 4.2 加入的,十几年过去了,相关代码在2024年1月还能出现这么简单直接的漏洞确实有点不可思议。这个补丁早在2022年就创建了,而且更新的版本列表里并没有最新的14,于是我去看了下14的代码发现确实已经合进了这个补丁,然后我搜索这个补丁,发现这个漏洞早在2022年就被确认并被授予 CVE-2022-20550 这个编号,但是谷歌当时不知道怎么想的只给了 moderate 评级然后只给 pixel 修了。。。

CVE-2024-0018 EoP High
libstagefright 里无符号数运算不当导致意外结果的漏洞。

CVE-2024-0019 ID High
System UI 进程重启后,如果在重启之前有应用在进行敏感操作,并且现在还没结束,那么仍然应该显示隐私指示器。

System

CVE-2024-0021 EoP High
禁止工作空间(work profile)内的应用监听通知,只给 13 14 更新了,应该是以前正常的功能,大版本迭代不小心引入。

CVE-2024-0017 ID High
Camera2 如果是被其他 app 启动,而且启动它的这个 app 没有位置权限,返回的照片 exif 信息里不应该包含位置信息。之前的代码里有做判断,但是有问题,getCallingPackage 返回 null 的时候一律判定为不是 app 启动不需要过滤,但是如果 app 用 startActivity 而非 startActivityForResult ,getCallingPackage 本来就会返回 null,算是逻辑 bug。

CVE-2024-0020 ID High
设置铃声的时候检查传入的 URI,防止指向别的用户的数据。最近这种问题似乎很多很多。

2023-12-01

可能在野被积极利用的漏洞:CVE-2023-33063、CVE-2023-33107、CVE-2023-33106

Framework

CVE-2023-40077 EOP Critical
libstagefright 里的 UAF 问题

CVE-2023-40076 ID Critical
CredentialManagerUi 跑在 system_server,且创建 PendingIntent 的时候没有指定用户,默认会去用 context 对应的用户,然后指向 USER 0,其他用户拿到这个 PendingIntent 然后 send 就能跳转到主用户的凭据管理页面。不知道为什么定级这么高

CVE-2023-40079 EoP High
ShortcutService 启动 app 给出的 IntentSender 时指定 MODE_BACKGROUND_ACTIVITY_START_DENIED 防止 BAL

CVE-2023-40089 EoP High
DevicePolicyService.getCredentialManagerPolicy 需要传入 userId。感觉这个漏洞的实际影响情况可能是有跨用户权限的进程需要拿到其他用户的东西但是因为之前的设计问题所以拿不到?

CVE-2023-40094 EoP High
keyguardGoingAway 这个方法没检查调用者权限,然后所有 app 都能调用这个方法解除锁屏。

CVE-2023-40095 EoP High
又是一个忘了指定禁止 BAL 造成的 BAL bypass,这次是 requestGeofence 。

CVE-2023-40096 EoP High
更改的文件比较多,看起来是设置录音权限为仅前台时应用退到后台还会继续录音的问题。

CVE-2023-40103 EoP High
看提交信息是用 ApkAssets 的时候改成用基于引用计数的指针,防止 UAF/double free

CVE-2023-45774 EoP High
ShortcutService 校验传入的 uri。看 cve 描述是能指定其他用户的图像。

CVE-2023-45777 EoP High
最看不懂的一集
给了两个提交,第一个提交和九月份的 CVE-2023-35669 补丁是一样的,当时这个漏洞描述是 “there is a possible way to control other running activities”,第二个提交只是把弃用不带类型的 getParcelable 改成类型安全的,然而底下明明就有手动的类型检查,我觉得缺这个提交也没法利用,不知道为什么又分配了一个 CVE。看这个 CVE 的描述是能 Launch Anywhere ,不知道怎么能做到。

AccountManagerService 里使用不带参数类型的 getParcelable() 方法可能会导致反序列化出非预期的对象,调用到其他类的构造方法,导致 parcel 数据被修改,绕过 checkKeyIntentParceledCorrectly 的缓解措施。PoC: https://github.com/michalbednarski/TheLastBundleMismatch

CVE-2023-21267 ID High
在 lockdown 模式始终展示锁屏。看起来是有 app pinning 的时候尝试 lockdown 会因为逻辑错误跳过显示锁屏。

CVE-2023-40073 ID High
Notification style 相关的 uri 校验

CVE-2023-40081 ID High
MediaDataManager URI 校验。截止目前已经是第三个了。

CVE-2023-40092 ID High
ShortcutService 多个函数检查 user id,防止跨用户操作

CVE-2023-40074 DoS High
PersistableBundle 忽略无效数据,防止拒绝服务。

CVE-2023-40075 DoS High
限制能通过 addDynamicShortcuts 添加的快捷方式的数量。

System

这里面大部分洞都是比较传统的内存损坏,所以跳过了很多漏洞。

CVE-2023-40088 RCE Critical
蓝牙相关,com_android_bluetooth_btservice_AdapterService free callbackEnv 这个指针后没有置空,可能发生 UAF。不知道是不是我的错觉,总感觉近几个月能 RCE 的漏洞好像变多了。

CVE-2023-40097 EoP High
禁止创建目标为 Chooser 的快捷方式。没看懂有什么意义,看 CVE 描述是 URI grant。

CVE-2023-21394 ID High
添加 phone account 时检查给定的 URI,防止跨用户读取图片。嗯,第四个了。

CVE-2023-35668 ID High
又是 URI 相关的跨用户读取,这次还是 Notification 里……

CVE-2023-40098 ID High
看起来是有个叫 priority conversation widget 的东西,其他用户添加这个 widget 能看见主用户的通知。解决方法就是不让其他用户添加。