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

Commit 6f8ed225 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...

Merge "Add logging for activity starts to be blocked as part of go/activity-security" into tm-qpr-dev
parents 10c2f364 d582aff2
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;
@@ -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;
    }