Fix the issue provider can be wrong when requesting slice permission
SlicePermissionActivity reads provider_pkg from intent, which can be modified at will. As a result user might see incorrect package name in the dialog granting slice permission. Bug: 159145361 Test: manual Merged-In: I8b66c02786df4096dad74b7e76255d5ddd1d609d Change-Id: I8b66c02786df4096dad74b7e76255d5ddd1d609d
This commit is contained in:
@@ -153,6 +153,7 @@ public abstract class SliceProvider extends ContentProvider {
|
|||||||
*/
|
*/
|
||||||
public static final String EXTRA_PKG = "pkg";
|
public static final String EXTRA_PKG = "pkg";
|
||||||
/**
|
/**
|
||||||
|
* @Deprecated provider pkg is now being extracted in SlicePermissionActivity
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final String EXTRA_PROVIDER_PKG = "provider_pkg";
|
public static final String EXTRA_PROVIDER_PKG = "provider_pkg";
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ package com.android.systemui;
|
|||||||
|
|
||||||
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||||
|
|
||||||
|
import android.annotation.Nullable;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.slice.SliceManager;
|
import android.app.slice.SliceManager;
|
||||||
@@ -29,6 +30,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.BidiFormatter;
|
import android.text.BidiFormatter;
|
||||||
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
@@ -50,10 +52,12 @@ public class SlicePermissionActivity extends Activity implements OnClickListener
|
|||||||
|
|
||||||
mUri = getIntent().getParcelableExtra(SliceProvider.EXTRA_BIND_URI);
|
mUri = getIntent().getParcelableExtra(SliceProvider.EXTRA_BIND_URI);
|
||||||
mCallingPkg = getIntent().getStringExtra(SliceProvider.EXTRA_PKG);
|
mCallingPkg = getIntent().getStringExtra(SliceProvider.EXTRA_PKG);
|
||||||
mProviderPkg = getIntent().getStringExtra(SliceProvider.EXTRA_PROVIDER_PKG);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
PackageManager pm = getPackageManager();
|
PackageManager pm = getPackageManager();
|
||||||
|
mProviderPkg = pm.resolveContentProvider(mUri.getAuthority(),
|
||||||
|
PackageManager.GET_META_DATA).applicationInfo.packageName;
|
||||||
|
verifyCallingPkg();
|
||||||
CharSequence app1 = BidiFormatter.getInstance().unicodeWrap(pm.getApplicationInfo(
|
CharSequence app1 = BidiFormatter.getInstance().unicodeWrap(pm.getApplicationInfo(
|
||||||
mCallingPkg, 0).loadSafeLabel(pm, PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
|
mCallingPkg, 0).loadSafeLabel(pm, PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
|
||||||
PackageItemInfo.SAFE_LABEL_FLAG_TRIM
|
PackageItemInfo.SAFE_LABEL_FLAG_TRIM
|
||||||
@@ -97,4 +101,29 @@ public class SlicePermissionActivity extends Activity implements OnClickListener
|
|||||||
public void onDismiss(DialogInterface dialog) {
|
public void onDismiss(DialogInterface dialog) {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void verifyCallingPkg() {
|
||||||
|
final String providerPkg = getIntent().getStringExtra(SliceProvider.EXTRA_PROVIDER_PKG);
|
||||||
|
if (providerPkg == null || mProviderPkg.equals(providerPkg)) return;
|
||||||
|
final String callingPkg = getCallingPkg();
|
||||||
|
EventLog.writeEvent(0x534e4554, "159145361", getUid(callingPkg), String.format(
|
||||||
|
"pkg %s (disguised as %s) attempted to request permission to show %s slices in %s",
|
||||||
|
callingPkg, providerPkg, mProviderPkg, mCallingPkg));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private String getCallingPkg() {
|
||||||
|
final Uri referrer = getReferrer();
|
||||||
|
if (referrer == null) return null;
|
||||||
|
return referrer.getHost();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getUid(@Nullable final String pkg) {
|
||||||
|
if (pkg == null) return -1;
|
||||||
|
try {
|
||||||
|
return getPackageManager().getApplicationInfo(pkg, 0).uid;
|
||||||
|
} catch (NameNotFoundException e) {
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user