From 7970fff4cdd50fb1b228d84304a5bda3174a0a8d Mon Sep 17 00:00:00 2001 From: Michael Groover Date: Tue, 21 Dec 2021 16:33:12 -0800 Subject: [PATCH] Add a receiver exported flag to mark unaudited runtime receivers Android T allows apps to declare a runtime receiver as not exported by invoking registerReceiver with a new RECEIVER_NOT_EXPORTED flag; receivers registered with this flag will only receive broadcasts from the platform and the app itself. However to ensure developers can properly protect their receivers, all apps targeting T or later registering a receiver for non-system broadcasts must specify either the exported or not exported flag when invoking #registerReceiver; if one of these flags is not provided, the platform will throw a SecurityException. The platform and system apps have several locations where a receiver is registered for non-system broadcasts that have not yet been audited to determine if they should be exported. This commit introduces a temporary flag that can be used to meet the new requirement that a flag be specified while also marking the receiver as needing an audit before the T release to determine whether the receiver should be exported or not. Bug: 161145287 Test: atest ContextTest Change-Id: Ie9d1e2ad6e2d831c374437ed65d085711b7dc3b7 --- core/api/test-current.txt | 1 + core/java/android/content/Context.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 89dc678360f15..75c81a45c860c 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -699,6 +699,7 @@ package android.content { field public static final String FONT_SERVICE = "font"; field public static final String POWER_EXEMPTION_SERVICE = "power_exemption"; field @Deprecated public static final String POWER_WHITELIST_MANAGER = "power_whitelist"; + field @Deprecated public static final int RECEIVER_EXPORTED_UNAUDITED = 2; // 0x2 field public static final String TEST_NETWORK_SERVICE = "test_network"; } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 6d13712b68ae1..117f305183118 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -534,7 +534,8 @@ public abstract class Context { /** @hide */ @IntDef(flag = true, prefix = { "RECEIVER_VISIBLE" }, value = { - RECEIVER_VISIBLE_TO_INSTANT_APPS, RECEIVER_EXPORTED, RECEIVER_NOT_EXPORTED + RECEIVER_VISIBLE_TO_INSTANT_APPS, RECEIVER_EXPORTED, RECEIVER_NOT_EXPORTED, + RECEIVER_EXPORTED_UNAUDITED }) @Retention(RetentionPolicy.SOURCE) public @interface RegisterReceiverFlags {} @@ -550,6 +551,14 @@ public abstract class Context { */ public static final int RECEIVER_EXPORTED = 0x2; + /** + * @deprecated Use {@link #RECEIVER_NOT_EXPORTED} or {@link #RECEIVER_EXPORTED} instead. + * @hide + */ + @Deprecated + @TestApi + public static final int RECEIVER_EXPORTED_UNAUDITED = RECEIVER_EXPORTED; + /** * Flag for {@link #registerReceiver}: The receiver cannot receive broadcasts from other Apps. * Has the same behavior as marking a statically registered receiver with "exported=false"