Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1356f84f authored by Hani Kazmi's avatar Hani Kazmi Committed by Android (Google) Code Review
Browse files

Merge "Add logging for activity starts to be blocked as part of go/activity-security"

parents 57637afa 8df42f50
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -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;
@@ -2095,6 +2096,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
                    ? mRootWindowContainer.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;
    }

+4 −0
Original line number Diff line number Diff line
@@ -1820,6 +1820,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        return getItemFromTaskDisplayAreas(TaskDisplayArea::getFocusedActivity);
    }

    boolean hasResumedActivity(int uid) {
        return forAllActivities(ar -> ar.isState(RESUMED) && ar.getUid() == uid);
    }

    boolean isTopDisplayFocusedRootTask(Task task) {
        return task != null && task == getTopDisplayFocusedRootTask();
    }