From 057b53cb2e73e8c2cd64832ca45eace3f44180a4 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 3 Sep 2025 15:42:20 +0300 Subject: [PATCH] Merge tag 'android-security-15.0.0_r10' into staging/lineage-22.2_merge-android-security-15.0.0_r10 Android Security 15.0.0 Release 10 (13793697) # -----BEGIN PGP SIGNATURE----- # # iF0EABECAB0WIQRDQNE1cO+UXoOBCWTorT+BmrEOeAUCaLciswAKCRDorT+BmrEO # eLioAJ48E9kjQkjjsYv2I3gGdcTvLnEeQwCfXDCW+/kdR5RPxg99tG4Advwi0CI= # =YxPI # -----END PGP SIGNATURE----- # gpg: Signature made Tue Sep 2 20:00:35 2025 EEST # gpg: using DSA key 4340D13570EF945E83810964E8AD3F819AB10E78 # gpg: Good signature from "The Android Open Source Project " [ultimate] * tag 'android-security-15.0.0_r10': Trim the application name to make it safe for presentation Fix for SAF loophole in the lastAccessedStack. Prevent clickjacking attack in DocsUi. Change-Id: I07ff3d2b41a437931bc123c5d155c2c6a001d606 --- res/values/strings.xml | 2 +- src/com/android/documentsui/base/Shared.java | 12 ++- .../dirlist/DirectoryFragment.java | 5 - .../documentsui/dirlist/DocumentsAdapter.java | 1 - .../documentsui/dirlist/TestEnvironment.java | 5 - .../documentsui/picker/ApplicationNameTest.kt | 91 +++++++++++++++++++ 6 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 tests/unit/com/android/documentsui/picker/ApplicationNameTest.kt diff --git a/res/values/strings.xml b/res/values/strings.xml index 89e40ac4c..72abecbb5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -551,7 +551,7 @@ Allow %1$s to access files in %2$s? - This will let %1$s access current and future content stored in %2$s. + This will let "%1$s" access current and future content stored in %2$s. Can\u2019t use this folder diff --git a/src/com/android/documentsui/base/Shared.java b/src/com/android/documentsui/base/Shared.java index ac089999f..bb8a39393 100644 --- a/src/com/android/documentsui/base/Shared.java +++ b/src/com/android/documentsui/base/Shared.java @@ -16,6 +16,9 @@ package com.android.documentsui.base; +import static android.text.TextUtils.SAFE_STRING_FLAG_SINGLE_LINE; +import static android.text.TextUtils.SAFE_STRING_FLAG_TRIM; + import static com.android.documentsui.base.SharedMinimal.TAG; import static com.android.documentsui.ChangeIds.RESTRICT_STORAGE_ACCESS_FRAMEWORK; @@ -265,7 +268,7 @@ public final class Shared { * @return the calling app name or general anonymous name if not found */ @NonNull - public static String getCallingAppName(Activity activity) { + public static CharSequence getCallingAppName(Activity activity) { final String anonymous = activity.getString(R.string.anonymous_application); final String packageName = getCallingPackageName(activity); if (TextUtils.isEmpty(packageName)) { @@ -281,7 +284,12 @@ public final class Shared { } CharSequence result = pm.getApplicationLabel(ai); - return TextUtils.isEmpty(result) ? anonymous : result.toString(); + if (TextUtils.isEmpty(result)) { + return anonymous; + } + + return TextUtils.makeSafeForPresentation( + result.toString(), 500, 0, SAFE_STRING_FLAG_TRIM | SAFE_STRING_FLAG_SINGLE_LINE); } /** diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java index e5ce226da..df4edf343 100644 --- a/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -1569,10 +1569,5 @@ public class DirectoryFragment extends Fragment implements SwipeRefreshLayout.On public ActionHandler getActionHandler() { return mActions; } - - @Override - public String getCallingAppName() { - return Shared.getCallingAppName(mActivity); - } } } diff --git a/src/com/android/documentsui/dirlist/DocumentsAdapter.java b/src/com/android/documentsui/dirlist/DocumentsAdapter.java index 41ce73c8c..b32c15335 100644 --- a/src/com/android/documentsui/dirlist/DocumentsAdapter.java +++ b/src/com/android/documentsui/dirlist/DocumentsAdapter.java @@ -90,7 +90,6 @@ public abstract class DocumentsAdapter extends RecyclerView.Adapter + + @Before + fun setUp() { + MockitoAnnotations.openMocks(this) + whenever(mockActivity.resources).thenReturn(resources) + whenever(mockActivity.packageManager).thenReturn(pm) + whenever(resources.getString(R.string.anonymous_application)).thenReturn(ANONYMOUS_PACKAGE) + whenever(mockActivity.callingPackage).thenReturn(PACKAGE_NAME) + } + + @Test + fun testNameIsSanitized() { + val info = ApplicationInfo() + whenever(pm.getApplicationInfo(PACKAGE_NAME, 0)).thenReturn(info) + + whenever(pm.getApplicationLabel(eq(info))).thenReturn(testData.first) + assertEquals(Shared.getCallingAppName(mockActivity), testData.second) + } +} -- GitLab