Add a cts test for PermissionMonitor security problem
Add a cts test to check whether app can have netd sytem
permission even the app didn't grant the
CONNECTIVITY_USE_RESTRICTED_NETWORKS permission.
Bug: 144679405
Test: atest android.net.cts.ConnectivityManagerTest
Change-Id: I2c717a11bda43db166a55d343eb752ab45947fe8
Merged-In: I2c717a11bda43db166a55d343eb752ab45947fe8
(cherry picked from commit 1bc6b39789, ag/10285567)
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
|
||||||
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
|
||||||
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
|
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|||||||
@@ -16,13 +16,17 @@
|
|||||||
|
|
||||||
package android.net.cts;
|
package android.net.cts;
|
||||||
|
|
||||||
|
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
|
||||||
import static android.content.pm.PackageManager.FEATURE_ETHERNET;
|
import static android.content.pm.PackageManager.FEATURE_ETHERNET;
|
||||||
import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
|
import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
|
||||||
import static android.content.pm.PackageManager.FEATURE_WIFI;
|
|
||||||
import static android.content.pm.PackageManager.FEATURE_USB_HOST;
|
import static android.content.pm.PackageManager.FEATURE_USB_HOST;
|
||||||
|
import static android.content.pm.PackageManager.FEATURE_WIFI;
|
||||||
|
import static android.content.pm.PackageManager.GET_PERMISSIONS;
|
||||||
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
|
||||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||||
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||||
import static android.net.cts.util.CtsNetUtils.ConnectivityActionReceiver;
|
import static android.net.cts.util.CtsNetUtils.ConnectivityActionReceiver;
|
||||||
import static android.net.cts.util.CtsNetUtils.HTTP_PORT;
|
import static android.net.cts.util.CtsNetUtils.HTTP_PORT;
|
||||||
@@ -45,6 +49,7 @@ import android.content.ContentResolver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
@@ -59,10 +64,12 @@ import android.net.NetworkInfo;
|
|||||||
import android.net.NetworkInfo.DetailedState;
|
import android.net.NetworkInfo.DetailedState;
|
||||||
import android.net.NetworkInfo.State;
|
import android.net.NetworkInfo.State;
|
||||||
import android.net.NetworkRequest;
|
import android.net.NetworkRequest;
|
||||||
|
import android.net.NetworkUtils;
|
||||||
import android.net.SocketKeepalive;
|
import android.net.SocketKeepalive;
|
||||||
import android.net.cts.util.CtsNetUtils;
|
import android.net.cts.util.CtsNetUtils;
|
||||||
import android.net.util.KeepaliveUtils;
|
import android.net.util.KeepaliveUtils;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.os.Binder;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.MessageQueue;
|
import android.os.MessageQueue;
|
||||||
@@ -78,6 +85,8 @@ import android.util.Pair;
|
|||||||
|
|
||||||
import androidx.test.InstrumentationRegistry;
|
import androidx.test.InstrumentationRegistry;
|
||||||
|
|
||||||
|
import com.android.internal.util.ArrayUtils;
|
||||||
|
|
||||||
import libcore.io.Streams;
|
import libcore.io.Streams;
|
||||||
|
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
@@ -1280,4 +1289,38 @@ public class ConnectivityManagerTest extends AndroidTestCase {
|
|||||||
assertTrue("" + greater + " expected to be greater than or equal to " + lesser,
|
assertTrue("" + greater + " expected to be greater than or equal to " + lesser,
|
||||||
greater >= lesser);
|
greater >= lesser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies that apps are not allowed to access restricted networks even if they declare the
|
||||||
|
* CONNECTIVITY_USE_RESTRICTED_NETWORKS permission in their manifests.
|
||||||
|
* See. b/144679405.
|
||||||
|
*/
|
||||||
|
@AppModeFull(reason = "Cannot get WifiManager in instant app mode")
|
||||||
|
public void testRestrictedNetworkPermission() throws Exception {
|
||||||
|
// Ensure that CONNECTIVITY_USE_RESTRICTED_NETWORKS isn't granted to this package.
|
||||||
|
final PackageInfo app = mPackageManager.getPackageInfo(mContext.getPackageName(),
|
||||||
|
GET_PERMISSIONS);
|
||||||
|
final int index = ArrayUtils.indexOf(
|
||||||
|
app.requestedPermissions, CONNECTIVITY_USE_RESTRICTED_NETWORKS);
|
||||||
|
assertTrue(index >= 0);
|
||||||
|
assertTrue(app.requestedPermissionsFlags[index] != PERMISSION_GRANTED);
|
||||||
|
|
||||||
|
// Ensure that NetworkUtils.queryUserAccess always returns false since this package should
|
||||||
|
// not have netd system permission to call this function.
|
||||||
|
final Network wifiNetwork = ensureWifiConnected();
|
||||||
|
assertFalse(NetworkUtils.queryUserAccess(Binder.getCallingUid(), wifiNetwork.netId));
|
||||||
|
|
||||||
|
// Ensure that this package cannot bind to any restricted network that's currently
|
||||||
|
// connected.
|
||||||
|
Network[] networks = mCm.getAllNetworks();
|
||||||
|
for (Network network : networks) {
|
||||||
|
NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
|
||||||
|
if (nc != null && !nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) {
|
||||||
|
try {
|
||||||
|
network.bindSocket(new Socket());
|
||||||
|
fail("Bind to restricted network " + network + " unexpectedly succeeded");
|
||||||
|
} catch (IOException expected) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user