Create Westworld metric for unsafe intent matching
Screenshot: go/screenshots/7RtUMdLH8W7buhV
Test: statsd_testdrive 573
Bug: 240738495
Change-Id: Ia04c10cebd77029487cf4648673fc49cd1a21034
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7566bab..7339830 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12667,7 +12667,7 @@
* @param platformCompat the instance of platform compat
*/
private static void filterNonExportedComponents(Intent intent, int callingUid,
- List query, PlatformCompat platformCompat, String callerPackage) {
+ List query, PlatformCompat platformCompat, String callerPackage, String resolvedType) {
if (query == null
|| intent.getPackage() != null
|| intent.getComponent() != null
@@ -12694,19 +12694,24 @@
} else {
continue;
}
- if (!platformCompat.isChangeEnabledByUid(
- IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS, callingUid)) {
- Slog.w(TAG, "Non-exported component not filtered out "
- + "(will be filtered out once the app targets U+)- intent: "
- + intent.getAction() + ", component: "
- + componentInfo + ", sender: "
- + callerPackage);
+ boolean hasToBeExportedToMatch = platformCompat.isChangeEnabledByUid(
+ ActivityManagerService.IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS,
+ callingUid);
+ String[] categories = intent.getCategories() == null ? new String[0]
+ : intent.getCategories().toArray(String[]::new);
+ FrameworkStatsLog.write(FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED,
+ FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED__EVENT_TYPE__INTERNAL_NON_EXPORTED_COMPONENT_MATCH,
+ callingUid,
+ componentInfo,
+ callerPackage,
+ intent.getAction(),
+ categories,
+ resolvedType,
+ intent.getScheme(),
+ hasToBeExportedToMatch);
+ if (!hasToBeExportedToMatch) {
return;
}
- Slog.w(TAG, "Non-exported component filtered out - intent: "
- + intent.getAction() + ", component: "
- + componentInfo + ", sender: "
- + callerPackage);
query.remove(i);
}
}
@@ -14620,7 +14625,7 @@
}
filterNonExportedComponents(intent, callingUid, registeredReceivers,
- mPlatformCompat, callerPackage);
+ mPlatformCompat, callerPackage, resolvedType);
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if (!ordered && NR > 0 && !mEnableModernQueue) {
// If we are not serializing this broadcast, then send the
@@ -14726,7 +14731,7 @@
|| resultTo != null) {
BroadcastQueue queue = broadcastQueueForIntent(intent);
filterNonExportedComponents(intent, callingUid, receivers,
- mPlatformCompat, callerPackage);
+ mPlatformCompat, callerPackage, resolvedType);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp, callerPackage,
callerFeatureId, callingPid, callingUid, callerInstantApp, resolvedType,
requiredPermissions, excludedPermissions, excludedPackages, appOp, brOptions,
diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java
index fada577..622c6ee 100644
--- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java
+++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java
@@ -52,6 +52,7 @@
import com.android.internal.app.ResolverActivity;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.FrameworkStatsLog;
import com.android.server.am.ActivityManagerService;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.pkg.AndroidPackage;
@@ -102,7 +103,8 @@
}
private static void filterNonExportedComponents(Intent intent, int filterCallingUid,
- List<ResolveInfo> query, PlatformCompat platformCompat, Computer computer) {
+ List<ResolveInfo> query, PlatformCompat platformCompat, String resolvedType,
+ Computer computer) {
if (query == null
|| intent.getPackage() != null
|| intent.getComponent() != null
@@ -113,21 +115,24 @@
String callerPackage = caller == null ? "Not specified" : caller.getPackageName();
for (int i = query.size() - 1; i >= 0; i--) {
if (!query.get(i).getComponentInfo().exported) {
- if (!platformCompat.isChangeEnabledByUid(
+ boolean hasToBeExportedToMatch = platformCompat.isChangeEnabledByUid(
ActivityManagerService.IMPLICIT_INTENTS_ONLY_MATCH_EXPORTED_COMPONENTS,
- filterCallingUid)) {
- Slog.w(TAG, "Non-exported component not filtered out "
- + "(will be filtered out once the app targets U+)- intent: "
- + intent.getAction() + ", component: "
- + query.get(i).getComponentInfo()
- .getComponentName().flattenToShortString()
- + ", starter: " + callerPackage);
+ filterCallingUid);
+ String[] categories = intent.getCategories() == null ? new String[0]
+ : intent.getCategories().toArray(String[]::new);
+ FrameworkStatsLog.write(FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED,
+ FrameworkStatsLog.UNSAFE_INTENT_EVENT_REPORTED__EVENT_TYPE__INTERNAL_NON_EXPORTED_COMPONENT_MATCH,
+ filterCallingUid,
+ query.get(i).getComponentInfo().getComponentName().flattenToShortString(),
+ callerPackage,
+ intent.getAction(),
+ categories,
+ resolvedType,
+ intent.getScheme(),
+ hasToBeExportedToMatch);
+ if (!hasToBeExportedToMatch) {
return;
}
- Slog.w(TAG, "Non-exported component filtered out - intent: "
- + intent.getAction() + ", component: "
- + query.get(i).getComponentInfo().getComponentName().flattenToShortString()
- + ", starter: " + callerPackage);
query.remove(i);
}
}
@@ -173,7 +178,7 @@
resolveForStart, true /*allowDynamicSplits*/);
if (exportedComponentsOnly) {
filterNonExportedComponents(intent, filterCallingUid, query,
- mPlatformCompat, computer);
+ mPlatformCompat, resolvedType, computer);
}
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);