Android Security Bulletin Index 2023

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

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

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 to p_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

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中的。