Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d2603a5 authored by Nate Myren's avatar Nate Myren Committed by Nishith Khanna
Browse files

RESTRICT AUTOMERGE Apps clearing self data shouldn't get permissions restored

when an app calls clearApplicationUserData for itself, do not restore
default or role granted permissions. However, maintain a privileged
version that can.

Bug: 339109116
Test: atest ActivityManagerTest
Flag: EXEMPT CVE_FIX
Cherrypick-From: https://googleplex-android-review.googlesource.com/q/commit:86aab9fb0242fed4d773b2fbe7593810bc8577d8
Merged-In: I84968fc0d6f51d2c38416403a1f2e0a9faf9589e
Change-Id: I84968fc0d6f51d2c38416403a1f2e0a9faf9589e
parent 2296700c
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -3317,9 +3317,24 @@ public class ActivityManager {
            Manifest.permission.ACCESS_INSTANT_APPS})
    @UnsupportedAppUsage
    public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
        return clearApplicationUserData(packageName, observer, true);
    }

    /**
     * @hide
     */
    @RequiresPermission(anyOf = {Manifest.permission.CLEAR_APP_USER_DATA,
            Manifest.permission.ACCESS_INSTANT_APPS})
    private boolean clearApplicationUserData(String packageName, IPackageDataObserver observer,
            boolean restorePregrantedPermissions) {
        try {
            if (restorePregrantedPermissions) {
                return getService().clearApplicationUserData(packageName, false,
                        observer, mContext.getUserId());
            } else {
                return getService().clearApplicationUserDataWithoutPermissionReset(packageName,
                        false, observer, mContext.getUserId());
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -3337,7 +3352,7 @@ public class ActivityManager {
     *     data be erased; {@code false} otherwise.
     */
    public boolean clearApplicationUserData() {
        return clearApplicationUserData(mContext.getPackageName(), null);
        return clearApplicationUserData(mContext.getPackageName(), null, false);
    }

    /**
+2 −1
Original line number Diff line number Diff line
@@ -2873,7 +2873,8 @@ public class ApplicationPackageManager extends PackageManager {
    public void clearApplicationUserData(String packageName,
                                         IPackageDataObserver observer) {
        try {
            mPM.clearApplicationUserData(packageName, observer, getUserId());
            mPM.clearApplicationUserData(packageName, observer, getUserId(),
                    /* restorePregrantedPermissions */ true);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+2 −0
Original line number Diff line number Diff line
@@ -333,6 +333,8 @@ interface IActivityManager {
    List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
    boolean clearApplicationUserData(in String packageName, boolean keepState,
            in IPackageDataObserver observer, int userId);
    boolean clearApplicationUserDataWithoutPermissionReset(in String packageName, boolean keepState,
            in IPackageDataObserver observer, int userId);
    void stopAppForUser(in String packageName, int userId);
    /** Returns {@code false} if the callback could not be registered, {@true} otherwise. */
    boolean registerForegroundServiceObserver(in IForegroundServiceObserver callback);
+4 −1
Original line number Diff line number Diff line
@@ -484,9 +484,12 @@ interface IPackageManager {
     * @param packageName The package name of the application whose cache
     * files need to be deleted
     * @param observer a callback used to notify when the operation is completed.
     * @param userId the user to delete application data for
     * @param restorePregrantedPermissions whether to restore the pre-granted permissions, or leave
     *        them untouched
     */
    @EnforcePermission("CLEAR_APP_USER_DATA")
    void clearApplicationUserData(in String packageName, IPackageDataObserver observer, int userId);
    void clearApplicationUserData(in String packageName, IPackageDataObserver observer, int userId, boolean restorePregrantedPermissions);

    /**
     * Clear the profile data of an application.
+1 −0
Original line number Diff line number Diff line
@@ -9244,6 +9244,7 @@ public abstract class PackageManager {
     */
    @SuppressWarnings("HiddenAbstractMethod")
    @UnsupportedAppUsage
    @RequiresPermission(Manifest.permission.CLEAR_APP_USER_DATA)
    public abstract void clearApplicationUserData(@NonNull String packageName,
            @Nullable IPackageDataObserver observer);
    /**
Loading