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

Commit 1b794fae authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #72151749: Lock down 'clear cache' functionality to...

...only system signature

Apps that hold the original permission are silently ignored.  There
is a new internal permission you must hold to actually delete cache
files.

Test: booted and run, can still clear cache in settings.
Bug: 72151749
Change-Id: I47a5cb697e1a4fa3665ac71aaabcda57bef7b561
parent 4945e8e3
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -2955,11 +2955,16 @@
    <permission android:name="android.permission.MANAGE_SCOPED_ACCESS_DIRECTORY_PERMISSIONS"
        android:protectionLevel="signature" />

    <!-- @SystemApi Allows an application to delete cache files.
    <p>Not for use by third-party applications. -->
    <!-- @SystemApi Old permission for deleting an app's cache files, no longer used,
         but signals for us to quietly ignore calls instead of throwing an exception. -->
    <permission android:name="android.permission.DELETE_CACHE_FILES"
        android:protectionLevel="signature|privileged" />

    <!-- Allows an application to delete cache files.
         @hide -->
    <permission android:name="android.permission.INTERNAL_DELETE_CACHE_FILES"
        android:protectionLevel="signature" />

    <!-- @SystemApi Allows an application to delete packages.
         <p>Not for use by third-party applications.
         <p>Starting in {@link android.os.Build.VERSION_CODES#N}, user confirmation is requested
+15 −2
Original line number Diff line number Diff line
@@ -19102,8 +19102,21 @@ public class PackageManagerService extends IPackageManager.Stub
    public void deleteApplicationCacheFilesAsUser(final String packageName, final int userId,
            final IPackageDataObserver observer) {
        final int callingUid = Binder.getCallingUid();
        if (mContext.checkCallingOrSelfPermission(
                android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES)
                != PackageManager.PERMISSION_GRANTED) {
            // If the caller has the old delete cache permission, silently ignore.  Else throw.
            if (mContext.checkCallingOrSelfPermission(
                    android.Manifest.permission.DELETE_CACHE_FILES)
                    == PackageManager.PERMISSION_GRANTED) {
                Slog.w(TAG, "Calling uid " + callingUid + " does not have " +
                        android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES +
                        ", silently ignoring");
                return;
            }
            mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.DELETE_CACHE_FILES, null);
                    android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES, null);
        }
        mPermissionManager.enforceCrossUserPermission(callingUid, userId,
                /* requireFullPermission= */ true, /* checkShell= */ false,
                "delete application cache files");