Block the content scheme intent in AccountTypePreferenceLoader am: 8fa1dcb034 am: b5bf33ab76 am: 26e1224ea6

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/30469374

Change-Id: I5bc99dfe4750532359151f4fadda26567828ad90
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jason Chiu
2024-11-25 05:04:07 +00:00
committed by Automerger Merge Worker
2 changed files with 28 additions and 7 deletions

View File

@@ -20,6 +20,7 @@ package com.android.settings.accounts;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AuthenticatorDescription; import android.accounts.AuthenticatorDescription;
import android.content.ClipData; import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
@@ -185,7 +186,7 @@ public class AccountTypePreferenceLoader {
prefIntent, mUserHandle); prefIntent, mUserHandle);
} else { } else {
Log.e(TAG, Log.e(TAG,
"Refusing to launch authenticator intent because" "Refusing to launch authenticator intent because "
+ "it exploits Settings permissions: " + "it exploits Settings permissions: "
+ prefIntent); + prefIntent);
} }
@@ -241,13 +242,19 @@ public class AccountTypePreferenceLoader {
} }
/** /**
* Determines if the supplied Intent is safe. A safe intent is one that is * Determines if the supplied Intent is safe. A safe intent is one that
* will launch a exported=true activity or owned by the same uid as the * will launch an exported=true activity or owned by the same uid as the
* authenticator supplying the intent. * authenticator supplying the intent.
*/ */
private boolean isSafeIntent(PackageManager pm, Intent intent, String acccountType) { @VisibleForTesting
boolean isSafeIntent(PackageManager pm, Intent intent, String accountType) {
if (TextUtils.equals(intent.getScheme(), ContentResolver.SCHEME_CONTENT)) {
Log.e(TAG, "Intent with a content scheme is unsafe.");
return false;
}
AuthenticatorDescription authDesc = AuthenticatorDescription authDesc =
mAuthenticatorHelper.getAccountTypeDescription(acccountType); mAuthenticatorHelper.getAccountTypeDescription(accountType);
ResolveInfo resolveInfo = pm.resolveActivityAsUser(intent, 0, mUserHandle.getIdentifier()); ResolveInfo resolveInfo = pm.resolveActivityAsUser(intent, 0, mUserHandle.getIdentifier());
if (resolveInfo == null) { if (resolveInfo == null) {
return false; return false;

View File

@@ -16,6 +16,8 @@
package com.android.settings.accounts; package com.android.settings.accounts;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -26,8 +28,11 @@ import static org.mockito.Mockito.when;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.accounts.AuthenticatorDescription; import android.accounts.AuthenticatorDescription;
import android.content.ClipData;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.UserHandle; import android.os.UserHandle;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -129,4 +134,13 @@ public class AccountTypePreferenceLoaderTest {
verify(mPrefLoader).updatePreferenceIntents(prefGroup4, acctType, mAccount); verify(mPrefLoader).updatePreferenceIntents(prefGroup4, acctType, mAccount);
verify(mPrefLoader).updatePreferenceIntents(prefGroup41, acctType, mAccount); verify(mPrefLoader).updatePreferenceIntents(prefGroup41, acctType, mAccount);
} }
@Test
public void isSafeIntent_hasContextScheme_returnFalse() {
Intent intent = new Intent();
intent.setClipData(ClipData.newRawUri(null,
Uri.parse("content://com.android.settings.files/my_cache/NOTICE.html")));
assertThat(mPrefLoader.isSafeIntent(mPackageManager, intent, mAccount.type)).isFalse();
}
} }