From 89a3a0102026ad3621a89b0f1c3b25eb3ad49329 Mon Sep 17 00:00:00 2001 From: Andy CrossGate Yan Date: Fri, 17 May 2019 03:36:35 +0000 Subject: [PATCH] core: Add support for MicroG -fake signatures, enabled per app by dynamic permission Change-Id: I0e5a0aca9fccbd4372de8ce3af76c53cc7c35f28 --- core/res/AndroidManifest.xml | 7 ++++++ core/res/res/values/config.xml | 2 ++ core/res/res/values/strings.xml | 5 ++++ .../server/pm/PackageManagerService.java | 23 +++++++++++++++++-- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index af1a6fa9e3c..c9e9daea1ba 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2357,6 +2357,13 @@ android:description="@string/permdesc_getPackageSize" android:protectionLevel="normal" /> + + + diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index bd84a6d720b..977ae5cfe10 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1716,6 +1716,8 @@ com.android.location.fused + + com.google.android.gms diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index f6600462ea7..bd96a09684f 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -785,6 +785,11 @@ + + 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! + disable or modify status bar diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f3938b32333..1b069e34891 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4063,8 +4063,9 @@ public class PackageManagerService extends IPackageManager.Stub }); } - PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags, - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); + PackageInfo packageInfo = mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags, + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId), + permissions); if (packageInfo == null) { return null; @@ -4100,6 +4101,24 @@ public class PackageManagerService extends IPackageManager.Stub } } + private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi, + Set permissions) { + try { + if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE") + && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1 + && p.mAppMetaData != null) { + String sig = p.mAppMetaData.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(); -- 2.25.1