Limit Instant App notifications

Instants apps are not allowed to create toasts or notifications, however
they are allowed to update notifications that were created by the
system for them (i.e. a notification for a foreground service).

Test: Manually verified that .notify() fails with a security exception
Test: Manually verified startForeground shows a notification and that it
can be updated.

Change-Id: I054cccc2aa817263d15abd34851b0e06f16fb829
This commit is contained in:
Chad Brubaker
2017-01-27 13:39:00 -08:00
parent 61d7a8a7f5
commit 6b68f1060c

View File

@@ -1434,6 +1434,11 @@ public class NotificationManagerService extends SystemService {
return ;
}
if (isCallerInstantApp(pkg)) {
throw new SecurityException("Instant app " + pkg
+ " is not allowed to create toasts");
}
final boolean isSystemToast = isCallerSystem() || ("android".equals(pkg));
final boolean isPackageSuspended =
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
@@ -3052,6 +3057,13 @@ public class NotificationManagerService extends SystemService {
}
return false;
}
} else if (isCallerInstantApp(pkg)) {
// Ephemeral apps have some special contraints for notifications.
// They are not allowed to create new notifications however they are allowed to
// update notifications created by the system (e.g. a foreground service
// notification).
throw new SecurityException("Instant app " + pkg
+ " cannot create notifications");
}
int count = 0;
@@ -4326,6 +4338,27 @@ public class NotificationManagerService extends SystemService {
checkCallerIsSameApp(pkg);
}
private boolean isCallerInstantApp(String pkg) {
// System is always allowed to act for ephemeral apps.
if (isCallerSystem()) {
return false;
}
mAppOps.checkPackage(Binder.getCallingUid(), pkg);
try {
ApplicationInfo ai = mPackageManager.getApplicationInfo(pkg, 0,
UserHandle.getCallingUserId());
if (ai == null) {
throw new SecurityException("Unknown package " + pkg);
}
return ai.isInstantApp();
} catch (RemoteException re) {
throw new SecurityException("Unknown package " + pkg, re);
}
}
private void checkCallerIsSameApp(String pkg) {
final int uid = Binder.getCallingUid();
try {