2023-07-01 security patch level vulnerability details
Framework
CVE-2023-21254
getUidProcessState
这个接口的AMS对外服务版本和AMInternal进程内版本的实现不一致,对外版本中如果满足mPendingStartActivityUids.isPendingTopUid(uid)
的条件,就直接返回PROCESS_STATE_TOP
,在这种场景下会导致一次性权限无法被正常清除。ActivityManagerService#getUidProcessState
的实现:@Override public int getUidProcessState(int uid, String callingPackage) { if (!hasUsageStatsPermission(callingPackage)) { enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, "getUidProcessState"); } // In case the caller is requesting processState of an app in a different user, // then verify the caller has INTERACT_ACROSS_USERS_FULL permission mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), UserHandle.getUserId(uid), false /* allowAll */, ALLOW_FULL_ONLY, "getUidProcessState", callingPackage); // Ignore return value synchronized (mProcLock) { if (mPendingStartActivityUids.isPendingTopUid(uid)) { return PROCESS_STATE_TOP; } return mProcessList.getUidProcStateLOSP(uid); } }
ActivityManagerInternal#getUidProcessState
的实现:// NOTE: this is an internal method used by the OnShellCommand implementation only and should // be guarded by permission checking. int getUidState(int uid) { synchronized (mProcLock) { return mProcessList.getUidProcStateLOSP(uid); } }
- 很明显的除了权限检查之外,就差了一个
mPendingStartActivityUids.isPendingTopUid(uid)
的条件判断。想让判断成立需要走PendingStartActivityUids#add
/** Returns {@code true} if the uid is put to the pending array. Otherwise it existed. */ synchronized boolean add(int uid, int pid) { if (mPendingUids.get(uid) == null) { mPendingUids.put(uid, new Pair<>(pid, SystemClock.elapsedRealtime())); return true; } return false; }
- 只有一个地方可以实现,即
ActivityManagerService#addPendingTopUid
@Override public void addPendingTopUid(int uid, int pid, @Nullable IApplicationThread thread) { final boolean isNewPending = mPendingStartActivityUids.add(uid, pid); // If the next top activity is in cached and frozen mode, WM should raise its priority // to unfreeze it. This is done by calling AMS.updateOomAdj that will lower its oom adj. // However, WM cannot hold the AMS clock here so the updateOomAdj operation is performed // in a separate thread asynchronously. Therefore WM can't guarantee AMS will unfreeze // next top activity on time. This race will fail the following binder transactions WM // sends to the activity. After this race issue between WM/ATMS and AMS is solved, this // workaround can be removed. (b/213288355) if (isNewPending) { mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid, OomAdjuster.OOM_ADJ_REASON_ACTIVITY); } // We need to update the network rules for the app coming to the top state so that // it can access network when the device or the app is in a restricted state // (e.g. battery/data saver) but since waiting for updateOomAdj to complete and then // informing NetworkPolicyManager might get delayed, informing the state change as soon // as we know app is going to come to the top state. if (isNewPending && mNetworkPolicyUidObserver != null) { try { final long procStateSeq = mProcessList.getNextProcStateSeq(); mNetworkPolicyUidObserver.onUidStateChanged(uid, PROCESS_STATE_TOP, procStateSeq, PROCESS_CAPABILITY_ALL); if (thread != null && shouldWaitForNetworkRulesUpdate(uid)) { thread.setNetworkBlockSeq(procStateSeq); } } catch (RemoteException e) { Slog.d(TAG, "Error calling setNetworkBlockSeq", e); } } }
- 这个接口不是IPC接口,在system_server内部调用他的只有这里:
void onStartActivity(int topProcessState, ActivityInfo info) { String packageName = null; if ((info.flags & ActivityInfo.FLAG_MULTIPROCESS) == 0 || !"android".equals(info.packageName)) { // Don't add this if it is a platform component that is marked to run in multiple // processes, because this is actually part of the framework so doesn't make sense // to track as a separate apk in the process. packageName = info.packageName; } // update ActivityManagerService.PendingStartActivityUids list. if (topProcessState == ActivityManager.PROCESS_STATE_TOP) { mAtm.mAmInternal.addPendingTopUid(mUid, mPid, mThread); } prepareOomAdjustment(); // Posting the message at the front of queue so WM lock isn't held when we call into AM, // and the process state of starting activity can be updated quicker which will give it a // higher scheduling group. final Message m = PooledLambda.obtainMessage(WindowProcessListener::onStartActivity, mListener, topProcessState, shouldSetProfileProc(), packageName, info.applicationInfo.longVersionCode); mAtm.mH.sendMessageAtFrontOfQueue(m); }
- 所以就是刚启动Activity的时候就处于这个状态,想保持这个状态需要启动Activity之后马上退出,正如修复补丁中所说:
Install test app that requests permission and will exit immediately on granting, observe permission is no longer indefinitely held.
2023-06-01 security patch level vulnerability details
Framework
CVE-2023-21127
- libstagefright中理论上可实现的RCE,2023年了还有这种类型的漏洞还是很有意思的。
CVE-2023-21126
CVE-2023-21139
PendingIntent.queryIntentComponents
的实现存在错误,没有考虑创建者UID而是只看了发送者的UID,这就导致了一些并不匹配intent-filter的隐式Intent也能被包含在PendingIntent.queryIntentComponents
的返回结果中,因为正常的情况下只有同UID或者system uid这类可以豁免不匹配intent-filter的隐式Intent限制。比较典型的场均就是,system UID发送的PendingIntent,没有考虑创建者UID的情况下,可以完全豁免,详见:https://developer.android.com/about/versions/13/behavior-changes-all?hl=zh-cn#intents
CVE-2023-21131
- AccountManagerService又上新补丁啦,这次是要求序列化前后的Selector要一致。
if (intent.getSelector() != simulateIntent.getSelector()) { return false; }
CVE-2023-21105
- 防止ChooserActivity预览非属主的URI
System
CVE-2023-21138
- CallRedirectionProcessor在onBind返回NULL的时候要进行unBind操作,防止攻击者提供一个空绑定但是未进行unBind操作,使得后台Activity限制被绕过。因为CallRedirectionService属于豁免条件之一,详见:https://developer.android.com/guide/components/activities/background-starts
2023-05-01 security patch level vulnerability details
Framework
CVE-2021-39617
- SurfaceFlinger中的Layer,将DrawingState::trustedOverlay初始化为false,避免未初始化的值导致可能随机为true的问题。
CVE-2022-20338
android.net.Uri
的修复,对scheme和authority做更严格的检查,还没有测试这项更改,不过根据测试用例来看很多相关https://google.com/@evil.com
这样的pattern。
CVE-2023-20993
- SnoozeHelper中限制SnoozedNotification的key长度最大为1000。
CVE-2023-21109
- 解析AccessibilityService的XML时,如果XML长度太长则忽略这个服务,如果在更新信息时变得太长则抛出一个错误。
CVE-2023-21117
- 禁止isolated用户注册任何广播接收器,包括未导出的。
CVE-2023-20914
- 停止向受管理的配置文件用户授权READ_SMS权限。
CVE-2023-21104
- applySyncTransaction接口必须要求具有MANAGE_ACTIVITY_TASKS权限才能调用。
CVE-2023-20930
- 限制应用允许添加的最大ShortCut个数。
CVE-2023-21116
- 禁止将预装应用降级到比预装的版本还低的情况。
CVE-2023-21110
- 修复同CVE-2023-20993
System
CVE-2022-20444
- 没有trustedOverlay标志的Toast不应接收输入,同时不允许有任何子窗口。
CVE-2023-21107
- 必须使用INTERACT_ACROSS_USERS_FULL权限来跨用户访问通知内容,当然还要有通知使用权的权限。
CVE-2023-21112
- NFC模块NxpMfcReader文件的AnalyzeMfcResp中的越界读取。
CVE-2023-21118
- SensorManager里面内存泄露和内存对齐的问题。
CVE-2023-21103
CVE-2023-21111
- PhoneAccount中的各种限制,解决DoS的问题,最近这种问题似乎有很多。
2023-04-01 security patch level vulnerability details
Framework
CVE-2023-21081
- 修复了PackageManager API中的一些PendingIntent导致后台前台服务启动限制(BG-FGS)和后台弹出界面限制(BAL)绕过的问题。涉及的API有:
PackageInstaller.uninstall() PackageInstaller.installExistingPackage() PackageInstaller.uninstallExistingPackage() PackageInstaller.Session.commit() PackageInstaller.Session.commitTransferred() PackageManager.freeStorage()
CVE-2023-21088
- 修复
LocationManager.requestFlush
接口后台弹出界面限制(BAL)绕过的问题,需要在Options里面加setPendingIntentBackgroundActivityLaunchAllowed(false)。
CVE-2023-21089
- startInstrumentation只允许shell uid使用,这个修复补丁终结了很多保活和拉活手段。
CVE-2023-21092
- 注册广播接收器时,检查传入的包名和UID是否相匹配。
CVE-2023-21094
- applyTransactionState中的权限绕过导致越权截屏等危害。
CVE-2023-21097
- 在将Intent转成URI时对scheme进行转义,避免scheme中出现保留字符而造成错误。
CVE-2023-21098
- AccountManagerService中修复了checkKeyIntentParceledCorrectly的绕过,之前当调用addAccount时如果第一次没有显示出KEY_INTENT,就会被绕过。这问题在去年的补丁一出来就有人看出来了,估计第一时间有人报了并修复的。
CVE-2023-21090
- uses-permission标签中权限名字的长度不能超过512字节。
CVE-2023-20950
- 把Android 13中的后台弹出界面限制(BAL)代码回合到Android 12等,防止通过AlarmManager去绕过BAL。
System
CVE-2023-21085
- NFC模块中nci_snd_set_routing_cmd函数的越界写入,导致远程代码执行。
CVE-2023-21096
- AttributionProcessor::OnWakelockReleased中的UAF漏洞。
CVE-2022-20463
- 恢复网络设置的时候删除证书
CVE-2023-20967
- AVDT协议的avdt_scb_hdl_pkt_no_frag函数中的越界读取。
CVE-2023-21084
- 对system和vendor镜像设置avb_hash_algorithm=sha256,此前是SHA-1可能不够安全。
CVE-2023-21086
- 只允许主用户控制Secure NFC。
CVE-2023-21093
- MediaProvider使用getCanonicalPath实现路径正规化,防止路径穿越问题。
CVE-2023-21099
- commit链接和CVE-2023-21081是一样的。
CVE-2023-21100
- external/angle中对gzip头的extra字段处理问题。
CVE-2022-20471
- NFC中NxpMfcReader::SendIncDecRestoreCmdPart2函数的越界读取。
CVE-2023-20909
- createRecentTaskInfo的时候,如果调用方没有特权就不能创建和自己UID不同的TaskInfo。
CVE-2023-20935
- 神经网络模块中ExecutionBurstController里面的越界读取。
CVE-2023-21080
- 蓝牙btif的register_notification_rsp函数中存在越界读取。
CVE-2023-21082
- 在打电话的Intent中不允许处理非tel和sip的URI,比如content的,猜测漏洞可能是校验不严格导致URI grant?
CVE-2023-2108
- 在ScreeningService的onBind中如果收到了空的调用确保服务可以正确unbind。
CVE-2023-21091
- AppLocalePickerActivity中增强了校验,防止DoS的问题,这个没太看出来。
2023-03-01 security patch level vulnerability details
Framework
CVE-2023-20906
- 在应用更新到targetSDK 23以上的时候,自动移除悬浮窗权限,这个和运行时权限(targetSDK 23)和存储权限(target SDK 19)类似。
revokeRuntimePermissionsIfGroupChangedInternal(pkg, oldPkg); revokeStoragePermissionsIfScopeExpandedInternal(pkg, oldPkg);
- revokeSystemAlertWindowIfUpgradedPast23(pkg, oldPkg);
CVE-2023-20911
- 在应用的权限更新的时候验证权限树的大小,而不仅仅是新增权限时。
CVE-2023-20917
- 在分享图片时考虑Profile身份,具体场景没有研究。
CVE-2023-20947
- 不允许在一次性授权的场景下,自动授予同权限组下的其他权限。
CVE-2023-20963
android.os.WorkSource
这个类型存在Parcelable反序列化漏洞,可用于提权,具体可以参考我之前写的文章。- 此漏洞已被某中国电商软件在野外大批量活跃利用,详情参考DarkNavy的文章:「 深蓝洞察 」2022 年度最“不可赦”漏洞
int numChains = in.readInt();
- if (numChains > 0) {
- if (numChains >= 0) {
mChains = new ArrayList<>(numChains);
in.readParcelableList(mChains, WorkChain.class.getClassLoader());
} else {
//…
}
CVE-2023-20956
- libcodec2_vndk中的越界读取。
CVE-2023-20958
- FreeType中的堆溢出,详见oss-fuzz的报告:Issue 52404: skia:colrv1: Heap-buffer-overflow in tt_face_get_paint
CVE-2023-20964
- 确保MediaButtonReceiver的组件名称属于调用者的App。
System
CVE-2023-20951
- 蓝牙协议栈GATT部分的越界写入漏洞。
- if (len < GATT_PREP_WRITE_RSP_MIN_LEN) {
- if (len < GATT_PREP_WRITE_RSP_MIN_LEN ||
- len > GATT_PREP_WRITE_RSP_MIN_LEN + sizeof(value.value)) {
//… - value.len = len – 4;
- value.len = len – GATT_PREP_WRITE_RSP_MIN_LEN;
CVE-2023-20954
- 蓝牙协议栈SDP部分的越界写入漏洞。
When the
attr_pad
becomes full, it is possible
that un index of-1
is computed write
a zero byte top_val
, rusulting OOB write.p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr - 1] = '\0';
CVE-2023-20926
- 在开机向导结束之前,不允许点击相机/麦克风隐私指示器,通过这个可以绕过恢复出厂保护(FRP),也就是所谓的激活锁。
CVE-2023-20931
- 蓝牙协议栈AVDT部分的边界检查问题。
- if (p_data->apiwrite.p_buf->offset < AVDT_MEDIA_HDR_SIZE) {
- android_errorWriteWithInfoLog(0x534e4554, "242535997", -1, NULL, 0);
- return;
- }
CVE-2023-20936
- 蓝牙协议栈AVRCP部分的越界写入问题,仅在IVI上有用,因为IVI默认的角色是AVRCP Controller。
CVE-2023-20953
- 在开机向导结束之前,对于剪贴板访问仅发送通知,通过这个可以绕过恢复出厂保护(FRP),也就是所谓的激活锁。
CVE-2023-20955
- 在多用户开启时设置的应用管理页面支持“为所有用户卸载”功能,此功能可以绕过DISALLOW_APPS_CONTROL限制卸载应用。
CVE-2023-20957
- 在开机向导阶段直接禁用了部分设置页面,包括:
AccountDashboardFragment AppInfoDashboardFragment DevelopmentSettingsDashboardFragment ResetDashboardFragment
CVE-2023-20959
- 直接把
AddSupervisedUserActivity
给删了,涉及到访客用户调用的问题。
CVE-2023-20960
- 设置应用不允许启动未导出的或者调用方没有权限调用的DeepLink Activity,避免出现LaunchAnyWhere漏洞,同时还限制了Intent.FLAG_GRANT_READ_URI_PERMISSION和Intent.FLAG_GRANT_WRITE_URI_PERMISSION。
CVE-2023-20966
- 这个patch看不了,不知道为啥。看NVD描述是
inflate.c
里面的越界写入问题。
CVE-2022-4452
- crosvm里面的问题。
CVE-2022-20467
- BluetoothOppUtility中的绕过BluetoothShareUri的限制(startsWith绕过),可以通过蓝牙的FileProvider读取文件。
CVE-2023-20929
- Halfsheet取消的广播对Receiver增加ACCESS_FINE_LOCATION权限要求,应该是可以泄露WiFi BSSID信息。
CVE-2023-20952
- 蓝牙协议栈A2DP部分A2DP_BuildMediaPayloadHeaderSbc的越界读取。
- // there is an 4-byte timestamp right following p_buf
- if (p_buf->offset < 4 + A2DP_SBC_MPL_HDR_LEN) {
- return false;
- }
CVE-2023-20962
- MediaVolumePreferenceController中PendingIntent设置为FLAG_IMMUTABLE。
CVE-2022-20499
- PasspointConfiguration配置检查身份前缀。
CVE-2023-20910
- 限制PasspointConfiguration的配置大小。
2023-02-01 security patch level vulnerability details
Framework
CVE-2020-27059
- 看CVE描述是21年一个指纹识别tapjacking的问题,但是commit里面却修复一个关于binder clear calling identify的错误,然后带上一大堆changes,所以也不知所云。
CVE-2022-20443
- WindowManager中添加了一个新东西ActivityRecordInputSink,可以用于消费掉所有的点击事件来实现触控屏蔽,可能是为了提升抗点击劫持标志位的底层实现安全性。
CVE-2022-20551
CVE-2023-20942
- OpenSL ES传上来的attribution source漏掉了包名?
CVE-2023-20934
- N/A
CVE-2023-20943
- ACTION_PACKAGE_DATA_CLEARED广播存在问题,没有清除数据成功也会发送广播,现在判断了标志位之后才发送。
CVE-2023-20944
- ChooseTypeAndAccountActivity中不安全的反序列化。
- startActivityForResult(intent, REQUEST_ADD_ACCOUNT);
- startActivityForResult(new Intent(intent), REQUEST_ADD_ACCOUNT);
CVE-2023-20948
- AAVCAssembler的dropFramesUntilIframe函数中的越界读取。
Media Framework
CVE-2023-20933
- MediaCodec的竞争条件问题。
System
CVE-2022-43680
- 修复了XML解析器中关于DTD解析的问题。
CVE-2023-20939
- wificond中创建EventLoopCallback的智能指针,以解决引用计数的问题。
CVE-2023-20940
- 支持链式的init_boot分区签名。
CVE-2023-20945
- NFC模块中phNciNfc_MfCreateXchgDataHdr的越界写入。
CVE-2023-20946
- 在SliceDeepLinkTrampoline中不要让蓝牙变为可见状态,好像是拉起的那种半屏的模态窗口?
CVE-2022-20481
- 在恢复出厂设置时恢复默认的WiFi SAP配置。
CVE-2023-20932
- 删除了EmergencyInfo应用的跨应用权限INTERACT_ACROSS_USERS_FULL。
CVE-2022-20455
- Zen规则导致的永久DoS问题,一个编号下面有很多。
2023-01-01 security patch level vulnerability details
Framework
CVE-2022-20456
CVE-2022-20489
CVE-2022-20490
CVE-2022-20492
CVE-2023-20494
android.app.AutomaticZenRule
需要trim长字符串,最大字符串长度为1000。
CVE-2022-20493
android.service.notification.Condition
需要trim长字符串,最大字符串长度为1000。
CVE-2023-20912
- MediaProvider中原来是给PhotoPickerActivity自身配置的
android:priority
,现在改为给里面的intent-filter配置。
CVE-2023-20916
CVE-2023-20919
- DevicePolicyResourcesManager存在可能没调用到
Binder.clearCallingIdentity
的问题,这个问题可能导致系统管理员无法卸载一个App。
CVE-2023-20920
- UsbRequest的队列增加锁,防止出现UAF问题(由HWASan检测出)。
CVE-2023-20921
- 对于已卸载的package,禁用其提供的任何无障碍服务。
CVE-2023-20908
- 在更新Settings数据库之前就执行内存限制检查,现在的逻辑是:
checkMemLimit -> update -> updateMemUsage
CVE-2023-20922
- 限制可以配置的MIME类型和长度,MIME类型最多500个,每个MIME最多255个字符。
System
CVE-2022-20461
- 蓝牙模块的问题,可能在本地造成权限提升。
CVE-2023-20904
- 设置中
getTrampolineIntent
可能通过Selector注入任意Intent。
CVE-2023-20905
- NFC模块的越界写入,只影响Android 10。
CVE-2023-20913
- 对以下四个Activities添加
SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS
标志,防止悬浮窗劫持攻击。- AccessibilitySettingsActivity
- PhoneAccountSettingsActivity
- PickSmsSubscriptionActivity
- VoicemailSettingsActivity
CVE-2023-20915
- 不允许自管理的PhoneAccount被替换成非自管理的,这块应该不是系统Account那里,是在Telecom中的。