am 4be7c61a
: am 5677513b
: am da37ed8b
: am b9ba0c6c
: Prevent authenticators from using Settings to launch arbitrary activities.
* commit '4be7c61a339f8200527f6df5a7b2215c96f81b4b': Prevent authenticators from using Settings to launch arbitrary activities.
This commit is contained in:
@ -35,6 +35,7 @@ import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.pm.RegisteredServicesCache;
|
||||
import android.content.pm.RegisteredServicesCacheListener;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.database.Cursor;
|
||||
import android.database.DatabaseUtils;
|
||||
@ -1799,9 +1800,31 @@ public class AccountManagerService
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResult(Bundle result) {
|
||||
mNumResults++;
|
||||
if (result != null && !TextUtils.isEmpty(result.getString(AccountManager.KEY_AUTHTOKEN))) {
|
||||
Intent intent = null;
|
||||
if (result != null
|
||||
&& (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) {
|
||||
/*
|
||||
* The Authenticator API allows third party authenticators to
|
||||
* supply arbitrary intents to other apps that they can run,
|
||||
* this can be very bad when those apps are in the system like
|
||||
* the System Settings.
|
||||
*/
|
||||
PackageManager pm = mContext.getPackageManager();
|
||||
ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
|
||||
int targetUid = resolveInfo.activityInfo.applicationInfo.uid;
|
||||
int authenticatorUid = Binder.getCallingUid();
|
||||
if (PackageManager.SIGNATURE_MATCH !=
|
||||
pm.checkSignatures(authenticatorUid, targetUid)) {
|
||||
throw new SecurityException(
|
||||
"Activity to be started with KEY_INTENT must " +
|
||||
"share Authenticator's signatures");
|
||||
}
|
||||
}
|
||||
if (result != null
|
||||
&& !TextUtils.isEmpty(result.getString(AccountManager.KEY_AUTHTOKEN))) {
|
||||
String accountName = result.getString(AccountManager.KEY_ACCOUNT_NAME);
|
||||
String accountType = result.getString(AccountManager.KEY_ACCOUNT_TYPE);
|
||||
if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
|
||||
|
Reference in New Issue
Block a user