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

Commit fe89b249 authored by Nate Myren's avatar Nate Myren Committed by Michael Bestas
Browse files

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
Change-Id: I84968fc0d6f51d2c38416403a1f2e0a9faf9589e
(cherry picked from commit 8dba23c13100882f37d3792b5e0b43dc061f9d16)
parent 8a1eea02
Loading
Loading
Loading
Loading
+18 −3
Original line number Original line Diff line number Diff line
@@ -3740,9 +3740,24 @@ public class ActivityManager {
            Manifest.permission.ACCESS_INSTANT_APPS})
            Manifest.permission.ACCESS_INSTANT_APPS})
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
    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 {
        try {
            if (restorePregrantedPermissions) {
                return getService().clearApplicationUserData(packageName, false,
                return getService().clearApplicationUserData(packageName, false,
                        observer, mContext.getUserId());
                        observer, mContext.getUserId());
            } else {
                return getService().clearApplicationUserDataWithoutPermissionReset(packageName,
                        false, observer, mContext.getUserId());
            }
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
@@ -3760,7 +3775,7 @@ public class ActivityManager {
     *     data be erased; {@code false} otherwise.
     *     data be erased; {@code false} otherwise.
     */
     */
    public boolean clearApplicationUserData() {
    public boolean clearApplicationUserData() {
        return clearApplicationUserData(mContext.getPackageName(), null);
        return clearApplicationUserData(mContext.getPackageName(), null, false);
    }
    }


    /**
    /**
+2 −1
Original line number Original line Diff line number Diff line
@@ -2978,7 +2978,8 @@ public class ApplicationPackageManager extends PackageManager {
    public void clearApplicationUserData(String packageName,
    public void clearApplicationUserData(String packageName,
                                         IPackageDataObserver observer) {
                                         IPackageDataObserver observer) {
        try {
        try {
            mPM.clearApplicationUserData(packageName, observer, getUserId());
            mPM.clearApplicationUserData(packageName, observer, getUserId(),
                    /* restorePregrantedPermissions */ true);
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
+2 −0
Original line number Original line Diff line number Diff line
@@ -346,6 +346,8 @@ interface IActivityManager {
    List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
    List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
    boolean clearApplicationUserData(in String packageName, boolean keepState,
    boolean clearApplicationUserData(in String packageName, boolean keepState,
            in IPackageDataObserver observer, int userId);
            in IPackageDataObserver observer, int userId);
    boolean clearApplicationUserDataWithoutPermissionReset(in String packageName, boolean keepState,
            in IPackageDataObserver observer, int userId);
    void stopAppForUser(in String packageName, int userId);
    void stopAppForUser(in String packageName, int userId);
    /** Returns {@code false} if the callback could not be registered, {@true} otherwise. */
    /** Returns {@code false} if the callback could not be registered, {@true} otherwise. */
    boolean registerForegroundServiceObserver(in IForegroundServiceObserver callback);
    boolean registerForegroundServiceObserver(in IForegroundServiceObserver callback);
+4 −1
Original line number Original line Diff line number Diff line
@@ -499,9 +499,12 @@ interface IPackageManager {
     * @param packageName The package name of the application whose cache
     * @param packageName The package name of the application whose cache
     * files need to be deleted
     * files need to be deleted
     * @param observer a callback used to notify when the operation is completed.
     * @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")
    @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.
     * Clear the profile data of an application.
+1 −0
Original line number Original line Diff line number Diff line
@@ -9538,6 +9538,7 @@ public abstract class PackageManager {
     */
     */
    @SuppressWarnings("HiddenAbstractMethod")
    @SuppressWarnings("HiddenAbstractMethod")
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    @RequiresPermission(Manifest.permission.CLEAR_APP_USER_DATA)
    public abstract void clearApplicationUserData(@NonNull String packageName,
    public abstract void clearApplicationUserData(@NonNull String packageName,
            @Nullable IPackageDataObserver observer);
            @Nullable IPackageDataObserver observer);
    /**
    /**
Loading