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

Commit 431ad58f authored by Ayush Sharma's avatar Ayush Sharma
Browse files

Enforce guards against crash command via shell

Enforce DISALLOW_DEBUGGING_FEATURES for crash command via shell
Bug: 205729133
Test: Manual

Change-Id: I2576db76ce614f2ef5b93ee28e8ea74c493c86dd
parent 012dcb8b
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -1200,8 +1200,19 @@ final class ActivityManagerShellCommand extends ShellCommand {
        } catch (NumberFormatException e) {
            packageName = arg;
        }
        mInterface.crashApplicationWithType(-1, pid, packageName, userId, "shell-induced crash",

        int[] userIds = (userId == UserHandle.USER_ALL) ? mInternal.mUserController.getUserIds()
                : new int[]{userId};
        for (int id : userIds) {
            if (mInternal.mUserController.hasUserRestriction(
                    UserManager.DISALLOW_DEBUGGING_FEATURES, id)) {
                getOutPrintWriter().println(
                        "Shell does not have permission to crash packages for user " + id);
                continue;
            }
            mInterface.crashApplicationWithType(-1, pid, packageName, id, "shell-induced crash",
                    false, CrashedByAdbException.TYPE_ID);
        }
        return 0;
    }

+11 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.app.ActivityOptions;
import android.app.AnrController;
import android.app.ApplicationErrorReport;
import android.app.ApplicationExitInfo;
import android.app.RemoteServiceException.CrashedByAdbException;
import android.app.usage.UsageStatsManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -523,6 +524,16 @@ class AppErrors {
            return;
        }

        if (exceptionTypeId == CrashedByAdbException.TYPE_ID) {
            String[] packages = proc.getPackageList();
            for (int i = 0; i < packages.length; i++) {
                if (mService.mPackageManagerInt.isPackageStateProtected(packages[i], proc.userId)) {
                    Slog.w(TAG, "crashApplication: Can not crash protected package " + packages[i]);
                    return;
                }
            }
        }

        proc.scheduleCrashLocked(message, exceptionTypeId, extras);
        if (force) {
            // If the app is responsive, the scheduled crash will happen as expected