Replace the permission of internal connectivity checks

A number of connectivity checks that protect system-only methods
check for CONNECTIVITY_INTERNAL, but CONNECTIVITY_INTERNAL is a
signature|privileged permission. We should audit the permission
checks, and convert checks that protect code that should not be
called outside the system to a signature permission. So replace
all CONNECTIVITY_INTERNAL to other proper permissions.

Bug: 32963470
Test: atest FrameworksNetTests NetworkPolicyManagerServiceTest
Change-Id: I8f2dd1cd0609056494eaf612d39820e273ae093f
This commit is contained in:
paulhu
2019-08-12 16:25:11 +08:00
parent c751dfc630
commit a6af6b6c2a
19 changed files with 190 additions and 138 deletions

View File

@@ -58,7 +58,7 @@ package android {
field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA"; field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS"; field public static final String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
field public static final String CONFIGURE_WIFI_DISPLAY = "android.permission.CONFIGURE_WIFI_DISPLAY"; field public static final String CONFIGURE_WIFI_DISPLAY = "android.permission.CONFIGURE_WIFI_DISPLAY";
field public static final String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL"; field @Deprecated public static final String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL";
field public static final String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"; field public static final String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS";
field public static final String CONTROL_DISPLAY_COLOR_TRANSFORMS = "android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS"; field public static final String CONTROL_DISPLAY_COLOR_TRANSFORMS = "android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS";
field public static final String CONTROL_DISPLAY_SATURATION = "android.permission.CONTROL_DISPLAY_SATURATION"; field public static final String CONTROL_DISPLAY_SATURATION = "android.permission.CONTROL_DISPLAY_SATURATION";
@@ -126,6 +126,7 @@ package android {
field public static final String MODIFY_QUIET_MODE = "android.permission.MODIFY_QUIET_MODE"; field public static final String MODIFY_QUIET_MODE = "android.permission.MODIFY_QUIET_MODE";
field public static final String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE"; field public static final String MOVE_PACKAGE = "android.permission.MOVE_PACKAGE";
field public static final String NETWORK_CARRIER_PROVISIONING = "android.permission.NETWORK_CARRIER_PROVISIONING"; field public static final String NETWORK_CARRIER_PROVISIONING = "android.permission.NETWORK_CARRIER_PROVISIONING";
field public static final String NETWORK_FACTORY = "android.permission.NETWORK_FACTORY";
field public static final String NETWORK_MANAGED_PROVISIONING = "android.permission.NETWORK_MANAGED_PROVISIONING"; field public static final String NETWORK_MANAGED_PROVISIONING = "android.permission.NETWORK_MANAGED_PROVISIONING";
field public static final String NETWORK_SCAN = "android.permission.NETWORK_SCAN"; field public static final String NETWORK_SCAN = "android.permission.NETWORK_SCAN";
field public static final String NETWORK_SETTINGS = "android.permission.NETWORK_SETTINGS"; field public static final String NETWORK_SETTINGS = "android.permission.NETWORK_SETTINGS";
@@ -135,6 +136,7 @@ package android {
field public static final String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP"; field public static final String NOTIFICATION_DURING_SETUP = "android.permission.NOTIFICATION_DURING_SETUP";
field public static final String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS"; field public static final String NOTIFY_TV_INPUTS = "android.permission.NOTIFY_TV_INPUTS";
field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE"; field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE";
field public static final String OBSERVE_NETWORK_POLICY = "android.permission.OBSERVE_NETWORK_POLICY";
field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS"; field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS";
field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS"; field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS";
field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG"; field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG";
@@ -4340,7 +4342,7 @@ package android.net {
public class ConnectivityManager { public class ConnectivityManager {
method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createNattKeepalive(@NonNull android.net.Network, @NonNull android.os.ParcelFileDescriptor, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback); method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createNattKeepalive(@NonNull android.net.Network, @NonNull android.os.ParcelFileDescriptor, @NonNull java.net.InetAddress, @NonNull java.net.InetAddress, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull java.net.Socket, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback); method @NonNull @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull java.net.Socket, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl(); method @Deprecated @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String getCaptivePortalServerUrl();
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported(); method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback); method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEventCallback);

View File

@@ -1006,7 +1006,7 @@ public class ConnectivityManager {
* *
* @hide * @hide
*/ */
@RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
@Nullable @Nullable
public Network getActiveNetworkForUid(int uid) { public Network getActiveNetworkForUid(int uid) {
return getActiveNetworkForUid(uid, false); return getActiveNetworkForUid(uid, false);
@@ -1135,7 +1135,7 @@ public class ConnectivityManager {
* *
* {@hide} * {@hide}
*/ */
@RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
@UnsupportedAppUsage @UnsupportedAppUsage
public NetworkInfo getActiveNetworkInfoForUid(int uid) { public NetworkInfo getActiveNetworkInfoForUid(int uid) {
return getActiveNetworkInfoForUid(uid, false); return getActiveNetworkInfoForUid(uid, false);
@@ -1370,10 +1370,14 @@ public class ConnectivityManager {
* The system network validation may be using different strategies to detect captive portals, * The system network validation may be using different strategies to detect captive portals,
* so this method does not necessarily return a URL used by the system. It only returns a URL * so this method does not necessarily return a URL used by the system. It only returns a URL
* that may be relevant for other components trying to detect captive portals. * that may be relevant for other components trying to detect captive portals.
*
* @hide * @hide
* @deprecated This API returns URL which is not guaranteed to be one of the URLs used by the
* system.
*/ */
@Deprecated
@SystemApi @SystemApi
@RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public String getCaptivePortalServerUrl() { public String getCaptivePortalServerUrl() {
try { try {
return mService.getCaptivePortalServerUrl(); return mService.getCaptivePortalServerUrl();
@@ -2399,6 +2403,7 @@ public class ConnectivityManager {
* @return an array of 0 or more {@code String} of tethered dhcp ranges. * @return an array of 0 or more {@code String} of tethered dhcp ranges.
* {@hide} * {@hide}
*/ */
@RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public String[] getTetheredDhcpRanges() { public String[] getTetheredDhcpRanges() {
try { try {
return mService.getTetheredDhcpRanges(); return mService.getTetheredDhcpRanges();
@@ -2978,7 +2983,7 @@ public class ConnectivityManager {
* HTTP proxy. A {@code null} value will clear the global HTTP proxy. * HTTP proxy. A {@code null} value will clear the global HTTP proxy.
* @hide * @hide
*/ */
@RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
public void setGlobalProxy(ProxyInfo p) { public void setGlobalProxy(ProxyInfo p) {
try { try {
mService.setGlobalProxy(p); mService.setGlobalProxy(p);
@@ -3123,6 +3128,7 @@ public class ConnectivityManager {
* Get the mobile provisioning url. * Get the mobile provisioning url.
* {@hide} * {@hide}
*/ */
@RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public String getMobileProvisioningUrl() { public String getMobileProvisioningUrl() {
try { try {
return mService.getMobileProvisioningUrl(); return mService.getMobileProvisioningUrl();
@@ -3169,6 +3175,7 @@ public class ConnectivityManager {
/** {@hide} - returns the factory serial number */ /** {@hide} - returns the factory serial number */
@UnsupportedAppUsage @UnsupportedAppUsage
@RequiresPermission(android.Manifest.permission.NETWORK_FACTORY)
public int registerNetworkFactory(Messenger messenger, String name) { public int registerNetworkFactory(Messenger messenger, String name) {
try { try {
return mService.registerNetworkFactory(messenger, name); return mService.registerNetworkFactory(messenger, name);
@@ -3179,6 +3186,7 @@ public class ConnectivityManager {
/** {@hide} */ /** {@hide} */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
@RequiresPermission(android.Manifest.permission.NETWORK_FACTORY)
public void unregisterNetworkFactory(Messenger messenger) { public void unregisterNetworkFactory(Messenger messenger) {
try { try {
mService.unregisterNetworkFactory(messenger); mService.unregisterNetworkFactory(messenger);
@@ -3196,6 +3204,7 @@ public class ConnectivityManager {
* Register a NetworkAgent with ConnectivityService. * Register a NetworkAgent with ConnectivityService.
* @return NetID corresponding to NetworkAgent. * @return NetID corresponding to NetworkAgent.
*/ */
@RequiresPermission(android.Manifest.permission.NETWORK_FACTORY)
public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkMisc misc) { NetworkCapabilities nc, int score, NetworkMisc misc) {
return registerNetworkAgent(messenger, ni, lp, nc, score, misc, return registerNetworkAgent(messenger, ni, lp, nc, score, misc,
@@ -3207,6 +3216,7 @@ public class ConnectivityManager {
* Register a NetworkAgent with ConnectivityService. * Register a NetworkAgent with ConnectivityService.
* @return NetID corresponding to NetworkAgent. * @return NetID corresponding to NetworkAgent.
*/ */
@RequiresPermission(android.Manifest.permission.NETWORK_FACTORY)
public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp,
NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) { NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) {
try { try {
@@ -4201,7 +4211,7 @@ public class ConnectivityManager {
* *
* @hide * @hide
*/ */
@RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public void startCaptivePortalApp(Network network) { public void startCaptivePortalApp(Network network) {
try { try {
mService.startCaptivePortalApp(network); mService.startCaptivePortalApp(network);
@@ -4317,6 +4327,7 @@ public class ConnectivityManager {
* Resets all connectivity manager settings back to factory defaults. * Resets all connectivity manager settings back to factory defaults.
* @hide * @hide
*/ */
@RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
public void factoryReset() { public void factoryReset() {
try { try {
mService.factoryReset(); mService.factoryReset();

View File

@@ -1614,6 +1614,14 @@
<permission android:name="android.permission.NETWORK_STACK" <permission android:name="android.permission.NETWORK_STACK"
android:protectionLevel="signature" /> android:protectionLevel="signature" />
<!-- @SystemApi @hide Allows an application to observe network policy changes. -->
<permission android:name="android.permission.OBSERVE_NETWORK_POLICY"
android:protectionLevel="signature" />
<!-- @SystemApi @hide Allows applications to register network factory or agent -->
<permission android:name="android.permission.NETWORK_FACTORY"
android:protectionLevel="signature" />
<!-- Allows Settings and SystemUI to call methods in Networking services <!-- Allows Settings and SystemUI to call methods in Networking services
<p>Not for use by third-party or privileged applications. <p>Not for use by third-party or privileged applications.
@SystemApi @SystemApi
@@ -1744,7 +1752,11 @@
<permission android:name="android.permission.NFC_TRANSACTION_EVENT" <permission android:name="android.permission.NFC_TRANSACTION_EVENT"
android:protectionLevel="normal" /> android:protectionLevel="normal" />
<!-- @SystemApi Allows an internal user to use privileged ConnectivityManager APIs. <!-- @deprecated This permission used to allow too broad access to sensitive methods and all its
uses have been replaced by a more appropriate permission. Most uses have been replaced with
a NETWORK_STACK or NETWORK_SETTINGS check. Please look up the documentation of the
individual functions to figure out what permission now protects the individual function.
@SystemApi Allows an internal user to use privileged ConnectivityManager APIs.
@hide --> @hide -->
<permission android:name="android.permission.CONNECTIVITY_INTERNAL" <permission android:name="android.permission.CONNECTIVITY_INTERNAL"
android:protectionLevel="signature|privileged" /> android:protectionLevel="signature|privileged" />

View File

@@ -508,7 +508,7 @@
--> -->
<string translatable="false" name="config_mobile_hotspot_provision_app_no_ui"></string> <string translatable="false" name="config_mobile_hotspot_provision_app_no_ui"></string>
<!-- Sent in response to a provisioning check. The caller must hold the <!-- Sent in response to a provisioning check. The caller must hold the
permission android.permission.CONNECTIVITY_INTERNAL for Settings to permission android.permission.TETHER_PRIVILEGED for Settings to
receive this response. receive this response.
See config_mobile_hotspot_provision_response See config_mobile_hotspot_provision_response

View File

@@ -73,9 +73,9 @@
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<!-- This permission is added for API call setAirplaneMode() in ConnectivityManager -->
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.TETHER_PRIVILEGED" /> <uses-permission android:name="android.permission.TETHER_PRIVILEGED" />
<!-- This permission is added for API call setAirplaneMode() in ConnectivityManager -->
<uses-permission android:name="android.permission.NETWORK_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER" /> <uses-permission android:name="android.permission.DEVICE_POWER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

View File

@@ -30,7 +30,6 @@
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

View File

@@ -21,7 +21,6 @@
<uses-permission android:name="android.permission.CONTROL_VPN" /> <uses-permission android:name="android.permission.CONTROL_VPN" />
<uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN" /> <uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"/> <uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"/>
<application android:label="VpnDialogs" <application android:label="VpnDialogs"

View File

@@ -1395,7 +1395,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) {
enforceConnectivityInternalPermission(); NetworkStack.checkNetworkStackPermission(mContext);
return getActiveNetworkForUidInternal(uid, ignoreBlocked); return getActiveNetworkForUidInternal(uid, ignoreBlocked);
} }
@@ -1437,7 +1437,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
enforceConnectivityInternalPermission(); NetworkStack.checkNetworkStackPermission(mContext);
final NetworkState state = getUnfilteredActiveNetworkState(uid); final NetworkState state = getUnfilteredActiveNetworkState(uid);
filterNetworkStateForUid(state, uid, ignoreBlocked); filterNetworkStateForUid(state, uid, ignoreBlocked);
return state.networkInfo; return state.networkInfo;
@@ -1656,8 +1656,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkState[] getAllNetworkState() { public NetworkState[] getAllNetworkState() {
// Require internal since we're handing out IMSI details // This contains IMSI details, so make sure the caller is privileged.
enforceConnectivityInternalPermission(); NetworkStack.checkNetworkStackPermission(mContext);
final ArrayList<NetworkState> result = Lists.newArrayList(); final ArrayList<NetworkState> result = Lists.newArrayList();
for (Network network : getAllNetworks()) { for (Network network : getAllNetworks()) {
@@ -1735,7 +1735,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
enforceChangePermission(); enforceChangePermission();
if (mProtectedNetworks.contains(networkType)) { if (mProtectedNetworks.contains(networkType)) {
enforceConnectivityInternalPermission(); enforceConnectivityRestrictedNetworksPermission();
} }
InetAddress addr; InetAddress addr;
@@ -2005,6 +2005,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK); NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
} }
private void enforceNetworkFactoryPermission() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.NETWORK_FACTORY,
"ConnectivityService");
}
private boolean checkSettingsPermission() { private boolean checkSettingsPermission() {
return checkAnyPermissionOf( return checkAnyPermissionOf(
android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETTINGS,
@@ -2024,18 +2030,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
"ConnectivityService"); "ConnectivityService");
} }
private void enforceConnectivityInternalPermission() {
enforceAnyPermissionOf(
android.Manifest.permission.CONNECTIVITY_INTERNAL,
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
}
private void enforceControlAlwaysOnVpnPermission() { private void enforceControlAlwaysOnVpnPermission() {
mContext.enforceCallingOrSelfPermission( mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CONTROL_ALWAYS_ON_VPN, android.Manifest.permission.CONTROL_ALWAYS_ON_VPN,
"ConnectivityService"); "ConnectivityService");
} }
private void enforceNetworkStackOrSettingsPermission() {
enforceAnyPermissionOf(
android.Manifest.permission.NETWORK_SETTINGS,
android.Manifest.permission.NETWORK_STACK,
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
}
private void enforceNetworkStackSettingsOrSetup() { private void enforceNetworkStackSettingsOrSetup() {
enforceAnyPermissionOf( enforceAnyPermissionOf(
android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETTINGS,
@@ -2063,7 +2070,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
"ConnectivityService"); "ConnectivityService");
return; return;
} catch (SecurityException e) { /* fallback to ConnectivityInternalPermission */ } } catch (SecurityException e) { /* fallback to ConnectivityInternalPermission */ }
enforceConnectivityInternalPermission(); // TODO: Remove this fallback check after all apps have declared
// CONNECTIVITY_USE_RESTRICTED_NETWORKS.
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CONNECTIVITY_INTERNAL,
"ConnectivityService");
} }
private void enforceKeepalivePermission() { private void enforceKeepalivePermission() {
@@ -2072,7 +2083,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Public because it's used by mLockdownTracker. // Public because it's used by mLockdownTracker.
public void sendConnectedBroadcast(NetworkInfo info) { public void sendConnectedBroadcast(NetworkInfo info) {
enforceConnectivityInternalPermission(); NetworkStack.checkNetworkStackPermission(mContext);
sendGeneralBroadcast(info, CONNECTIVITY_ACTION); sendGeneralBroadcast(info, CONNECTIVITY_ACTION);
} }
@@ -3589,7 +3600,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void startCaptivePortalApp(Network network) { public void startCaptivePortalApp(Network network) {
enforceConnectivityInternalPermission(); enforceNetworkStackOrSettingsPermission();
mHandler.post(() -> { mHandler.post(() -> {
NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
if (nai == null) return; if (nai == null) return;
@@ -4080,7 +4091,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public String[] getTetheredDhcpRanges() { public String[] getTetheredDhcpRanges() {
enforceConnectivityInternalPermission(); enforceSettingsPermission();
return mTetheringManager.getTetheredDhcpRanges(); return mTetheringManager.getTetheredDhcpRanges();
} }
@@ -4304,7 +4315,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void setGlobalProxy(final ProxyInfo proxyProperties) { public void setGlobalProxy(final ProxyInfo proxyProperties) {
enforceConnectivityInternalPermission(); NetworkStack.checkNetworkStackPermission(mContext);
mProxyTracker.setGlobalProxy(proxyProperties); mProxyTracker.setGlobalProxy(proxyProperties);
} }
@@ -4843,7 +4854,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public String getMobileProvisioningUrl() { public String getMobileProvisioningUrl() {
enforceConnectivityInternalPermission(); enforceSettingsPermission();
String url = getProvisioningUrlBaseFromFile(); String url = getProvisioningUrlBaseFromFile();
if (TextUtils.isEmpty(url)) { if (TextUtils.isEmpty(url)) {
url = mContext.getResources().getString(R.string.mobile_provisioning_url); url = mContext.getResources().getString(R.string.mobile_provisioning_url);
@@ -4869,7 +4880,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void setProvisioningNotificationVisible(boolean visible, int networkType, public void setProvisioningNotificationVisible(boolean visible, int networkType,
String action) { String action) {
enforceConnectivityInternalPermission(); enforceSettingsPermission();
if (!ConnectivityManager.isNetworkTypeValid(networkType)) { if (!ConnectivityManager.isNetworkTypeValid(networkType)) {
return; return;
} }
@@ -5457,7 +5468,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public int registerNetworkFactory(Messenger messenger, String name) { public int registerNetworkFactory(Messenger messenger, String name) {
enforceConnectivityInternalPermission(); enforceNetworkFactoryPermission();
NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(), NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(),
NetworkFactory.SerialNumber.nextSerialNumber()); NetworkFactory.SerialNumber.nextSerialNumber());
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
@@ -5472,7 +5483,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void unregisterNetworkFactory(Messenger messenger) { public void unregisterNetworkFactory(Messenger messenger) {
enforceConnectivityInternalPermission(); enforceNetworkFactoryPermission();
mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_FACTORY, messenger)); mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_FACTORY, messenger));
} }
@@ -5571,7 +5582,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
LinkProperties linkProperties, NetworkCapabilities networkCapabilities, LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
int currentScore, NetworkMisc networkMisc, int factorySerialNumber) { int currentScore, NetworkMisc networkMisc, int factorySerialNumber) {
enforceConnectivityInternalPermission(); enforceNetworkFactoryPermission();
LinkProperties lp = new LinkProperties(linkProperties); LinkProperties lp = new LinkProperties(linkProperties);
lp.ensureDirectlyConnectedRoutes(); lp.ensureDirectlyConnectedRoutes();
@@ -6935,7 +6946,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public String getCaptivePortalServerUrl() { public String getCaptivePortalServerUrl() {
enforceConnectivityInternalPermission(); enforceNetworkStackOrSettingsPermission();
String settingUrl = mContext.getResources().getString( String settingUrl = mContext.getResources().getString(
R.string.config_networkCaptivePortalServerUrl); R.string.config_networkCaptivePortalServerUrl);
@@ -6988,7 +6999,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void factoryReset() { public void factoryReset() {
enforceConnectivityInternalPermission(); enforceSettingsPermission();
if (mUserManager.hasUserRestriction(UserManager.DISALLOW_NETWORK_RESET)) { if (mUserManager.hasUserRestriction(UserManager.DISALLOW_NETWORK_RESET)) {
return; return;

View File

@@ -16,9 +16,8 @@
package com.android.server; package com.android.server;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.NETWORK_SETTINGS; import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.OBSERVE_NETWORK_POLICY;
import static android.Manifest.permission.SHUTDOWN; import static android.Manifest.permission.SHUTDOWN;
import static android.net.INetd.FIREWALL_BLACKLIST; import static android.net.INetd.FIREWALL_BLACKLIST;
import static android.net.INetd.FIREWALL_CHAIN_DOZABLE; import static android.net.INetd.FIREWALL_CHAIN_DOZABLE;
@@ -54,6 +53,7 @@ import android.net.IpPrefix;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.Network; import android.net.Network;
import android.net.NetworkPolicyManager; import android.net.NetworkPolicyManager;
import android.net.NetworkStack;
import android.net.NetworkStats; import android.net.NetworkStats;
import android.net.NetworkUtils; import android.net.NetworkUtils;
import android.net.RouteInfo; import android.net.RouteInfo;
@@ -312,13 +312,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void registerObserver(INetworkManagementEventObserver observer) { public void registerObserver(INetworkManagementEventObserver observer) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
mObservers.register(observer); mObservers.register(observer);
} }
@Override @Override
public void unregisterObserver(INetworkManagementEventObserver observer) { public void unregisterObserver(INetworkManagementEventObserver observer) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
mObservers.unregister(observer); mObservers.unregister(observer);
} }
@@ -453,7 +453,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) { public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) {
mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); NetworkStack.checkNetworkStackPermission(mContext);
Preconditions.checkNotNull(provider); Preconditions.checkNotNull(provider);
synchronized(mTetheringStatsProviders) { synchronized(mTetheringStatsProviders) {
mTetheringStatsProviders.put(provider, name); mTetheringStatsProviders.put(provider, name);
@@ -462,7 +462,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) { public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) {
mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); NetworkStack.checkNetworkStackPermission(mContext);
synchronized(mTetheringStatsProviders) { synchronized(mTetheringStatsProviders) {
mTetheringStatsProviders.remove(provider); mTetheringStatsProviders.remove(provider);
} }
@@ -470,7 +470,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void tetherLimitReached(ITetheringStatsProvider provider) { public void tetherLimitReached(ITetheringStatsProvider provider) {
mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); NetworkStack.checkNetworkStackPermission(mContext);
synchronized(mTetheringStatsProviders) { synchronized(mTetheringStatsProviders) {
if (!mTetheringStatsProviders.containsKey(provider)) { if (!mTetheringStatsProviders.containsKey(provider)) {
return; return;
@@ -737,7 +737,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
// //
@Override @Override
public String[] listInterfaces() { public String[] listInterfaces() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
return mNetdService.interfaceGetList(); return mNetdService.interfaceGetList();
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -787,7 +787,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public InterfaceConfiguration getInterfaceConfig(String iface) { public InterfaceConfiguration getInterfaceConfig(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
final InterfaceConfigurationParcel result; final InterfaceConfigurationParcel result;
try { try {
result = mNetdService.interfaceGetCfg(iface); result = mNetdService.interfaceGetCfg(iface);
@@ -805,7 +805,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setInterfaceConfig(String iface, InterfaceConfiguration cfg) { public void setInterfaceConfig(String iface, InterfaceConfiguration cfg) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
LinkAddress linkAddr = cfg.getLinkAddress(); LinkAddress linkAddr = cfg.getLinkAddress();
if (linkAddr == null || linkAddr.getAddress() == null) { if (linkAddr == null || linkAddr.getAddress() == null) {
throw new IllegalStateException("Null LinkAddress given"); throw new IllegalStateException("Null LinkAddress given");
@@ -822,7 +822,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setInterfaceDown(String iface) { public void setInterfaceDown(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
final InterfaceConfiguration ifcg = getInterfaceConfig(iface); final InterfaceConfiguration ifcg = getInterfaceConfig(iface);
ifcg.setInterfaceDown(); ifcg.setInterfaceDown();
setInterfaceConfig(iface, ifcg); setInterfaceConfig(iface, ifcg);
@@ -830,7 +830,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setInterfaceUp(String iface) { public void setInterfaceUp(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
final InterfaceConfiguration ifcg = getInterfaceConfig(iface); final InterfaceConfiguration ifcg = getInterfaceConfig(iface);
ifcg.setInterfaceUp(); ifcg.setInterfaceUp();
setInterfaceConfig(iface, ifcg); setInterfaceConfig(iface, ifcg);
@@ -838,7 +838,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) { public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.interfaceSetIPv6PrivacyExtensions(iface, enable); mNetdService.interfaceSetIPv6PrivacyExtensions(iface, enable);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -850,7 +850,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
IPv6 addresses on interface down, but we need to do full clean up here */ IPv6 addresses on interface down, but we need to do full clean up here */
@Override @Override
public void clearInterfaceAddresses(String iface) { public void clearInterfaceAddresses(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.interfaceClearAddrs(iface); mNetdService.interfaceClearAddrs(iface);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -860,7 +860,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void enableIpv6(String iface) { public void enableIpv6(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.interfaceSetEnableIPv6(iface, true); mNetdService.interfaceSetEnableIPv6(iface, true);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -879,7 +879,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void disableIpv6(String iface) { public void disableIpv6(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.interfaceSetEnableIPv6(iface, false); mNetdService.interfaceSetEnableIPv6(iface, false);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -898,7 +898,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
} }
private void modifyRoute(boolean add, int netId, RouteInfo route) { private void modifyRoute(boolean add, int netId, RouteInfo route) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
final String ifName = route.getInterface(); final String ifName = route.getInterface();
final String dst = route.getDestination().toString(); final String dst = route.getDestination().toString();
@@ -963,7 +963,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setMtu(String iface, int mtu) { public void setMtu(String iface, int mtu) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.interfaceSetMtu(iface, mtu); mNetdService.interfaceSetMtu(iface, mtu);
@@ -982,7 +982,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public boolean getIpForwardingEnabled() throws IllegalStateException{ public boolean getIpForwardingEnabled() throws IllegalStateException{
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
final boolean isEnabled = mNetdService.ipfwdEnabled(); final boolean isEnabled = mNetdService.ipfwdEnabled();
@@ -994,7 +994,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setIpForwardingEnabled(boolean enable) { public void setIpForwardingEnabled(boolean enable) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
if (enable) { if (enable) {
mNetdService.ipfwdEnableForwarding("tethering"); mNetdService.ipfwdEnableForwarding("tethering");
@@ -1013,7 +1013,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void startTetheringWithConfiguration(boolean usingLegacyDnsProxy, String[] dhcpRange) { public void startTetheringWithConfiguration(boolean usingLegacyDnsProxy, String[] dhcpRange) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
// an odd number of addrs will fail // an odd number of addrs will fail
try { try {
mNetdService.tetherStartWithConfiguration(usingLegacyDnsProxy, dhcpRange); mNetdService.tetherStartWithConfiguration(usingLegacyDnsProxy, dhcpRange);
@@ -1024,7 +1024,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void stopTethering() { public void stopTethering() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.tetherStop(); mNetdService.tetherStop();
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1034,7 +1034,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public boolean isTetheringStarted() { public boolean isTetheringStarted() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
final boolean isEnabled = mNetdService.tetherIsEnabled(); final boolean isEnabled = mNetdService.tetherIsEnabled();
@@ -1046,7 +1046,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void tetherInterface(String iface) { public void tetherInterface(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.tetherInterfaceAdd(iface); mNetdService.tetherInterfaceAdd(iface);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1061,7 +1061,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void untetherInterface(String iface) { public void untetherInterface(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.tetherInterfaceRemove(iface); mNetdService.tetherInterfaceRemove(iface);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1073,7 +1073,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public String[] listTetheredInterfaces() { public String[] listTetheredInterfaces() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
return mNetdService.tetherInterfaceList(); return mNetdService.tetherInterfaceList();
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1083,7 +1083,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setDnsForwarders(Network network, String[] dns) { public void setDnsForwarders(Network network, String[] dns) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
int netId = (network != null) ? network.netId : ConnectivityManager.NETID_UNSET; int netId = (network != null) ? network.netId : ConnectivityManager.NETID_UNSET;
@@ -1096,7 +1096,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public String[] getDnsForwarders() { public String[] getDnsForwarders() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
return mNetdService.tetherDnsList(); return mNetdService.tetherDnsList();
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1127,19 +1127,19 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void startInterfaceForwarding(String fromIface, String toIface) { public void startInterfaceForwarding(String fromIface, String toIface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
modifyInterfaceForward(true, fromIface, toIface); modifyInterfaceForward(true, fromIface, toIface);
} }
@Override @Override
public void stopInterfaceForwarding(String fromIface, String toIface) { public void stopInterfaceForwarding(String fromIface, String toIface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
modifyInterfaceForward(false, fromIface, toIface); modifyInterfaceForward(false, fromIface, toIface);
} }
@Override @Override
public void enableNat(String internalInterface, String externalInterface) { public void enableNat(String internalInterface, String externalInterface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.tetherAddForward(internalInterface, externalInterface); mNetdService.tetherAddForward(internalInterface, externalInterface);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1149,7 +1149,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void disableNat(String internalInterface, String externalInterface) { public void disableNat(String internalInterface, String externalInterface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.tetherRemoveForward(internalInterface, externalInterface); mNetdService.tetherRemoveForward(internalInterface, externalInterface);
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -1159,7 +1159,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void addIdleTimer(String iface, int timeout, final int type) { public void addIdleTimer(String iface, int timeout, final int type) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
if (DBG) Slog.d(TAG, "Adding idletimer"); if (DBG) Slog.d(TAG, "Adding idletimer");
@@ -1189,7 +1189,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void removeIdleTimer(String iface) { public void removeIdleTimer(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
if (DBG) Slog.d(TAG, "Removing idletimer"); if (DBG) Slog.d(TAG, "Removing idletimer");
@@ -1213,7 +1213,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setInterfaceQuota(String iface, long quotaBytes) { public void setInterfaceQuota(String iface, long quotaBytes) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
synchronized (mQuotaLock) { synchronized (mQuotaLock) {
if (mActiveQuotas.containsKey(iface)) { if (mActiveQuotas.containsKey(iface)) {
@@ -1244,7 +1244,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void removeInterfaceQuota(String iface) { public void removeInterfaceQuota(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
synchronized (mQuotaLock) { synchronized (mQuotaLock) {
if (!mActiveQuotas.containsKey(iface)) { if (!mActiveQuotas.containsKey(iface)) {
@@ -1277,7 +1277,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setInterfaceAlert(String iface, long alertBytes) { public void setInterfaceAlert(String iface, long alertBytes) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
// quick sanity check // quick sanity check
if (!mActiveQuotas.containsKey(iface)) { if (!mActiveQuotas.containsKey(iface)) {
@@ -1301,7 +1301,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void removeInterfaceAlert(String iface) { public void removeInterfaceAlert(String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
synchronized (mQuotaLock) { synchronized (mQuotaLock) {
if (!mActiveAlerts.containsKey(iface)) { if (!mActiveAlerts.containsKey(iface)) {
@@ -1321,7 +1321,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setGlobalAlert(long alertBytes) { public void setGlobalAlert(long alertBytes) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.bandwidthSetGlobalAlert(alertBytes); mNetdService.bandwidthSetGlobalAlert(alertBytes);
@@ -1331,7 +1331,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
} }
private void setUidOnMeteredNetworkList(int uid, boolean blacklist, boolean enable) { private void setUidOnMeteredNetworkList(int uid, boolean blacklist, boolean enable) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
synchronized (mQuotaLock) { synchronized (mQuotaLock) {
boolean oldEnable; boolean oldEnable;
@@ -1431,7 +1431,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setAllowOnlyVpnForUids(boolean add, UidRange[] uidRanges) public void setAllowOnlyVpnForUids(boolean add, UidRange[] uidRanges)
throws ServiceSpecificException { throws ServiceSpecificException {
mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkRejectNonSecureVpn(add, toStableParcels(uidRanges)); mNetdService.networkRejectNonSecureVpn(add, toStableParcels(uidRanges));
} catch (ServiceSpecificException e) { } catch (ServiceSpecificException e) {
@@ -1472,7 +1472,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setUidCleartextNetworkPolicy(int uid, int policy) { public void setUidCleartextNetworkPolicy(int uid, int policy) {
if (Binder.getCallingUid() != uid) { if (Binder.getCallingUid() != uid) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
} }
synchronized (mQuotaLock) { synchronized (mQuotaLock) {
@@ -1506,7 +1506,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public boolean isBandwidthControlEnabled() { public boolean isBandwidthControlEnabled() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
return true; return true;
} }
@@ -1557,7 +1556,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public NetworkStats getNetworkStatsTethering(int how) { public NetworkStats getNetworkStatsTethering(int how) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
synchronized (mTetheringStatsProviders) { synchronized (mTetheringStatsProviders) {
@@ -1575,7 +1574,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void addVpnUidRanges(int netId, UidRange[] ranges) { public void addVpnUidRanges(int netId, UidRange[] ranges) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkAddUidRanges(netId, toStableParcels(ranges)); mNetdService.networkAddUidRanges(netId, toStableParcels(ranges));
@@ -1586,7 +1585,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void removeVpnUidRanges(int netId, UidRange[] ranges) { public void removeVpnUidRanges(int netId, UidRange[] ranges) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkRemoveUidRanges(netId, toStableParcels(ranges)); mNetdService.networkRemoveUidRanges(netId, toStableParcels(ranges));
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
@@ -2020,7 +2019,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
} }
private void modifyInterfaceInNetwork(boolean add, int netId, String iface) { private void modifyInterfaceInNetwork(boolean add, int netId, String iface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
if (add) { if (add) {
mNetdService.networkAddInterface(netId, iface); mNetdService.networkAddInterface(netId, iface);
@@ -2034,7 +2033,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void addLegacyRouteForNetId(int netId, RouteInfo routeInfo, int uid) { public void addLegacyRouteForNetId(int netId, RouteInfo routeInfo, int uid) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
final LinkAddress la = routeInfo.getDestinationLinkAddress(); final LinkAddress la = routeInfo.getDestinationLinkAddress();
final String ifName = routeInfo.getInterface(); final String ifName = routeInfo.getInterface();
@@ -2055,7 +2054,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setDefaultNetId(int netId) { public void setDefaultNetId(int netId) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkSetDefault(netId); mNetdService.networkSetDefault(netId);
@@ -2066,7 +2065,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void clearDefaultNetId() { public void clearDefaultNetId() {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkClearDefault(); mNetdService.networkClearDefault();
@@ -2077,7 +2076,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void setNetworkPermission(int netId, int permission) { public void setNetworkPermission(int netId, int permission) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkSetPermissionForNetwork(netId, permission); mNetdService.networkSetPermissionForNetwork(netId, permission);
@@ -2088,7 +2087,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void allowProtect(int uid) { public void allowProtect(int uid) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkSetProtectAllow(uid); mNetdService.networkSetProtectAllow(uid);
@@ -2099,7 +2098,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public void denyProtect(int uid) { public void denyProtect(int uid) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
try { try {
mNetdService.networkSetProtectDeny(uid); mNetdService.networkSetProtectDeny(uid);
@@ -2145,7 +2144,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
@Override @Override
public boolean isNetworkRestricted(int uid) { public boolean isNetworkRestricted(int uid) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); mContext.enforceCallingOrSelfPermission(OBSERVE_NETWORK_POLICY, TAG);
return isNetworkRestrictedInternal(uid); return isNetworkRestrictedInternal(uid);
} }

View File

@@ -16,19 +16,18 @@
package com.android.server; package com.android.server;
import android.content.Context;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.net.NetworkStack;
import android.net.Uri; import android.net.Uri;
import android.net.nsd.NsdServiceInfo;
import android.net.nsd.DnsSdTxtRecord; import android.net.nsd.DnsSdTxtRecord;
import android.net.nsd.INsdManager; import android.net.nsd.INsdManager;
import android.net.nsd.NsdManager; import android.net.nsd.NsdManager;
import android.os.Binder; import android.net.nsd.NsdServiceInfo;
import android.os.HandlerThread;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.UserHandle; import android.os.UserHandle;
@@ -38,6 +37,12 @@ import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.InetAddress; import java.net.InetAddress;
@@ -45,13 +50,6 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.Protocol;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
/** /**
* Network Service Discovery Service handles remote service discovery operation requests by * Network Service Discovery Service handles remote service discovery operation requests by
* implementing the INsdManager interface. * implementing the INsdManager interface.
@@ -565,8 +563,7 @@ public class NsdService extends INsdManager.Stub {
} }
public void setEnabled(boolean isEnabled) { public void setEnabled(boolean isEnabled) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL, NetworkStack.checkNetworkStackPermission(mContext);
"NsdService");
mNsdSettings.putEnabledStatus(isEnabled); mNsdSettings.putEnabledStatus(isEnabled);
notifyEnabled(isEnabled); notifyEnabled(isEnabled);
} }

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.net.ConnectivityMetricsEvent; import android.net.ConnectivityMetricsEvent;
import android.net.IIpConnectivityMetrics; import android.net.IIpConnectivityMetrics;
import android.net.INetdEventCallback; import android.net.INetdEventCallback;
import android.net.NetworkStack;
import android.net.metrics.ApfProgramEvent; import android.net.metrics.ApfProgramEvent;
import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpConnectivityLog;
import android.os.Binder; import android.os.Binder;
@@ -276,7 +277,7 @@ final public class IpConnectivityMetrics extends SystemService {
@Override @Override
public int logEvent(ConnectivityMetricsEvent event) { public int logEvent(ConnectivityMetricsEvent event) {
enforceConnectivityInternalPermission(); NetworkStack.checkNetworkStackPermission(getContext());
return append(event); return append(event);
} }
@@ -299,10 +300,6 @@ final public class IpConnectivityMetrics extends SystemService {
} }
} }
private void enforceConnectivityInternalPermission() {
enforcePermission(android.Manifest.permission.CONNECTIVITY_INTERNAL);
}
private void enforceDumpPermission() { private void enforceDumpPermission() {
enforcePermission(android.Manifest.permission.DUMP); enforcePermission(android.Manifest.permission.DUMP);
} }

View File

@@ -17,7 +17,6 @@
package com.android.server.connectivity; package com.android.server.connectivity;
import static android.Manifest.permission.CHANGE_NETWORK_STATE; import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS; import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
import static android.Manifest.permission.INTERNET; import static android.Manifest.permission.INTERNET;
import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.NETWORK_STACK;
@@ -25,6 +24,7 @@ import static android.Manifest.permission.UPDATE_DEVICE_STATS;
import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.content.pm.PackageManager.GET_PERMISSIONS; import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
import static android.os.Process.INVALID_UID; import static android.os.Process.INVALID_UID;
import static android.os.Process.SYSTEM_UID; import static android.os.Process.SYSTEM_UID;
@@ -259,7 +259,8 @@ public class PermissionMonitor {
return true; return true;
} }
} }
return hasPermission(app, CONNECTIVITY_INTERNAL)
return hasPermission(app, PERMISSION_MAINLINE_NETWORK_STACK)
|| hasPermission(app, NETWORK_STACK) || hasPermission(app, NETWORK_STACK)
|| hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS); || hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS);
} }

View File

@@ -16,7 +16,7 @@
package com.android.server.net; package com.android.server.net;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.NETWORK_STACK;
import static android.provider.Settings.ACTION_VPN_SETTINGS; import static android.provider.Settings.ACTION_VPN_SETTINGS;
import android.annotation.NonNull; import android.annotation.NonNull;
@@ -202,8 +202,7 @@ public class LockdownVpnTracker {
mVpn.setLockdown(true); mVpn.setLockdown(true);
final IntentFilter resetFilter = new IntentFilter(ACTION_LOCKDOWN_RESET); final IntentFilter resetFilter = new IntentFilter(ACTION_LOCKDOWN_RESET);
mContext.registerReceiver(mResetReceiver, resetFilter, CONNECTIVITY_INTERNAL, mHandler); mContext.registerReceiver(mResetReceiver, resetFilter, NETWORK_STACK, mHandler);
handleStateChangedLocked(); handleStateChangedLocked();
} }

View File

@@ -20,6 +20,9 @@ import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.MANAGE_NETWORK_POLICY; import static android.Manifest.permission.MANAGE_NETWORK_POLICY;
import static android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS; import static android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS;
import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.Manifest.permission.NETWORK_STACK;
import static android.Manifest.permission.OBSERVE_NETWORK_POLICY;
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY; import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.Manifest.permission.READ_PHONE_STATE; import static android.Manifest.permission.READ_PHONE_STATE;
import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
@@ -33,6 +36,7 @@ import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED; import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED; import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
@@ -153,6 +157,7 @@ import android.net.NetworkPolicyManager;
import android.net.NetworkQuotaInfo; import android.net.NetworkQuotaInfo;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.NetworkSpecifier; import android.net.NetworkSpecifier;
import android.net.NetworkStack;
import android.net.NetworkState; import android.net.NetworkState;
import android.net.NetworkStats; import android.net.NetworkStats;
import android.net.NetworkTemplate; import android.net.NetworkTemplate;
@@ -825,7 +830,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
// watch for network interfaces to be claimed // watch for network interfaces to be claimed
final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION); final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION);
mContext.registerReceiver(mConnReceiver, connFilter, CONNECTIVITY_INTERNAL, mHandler); mContext.registerReceiver(mConnReceiver, connFilter, NETWORK_STACK, mHandler);
// listen for package changes to update policy // listen for package changes to update policy
final IntentFilter packageFilter = new IntentFilter(); final IntentFilter packageFilter = new IntentFilter();
@@ -1128,7 +1133,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
@Override @Override
public void limitReached(String limitName, String iface) { public void limitReached(String limitName, String iface) {
// only someone like NMS should be calling us // only someone like NMS should be calling us
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
if (!LIMIT_GLOBAL_ALERT.equals(limitName)) { if (!LIMIT_GLOBAL_ALERT.equals(limitName)) {
mHandler.obtainMessage(MSG_LIMIT_REACHED, iface).sendToTarget(); mHandler.obtainMessage(MSG_LIMIT_REACHED, iface).sendToTarget();
@@ -1483,7 +1488,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
private BroadcastReceiver mConnReceiver = new BroadcastReceiver() { private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
// on background handler thread, and verified CONNECTIVITY_INTERNAL // on background handler thread, and verified NETWORK_STACK
// permission above. // permission above.
updateNetworksInternal(); updateNetworksInternal();
} }
@@ -2721,17 +2726,35 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return changed; return changed;
} }
private boolean checkAnyPermissionOf(String... permissions) {
for (String permission : permissions) {
if (mContext.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED) {
return true;
}
}
return false;
}
private void enforceAnyPermissionOf(String... permissions) {
if (!checkAnyPermissionOf(permissions)) {
throw new SecurityException("Requires one of the following permissions: "
+ String.join(", ", permissions) + ".");
}
}
@Override @Override
public void registerListener(INetworkPolicyListener listener) { public void registerListener(INetworkPolicyListener listener) {
// TODO: create permission for observing network policy // TODO: Remove CONNECTIVITY_INTERNAL and the *AnyPermissionOf methods above after all apps
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // have declared OBSERVE_NETWORK_POLICY.
enforceAnyPermissionOf(CONNECTIVITY_INTERNAL, OBSERVE_NETWORK_POLICY);
mListeners.register(listener); mListeners.register(listener);
} }
@Override @Override
public void unregisterListener(INetworkPolicyListener listener) { public void unregisterListener(INetworkPolicyListener listener) {
// TODO: create permission for observing network policy // TODO: Remove CONNECTIVITY_INTERNAL and the *AnyPermissionOf methods above after all apps
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // have declared OBSERVE_NETWORK_POLICY.
enforceAnyPermissionOf(CONNECTIVITY_INTERNAL, OBSERVE_NETWORK_POLICY);
mListeners.unregister(listener); mListeners.unregister(listener);
} }
@@ -4965,7 +4988,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
@Override @Override
public void factoryReset(String subscriber) { public void factoryReset(String subscriber) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); mContext.enforceCallingOrSelfPermission(NETWORK_SETTINGS, TAG);
if (mUserManager.hasUserRestriction(UserManager.DISALLOW_NETWORK_RESET)) { if (mUserManager.hasUserRestriction(UserManager.DISALLOW_NETWORK_RESET)) {
return; return;
@@ -4998,7 +5021,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
public boolean isUidNetworkingBlocked(int uid, boolean isNetworkMetered) { public boolean isUidNetworkingBlocked(int uid, boolean isNetworkMetered) {
final long startTime = mStatLogger.getTime(); final long startTime = mStatLogger.getTime();
mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); mContext.enforceCallingOrSelfPermission(OBSERVE_NETWORK_POLICY, TAG);
final int uidRules; final int uidRules;
final boolean isBackgroundRestricted; final boolean isBackgroundRestricted;
synchronized (mUidRulesFirstLock) { synchronized (mUidRulesFirstLock) {

View File

@@ -17,7 +17,6 @@
package com.android.server.net; package com.android.server.net;
import static android.Manifest.permission.ACCESS_NETWORK_STATE; import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_INTERNAL;
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY; import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
import static android.content.Intent.ACTION_SHUTDOWN; import static android.content.Intent.ACTION_SHUTDOWN;
import static android.content.Intent.ACTION_UID_REMOVED; import static android.content.Intent.ACTION_UID_REMOVED;
@@ -91,6 +90,7 @@ import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkIdentity; import android.net.NetworkIdentity;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.NetworkStack;
import android.net.NetworkState; import android.net.NetworkState;
import android.net.NetworkStats; import android.net.NetworkStats;
import android.net.NetworkStats.NonMonotonicObserver; import android.net.NetworkStats.NonMonotonicObserver;
@@ -1020,8 +1020,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private BroadcastReceiver mTetherReceiver = new BroadcastReceiver() { private BroadcastReceiver mTetherReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
// on background handler thread, and verified CONNECTIVITY_INTERNAL
// permission above.
performPoll(FLAG_PERSIST_NETWORK); performPoll(FLAG_PERSIST_NETWORK);
} }
}; };
@@ -1095,7 +1093,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override @Override
public void limitReached(String limitName, String iface) { public void limitReached(String limitName, String iface) {
// only someone like NMS should be calling us // only someone like NMS should be calling us
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); NetworkStack.checkNetworkStackPermission(mContext);
if (LIMIT_GLOBAL_ALERT.equals(limitName)) { if (LIMIT_GLOBAL_ALERT.equals(limitName)) {
// kick off background poll to collect network stats unless there is already // kick off background poll to collect network stats unless there is already

View File

@@ -34,7 +34,7 @@
<uses-permission android:name="android.permission.REORDER_TASKS" /> <uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.OBSERVE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

View File

@@ -18,8 +18,7 @@
package="com.android.servicestests.apps.conntestapp"> package="com.android.servicestests.apps.conntestapp">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.OBSERVE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
<application> <application>
<activity android:name=".ConnTestActivity" <activity android:name=".ConnTestActivity"

View File

@@ -32,7 +32,7 @@
<uses-permission android:name="android.permission.GET_DETAILED_TASKS" /> <uses-permission android:name="android.permission.GET_DETAILED_TASKS" />
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
@@ -45,6 +45,8 @@
<uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" /> <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.NETWORK_STACK" /> <uses-permission android:name="android.permission.NETWORK_STACK" />
<uses-permission android:name="android.permission.OBSERVE_NETWORK_POLICY" />
<uses-permission android:name="android.permission.NETWORK_FACTORY" />
<application> <application>
<uses-library android:name="android.test.runner" /> <uses-library android:name="android.test.runner" />

View File

@@ -265,6 +265,8 @@ public class PermissionMonitorTest {
assertFalse(mPermissionMonitor.hasNetworkPermission(app)); assertFalse(mPermissionMonitor.hasNetworkPermission(app));
app = systemPackageInfoWithPermissions(CONNECTIVITY_USE_RESTRICTED_NETWORKS); app = systemPackageInfoWithPermissions(CONNECTIVITY_USE_RESTRICTED_NETWORKS);
assertFalse(mPermissionMonitor.hasNetworkPermission(app)); assertFalse(mPermissionMonitor.hasNetworkPermission(app));
app = systemPackageInfoWithPermissions(CONNECTIVITY_INTERNAL);
assertFalse(mPermissionMonitor.hasNetworkPermission(app));
} }
@Test @Test
@@ -274,7 +276,7 @@ public class PermissionMonitorTest {
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CHANGE_NETWORK_STATE)); PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CHANGE_NETWORK_STATE));
assertTrue(hasRestrictedNetworkPermission( assertTrue(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, NETWORK_STACK)); PARTITION_SYSTEM, VERSION_P, MOCK_UID1, NETWORK_STACK));
assertTrue(hasRestrictedNetworkPermission( assertFalse(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CONNECTIVITY_INTERNAL)); PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CONNECTIVITY_INTERNAL));
assertTrue(hasRestrictedNetworkPermission( assertTrue(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CONNECTIVITY_USE_RESTRICTED_NETWORKS)); PARTITION_SYSTEM, VERSION_P, MOCK_UID1, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
@@ -283,7 +285,7 @@ public class PermissionMonitorTest {
assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID1)); assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_Q, MOCK_UID1));
assertFalse(hasRestrictedNetworkPermission( assertFalse(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_Q, MOCK_UID1, CHANGE_WIFI_STATE)); PARTITION_SYSTEM, VERSION_Q, MOCK_UID1, CONNECTIVITY_INTERNAL));
} }
@Test @Test
@@ -291,14 +293,14 @@ public class PermissionMonitorTest {
doReturn(VERSION_P).when(mPermissionMonitor).getDeviceFirstSdkInt(); doReturn(VERSION_P).when(mPermissionMonitor).getDeviceFirstSdkInt();
assertTrue(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID)); assertTrue(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_P, SYSTEM_UID));
assertTrue(hasRestrictedNetworkPermission( assertTrue(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CHANGE_WIFI_STATE)); PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CONNECTIVITY_INTERNAL));
assertTrue(hasRestrictedNetworkPermission( assertTrue(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CONNECTIVITY_USE_RESTRICTED_NETWORKS)); PARTITION_SYSTEM, VERSION_P, SYSTEM_UID, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
doReturn(VERSION_Q).when(mPermissionMonitor).getDeviceFirstSdkInt(); doReturn(VERSION_Q).when(mPermissionMonitor).getDeviceFirstSdkInt();
assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID)); assertFalse(hasRestrictedNetworkPermission(PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID));
assertFalse(hasRestrictedNetworkPermission( assertFalse(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CHANGE_WIFI_STATE)); PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CONNECTIVITY_INTERNAL));
assertTrue(hasRestrictedNetworkPermission( assertTrue(hasRestrictedNetworkPermission(
PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CONNECTIVITY_USE_RESTRICTED_NETWORKS)); PARTITION_SYSTEM, VERSION_Q, SYSTEM_UID, CONNECTIVITY_USE_RESTRICTED_NETWORKS));
} }
@@ -319,7 +321,7 @@ public class PermissionMonitorTest {
assertFalse(hasRestrictedNetworkPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID1)); assertFalse(hasRestrictedNetworkPermission(PARTITION_VENDOR, VERSION_Q, MOCK_UID1));
assertFalse(hasRestrictedNetworkPermission( assertFalse(hasRestrictedNetworkPermission(
PARTITION_VENDOR, VERSION_Q, MOCK_UID1, CHANGE_WIFI_STATE)); PARTITION_VENDOR, VERSION_Q, MOCK_UID1, CONNECTIVITY_INTERNAL));
assertFalse(hasRestrictedNetworkPermission( assertFalse(hasRestrictedNetworkPermission(
PARTITION_VENDOR, VERSION_Q, MOCK_UID1, CHANGE_NETWORK_STATE)); PARTITION_VENDOR, VERSION_Q, MOCK_UID1, CHANGE_NETWORK_STATE));
} }
@@ -337,7 +339,7 @@ public class PermissionMonitorTest {
public void testHasUseBackgroundNetworksPermission() throws Exception { public void testHasUseBackgroundNetworksPermission() throws Exception {
assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(SYSTEM_UID)); assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(SYSTEM_UID));
assertBackgroundPermission(false, SYSTEM_PACKAGE1, SYSTEM_UID); assertBackgroundPermission(false, SYSTEM_PACKAGE1, SYSTEM_UID);
assertBackgroundPermission(false, SYSTEM_PACKAGE1, SYSTEM_UID, CHANGE_WIFI_STATE); assertBackgroundPermission(false, SYSTEM_PACKAGE1, SYSTEM_UID, CONNECTIVITY_INTERNAL);
assertBackgroundPermission(true, SYSTEM_PACKAGE1, SYSTEM_UID, CHANGE_NETWORK_STATE); assertBackgroundPermission(true, SYSTEM_PACKAGE1, SYSTEM_UID, CHANGE_NETWORK_STATE);
assertBackgroundPermission(true, SYSTEM_PACKAGE1, SYSTEM_UID, NETWORK_STACK); assertBackgroundPermission(true, SYSTEM_PACKAGE1, SYSTEM_UID, NETWORK_STACK);
@@ -348,8 +350,9 @@ public class PermissionMonitorTest {
assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID2)); assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID2));
assertBackgroundPermission(false, MOCK_PACKAGE2, MOCK_UID2); assertBackgroundPermission(false, MOCK_PACKAGE2, MOCK_UID2);
assertBackgroundPermission(true, MOCK_PACKAGE2, MOCK_UID2, assertBackgroundPermission(false, MOCK_PACKAGE2, MOCK_UID2,
CONNECTIVITY_INTERNAL); CONNECTIVITY_INTERNAL);
assertBackgroundPermission(true, MOCK_PACKAGE2, MOCK_UID2, NETWORK_STACK);
} }
private class NetdMonitor { private class NetdMonitor {