From 5c5afc5603835ec73e16e10703416fa52222af33 Mon Sep 17 00:00:00 2001 From: Ted Bauer Date: Wed, 29 Mar 2023 14:25:14 +0000 Subject: [PATCH] Add namespace-level flag-write allowlist. Also migrate some tests to allowlisted functionality, that exercise the namespace flag-write allowlist. Test: Presubmits Bug: 273546621 Change-Id: I686dfd3c11b0e49f94cc46b3d009107c0a3b8e1a --- core/tests/coretests/AndroidManifest.xml | 3 +- .../src/com/android/providers/settings/OWNERS | 1 + .../providers/settings/SettingsProvider.java | 10 ++++- .../settings/WritableNamespacePrefixes.java | 39 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 packages/SettingsProvider/src/com/android/providers/settings/OWNERS create mode 100644 packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index bf8ca8bc37641..4cccf8e49890f 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -76,7 +76,8 @@ - + + diff --git a/packages/SettingsProvider/src/com/android/providers/settings/OWNERS b/packages/SettingsProvider/src/com/android/providers/settings/OWNERS new file mode 100644 index 0000000000000..0b71816062478 --- /dev/null +++ b/packages/SettingsProvider/src/com/android/providers/settings/OWNERS @@ -0,0 +1 @@ +per-file WritableNamespacePrefixes.java = cbrubaker@google.com,tedbauer@google.com diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 5a8c59489ec84..3e1b597094d2e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2323,7 +2323,15 @@ public class SettingsProvider extends ContentProvider { return; } else if (hasAllowlistPermission) { for (String flag : flags) { - if (!DeviceConfig.getAdbWritableFlags().contains(flag)) { + boolean namespaceAllowed = false; + for (String allowlistedPrefix : WritableNamespacePrefixes.ALLOWLIST) { + if (flag.startsWith(allowlistedPrefix)) { + namespaceAllowed = true; + break; + } + } + + if (!namespaceAllowed && !DeviceConfig.getAdbWritableFlags().contains(flag)) { throw new SecurityException("Permission denial for flag '" + flag + "'; allowlist permission granted, but must add flag to the allowlist."); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java new file mode 100644 index 0000000000000..28f25e0cc407e --- /dev/null +++ b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespacePrefixes.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.providers.settings; + +import android.util.ArraySet; + +import java.util.Arrays; +import java.util.Set; + +/** + * Contains the list of prefixes for namespaces in which any flag can be written with adb. + *

+ * A security review is required for any prefix that's added to this list. To add to + * the list, create a change and tag the OWNER. In the change description, include a + * description of the flag's functionality, and a justification for why it needs to be + * allowlisted. + */ +final class WritableNamespacePrefixes { + public static final Set ALLOWLIST = + new ArraySet(Arrays.asList( + "app_compat_overrides", + "game_overlay", + "namespace1" + )); +}