diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityStarter.java | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 4c580df6e330..f9e59c87a67f 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -131,6 +131,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.app.IVoiceInteractor; import com.android.internal.protolog.common.ProtoLog; +import com.android.internal.util.FrameworkStatsLog; import com.android.server.am.PendingIntentRecord; import com.android.server.pm.InstantAppResolver; import com.android.server.power.ShutdownCheckPoints; @@ -2100,6 +2101,49 @@ class ActivityStarter { } } + // Log activity starts which violate one of the following rules of the + // activity security model (ASM): + // 1. Only the top activity on a task can start activities on that task + // 2. Only the top activity on the top task can create new (top) tasks + // We don't currently block, but these checks may later become blocks + // TODO(b/236234252): Shift to BackgroundActivityStartController once + // class is ready + if (mSourceRecord != null) { + int callerUid = mSourceRecord.getUid(); + ActivityRecord targetTopActivity = + targetTask != null ? targetTask.getTopNonFinishingActivity() : null; + boolean passesAsmChecks = newTask + ? mService.mVisibleActivityProcessTracker.hasResumedActivity(callerUid) + : targetTopActivity != null && targetTopActivity.getUid() == callerUid; + + if (!passesAsmChecks) { + Slog.i(TAG, "Launching r: " + r + + " from background: " + mSourceRecord + + ". New task: " + newTask); + boolean newOrEmptyTask = newTask || (targetTopActivity == null); + FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_ACTION_BLOCKED, + /* caller_uid */ + callerUid, + /* caller_activity_class_name */ + mSourceRecord.info.name, + /* target_task_top_activity_uid */ + newOrEmptyTask ? -1 : targetTopActivity.getUid(), + /* target_task_top_activity_class_name */ + newOrEmptyTask ? null : targetTopActivity.info.name, + /* target_task_is_different */ + newTask || !mSourceRecord.getTask().equals(targetTask), + /* target_activity_uid */ + r.getUid(), + /* target_activity_class_name */ + r.info.name, + /* target_intent_action */ + r.intent.getAction(), + /* target_intent_flags */ + r.intent.getFlags() + ); + } + } + return START_SUCCESS; } |