From c9b266ded8a63da3408c24479100ea53baf455b7 Mon Sep 17 00:00:00 2001 From: gudenau Date: Tue, 25 Sep 2018 09:44:26 +0200 Subject: [PATCH] core: Add support for MicroG -fake signatures, enabled per app by dynamic permission Change-Id: I84fc7e5c606f4b57012d948a4cc6cb521db6b03e --- 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 0c3b7a137b9..fc6f9d9a1ec 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2637,6 +2637,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 91f4cf3093e..91fb69f8066 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1856,6 +1856,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 152b131af8f..f8d87a37064 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -827,6 +827,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 fb672a5231f..d5878ed9fc4 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4111,8 +4111,9 @@ public class PackageManagerService extends IPackageManager.Stub final Set permissions = ArrayUtils.isEmpty(p.requestedPermissions) ? Collections.emptySet() : permissionsState.getPermissions(userId); - 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; @@ -4148,6 +4149,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.17.1