From 703a23e347dc0ffa9df5112cca75083880be88f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20Rosenkr=C3=A4nzer?= Date: Tue, 29 Aug 2017 00:34:27 +0200 Subject: Add permission to allow an APK to fake a signature. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is needed by GmsCore (https://microg.org/) to pretend the existence of the official Play Services to applications calling Google APIs. Forward-ported from https://github.com/microg/android_packages_apps_GmsCore/blob/master/patches/android_frameworks_base-N.patch Change-Id: I603fd09200432f7e1bf997072188cdfa6da1594f Signed-off-by: Bernhard Rosenkränzer --- core/res/AndroidManifest.xml | 7 +++++++ core/res/res/values/config.xml | 2 ++ core/res/res/values/strings.xml | 4 ++++ .../android/server/pm/PackageManagerService.java | 23 ++++++++++++++++++++-- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 048214a1dc0f..3cb1121eb7df 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1924,6 +1924,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 dbc4324ec92a..86822a42cdda 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1358,6 +1358,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 38137f8c95a4..bae9d34c31a3 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -663,6 +663,10 @@ + + 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 7a547f00e607..73a0420ce112 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3098,8 +3098,27 @@ public class PackageManagerService extends IPackageManager.Stub { ? Collections.emptySet() : permissionsState.getPermissions(userId); final PackageUserState state = ps.readUserState(userId); - return PackageParser.generatePackageInfo(p, gids, flags, - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); + return mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags, + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId), + permissions);; + } + + 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 -- cgit v1.2.3