Set correct attribution==featureId and message for broadcasts

These fields will be delivered to the app that it is checked. This will
allow the app to record which private data access it is blamed for.

Fixes: 162317145
Test: atest AppOpsLoggingTest (now with tests added for these paths.)
Change-Id: Icf796452c4df39b32e8dc385f6a2c65a2257512f
This commit is contained in:
Philip P. Moltmann
2020-07-30 17:42:48 -07:00
parent 624a7c1c70
commit d5949deb8b
6 changed files with 30 additions and 21 deletions

View File

@@ -2657,8 +2657,10 @@ public class AppOpsManager {
* @hide
*/
// TODO: this should probably be @SystemApi as well
public static @NonNull String toReceiverId(@NonNull Object obj) {
if (obj instanceof PendingIntent) {
public static @NonNull String toReceiverId(@Nullable Object obj) {
if (obj == null) {
return "null";
} else if (obj instanceof PendingIntent) {
return toReceiverId((PendingIntent) obj);
} else {
return obj.getClass().getName() + "@" + System.identityHashCode(obj);

View File

@@ -1624,8 +1624,9 @@ class ContextImpl extends Context {
}
try {
final Intent intent = ActivityManager.getService().registerReceiverWithFeature(
mMainThread.getApplicationThread(), mBasePackageName, getAttributionTag(), rd,
filter, broadcastPermission, userId, flags);
mMainThread.getApplicationThread(), mBasePackageName, getAttributionTag(),
AppOpsManager.toReceiverId(receiver), rd, filter, broadcastPermission, userId,
flags);
if (intent != null) {
intent.setExtrasClassLoader(getClassLoader());
intent.prepareToEnterProcess();

View File

@@ -123,8 +123,8 @@ interface IActivityManager {
in IIntentReceiver receiver, in IntentFilter filter,
in String requiredPermission, int userId, int flags);
Intent registerReceiverWithFeature(in IApplicationThread caller, in String callerPackage,
in String callingFeatureId, in IIntentReceiver receiver, in IntentFilter filter,
in String requiredPermission, int userId, int flags);
in String callingFeatureId, in String receiverId, in IIntentReceiver receiver,
in IntentFilter filter, in String requiredPermission, int userId, int flags);
@UnsupportedAppUsage
void unregisterReceiver(in IIntentReceiver receiver);
/** @deprecated Use {@link #broadcastIntentWithFeature} instead */

View File

@@ -14051,13 +14051,13 @@ public class ActivityManagerService extends IActivityManager.Stub
public Intent registerReceiver(IApplicationThread caller, String callerPackage,
IIntentReceiver receiver, IntentFilter filter, String permission, int userId,
int flags) {
return registerReceiverWithFeature(caller, callerPackage, null, receiver, filter,
permission, userId, flags);
return registerReceiverWithFeature(caller, callerPackage, null, null,
receiver, filter, permission, userId, flags);
}
public Intent registerReceiverWithFeature(IApplicationThread caller, String callerPackage,
String callerFeatureId, IIntentReceiver receiver, IntentFilter filter,
String permission, int userId, int flags) {
String callerFeatureId, String receiverId, IIntentReceiver receiver,
IntentFilter filter, String permission, int userId, int flags) {
enforceNotIsolatedCaller("registerReceiver");
ArrayList<Intent> stickyIntents = null;
ProcessRecord callerApp = null;
@@ -14194,7 +14194,7 @@ public class ActivityManagerService extends IActivityManager.Stub
+ " callerPackage is " + callerPackage);
}
BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, callerFeatureId,
permission, callingUid, userId, instantApp, visibleToInstantApps);
receiverId, permission, callingUid, userId, instantApp, visibleToInstantApps);
if (rl.containsFilter(filter)) {
Slog.w(TAG, "Receiver with filter " + filter
+ " already registered for pid " + rl.pid

View File

@@ -28,6 +28,7 @@ final class BroadcastFilter extends IntentFilter {
final ReceiverList receiverList;
final String packageName;
final String featureId;
final String receiverId;
final String requiredPermission;
final int owningUid;
final int owningUserId;
@@ -35,12 +36,13 @@ final class BroadcastFilter extends IntentFilter {
final boolean visibleToInstantApp;
BroadcastFilter(IntentFilter _filter, ReceiverList _receiverList,
String _packageName, String _featureId, String _requiredPermission, int _owningUid, int _userId,
boolean _instantApp, boolean _visibleToInstantApp) {
String _packageName, String _featureId, String _receiverId, String _requiredPermission,
int _owningUid, int _userId, boolean _instantApp, boolean _visibleToInstantApp) {
super(_filter);
receiverList = _receiverList;
packageName = _packageName;
featureId = _featureId;
receiverId = _receiverId;
requiredPermission = _requiredPermission;
owningUid = _owningUid;
owningUserId = _userId;

View File

@@ -639,7 +639,7 @@ public final class BroadcastQueue {
final int opCode = AppOpsManager.permissionToOpCode(filter.requiredPermission);
if (opCode != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(opCode, r.callingUid,
r.callerPackage, r.callerFeatureId, "")
r.callerPackage, r.callerFeatureId, "Broadcast sent to protected receiver")
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: broadcasting "
+ r.intent.toString()
@@ -672,7 +672,8 @@ public final class BroadcastQueue {
int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
&& mService.getAppOpsManager().noteOpNoThrow(appOp,
filter.receiverList.uid, filter.packageName, filter.featureId, "")
filter.receiverList.uid, filter.packageName, filter.featureId,
"Broadcast delivered to registered receiver " + filter.receiverId)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent.toString()
@@ -704,7 +705,8 @@ public final class BroadcastQueue {
}
if (!skip && r.appOp != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(r.appOp,
filter.receiverList.uid, filter.packageName, filter.featureId, "")
filter.receiverList.uid, filter.packageName, filter.featureId,
"Broadcast delivered to registered receiver " + filter.receiverId)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent.toString()
@@ -1366,9 +1368,10 @@ public final class BroadcastQueue {
skip = true;
} else if (!skip && info.activityInfo.permission != null) {
final int opCode = AppOpsManager.permissionToOpCode(info.activityInfo.permission);
if (opCode != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(opCode, r.callingUid, r.callerPackage,
r.callerFeatureId, "") != AppOpsManager.MODE_ALLOWED) {
if (opCode != AppOpsManager.OP_NONE && mService.getAppOpsManager().noteOpNoThrow(opCode,
r.callingUid, r.callerPackage, r.callerFeatureId,
"Broadcast delivered to " + info.activityInfo.name)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: broadcasting "
+ r.intent.toString()
+ " from " + r.callerPackage + " (pid="
@@ -1407,7 +1410,8 @@ public final class BroadcastQueue {
if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
&& mService.getAppOpsManager().noteOpNoThrow(appOp,
info.activityInfo.applicationInfo.uid, info.activityInfo.packageName,
null /* default featureId */, "")
null /* default featureId */,
"Broadcast delivered to " + info.activityInfo.name)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent + " to "
@@ -1424,7 +1428,7 @@ public final class BroadcastQueue {
if (!skip && r.appOp != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(r.appOp,
info.activityInfo.applicationInfo.uid, info.activityInfo.packageName,
null /* default featureId */, "")
null /* default featureId */, "Broadcast delivered to " + info.activityInfo.name)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent + " to "