diff --git a/api/current.txt b/api/current.txt index bbe1d9595094..0fefd9a99ccc 100644 --- a/api/current.txt +++ b/api/current.txt @@ -79,6 +79,7 @@ package android { field public static final String DUMP = "android.permission.DUMP"; field public static final String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR"; field public static final String FACTORY_TEST = "android.permission.FACTORY_TEST"; + field public static final String FAKE_PACKAGE_SIGNATURE = "android.permission.FAKE_PACKAGE_SIGNATURE"; field public static final String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE"; field public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS"; field public static final String GET_ACCOUNTS_PRIVILEGED = "android.permission.GET_ACCOUNTS_PRIVILEGED"; @@ -183,6 +184,7 @@ package android { field public static final String CALL_LOG = "android.permission-group.CALL_LOG"; field public static final String CAMERA = "android.permission-group.CAMERA"; field public static final String CONTACTS = "android.permission-group.CONTACTS"; + field public static final String FAKE_PACKAGE = "android.permission-group.FAKE_PACKAGE"; field public static final String LOCATION = "android.permission-group.LOCATION"; field public static final String MICROPHONE = "android.permission-group.MICROPHONE"; field public static final String NETWORK = "android.permission-group.NETWORK"; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d93627701e0f..5a9c6c316015 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -15790,6 +15790,14 @@ public static final class Global extends NameValueTable { LOCATION_GLOBAL_KILL_SWITCH, }; + /** + * Whether applications can fake a signature. + * 1 = permit apps to fake signature + * 0 = disable this feature + * @hide + */ + public static final String ALLOW_SIGNATURE_FAKE = "allow_signature_fake"; + /** * Keys we no longer back up under the current schema, but want to continue to * process when restoring historical backup datasets. diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4763c357a86d..dfc154045c20 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2882,6 +2882,21 @@ android:description="@string/permdesc_getPackageSize" android:protectionLevel="normal" /> + + + + + + diff --git a/core/res/res/values/colt_strings.xml b/core/res/res/values/colt_strings.xml index fc0e68fb20eb..67040fdccff1 100644 --- a/core/res/res/values/colt_strings.xml +++ b/core/res/res/values/colt_strings.xml @@ -72,4 +72,16 @@ SystemUI restart required For all changes to take effect, a SystemUI restart is required. Restart SystemUI now? + + Spoof package signature + + Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Legitimate uses include an emulator pretending to be what it emulates. Grant this permission with caution only! + + Spoof package signature + + allow to spoof package signature + + Allow + <b>%1$s</b> to spoof package signature? diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index dd72e746e8a4..7f94b63243df 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -79,6 +79,7 @@ package android { field public static final String DUMP = "android.permission.DUMP"; field public static final String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR"; field public static final String FACTORY_TEST = "android.permission.FACTORY_TEST"; + field public static final String FAKE_PACKAGE_SIGNATURE = "android.permission.FAKE_PACKAGE_SIGNATURE"; field public static final String FOREGROUND_SERVICE = "android.permission.FOREGROUND_SERVICE"; field public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS"; field public static final String GET_ACCOUNTS_PRIVILEGED = "android.permission.GET_ACCOUNTS_PRIVILEGED"; @@ -183,6 +184,7 @@ package android { field public static final String CALL_LOG = "android.permission-group.CALL_LOG"; field public static final String CAMERA = "android.permission-group.CAMERA"; field public static final String CONTACTS = "android.permission-group.CONTACTS"; + field public static final String FAKE_PACKAGE = "android.permission-group.FAKE_PACKAGE"; field public static final String LOCATION = "android.permission-group.LOCATION"; field public static final String MICROPHONE = "android.permission-group.MICROPHONE"; field public static final String NETWORK = "android.permission-group.NETWORK"; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 3c5a94201189..9c9874efb65d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4468,8 +4468,9 @@ private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId }); } - PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags, - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId, ps); + PackageInfo packageInfo = mayFakeSignature(p, PackageInfoUtils.generate(p, gids, flags, + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId, ps), + permissions); if (packageInfo == null) { return null; @@ -4505,6 +4506,26 @@ private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId } } + private PackageInfo mayFakeSignature(AndroidPackage p, PackageInfo pi, + Set permissions) { + try { + if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE") + && p.getTargetSdkVersion() > Build.VERSION_CODES.LOLLIPOP_MR1 + && android.provider.Settings.Global.getInt(mContext.getContentResolver(), + android.provider.Settings.Global.ALLOW_SIGNATURE_FAKE, 0) == 1 + && p.getMetaData() != null) { + String sig = p.getMetaData().getString("fake-signature"); + if (sig != null) { + pi.signatures = new Signature[] {new Signature(sig)}; + } + } + } catch (Throwable t) { + // We should never die because of any failures, this is system code! + Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t); + } + return pi; + } + @Override public void checkPackageStartable(String packageName, int userId) { final int callingUid = Binder.getCallingUid(); @@ -10662,7 +10683,7 @@ private void executeSharedLibrariesUpdateLPr(AndroidPackage pkg, continue; } final PackageSetting staticLibPkgSetting = getPackageSetting( - toStaticSharedLibraryPackageName(sharedLibraryInfo.getPackageName(), + toStaticSharedLibraryPackageName(sharedLibraryInfo.getName(), sharedLibraryInfo.getLongVersion())); if (staticLibPkgSetting == null) { Slog.wtf(TAG, "Shared lib without setting: " + sharedLibraryInfo);