Merge "[AWARE] Add UID checking to WifiAwareNetworkSpecifier" am: 7b6ba2b3ea am: 3c6305cc55

am: 887fd90742

Change-Id: I8480ac43d89dc85b541e6255c3cdc597393896cf
This commit is contained in:
Etan Cohen
2017-04-25 13:40:42 +00:00
committed by android-build-merger
2 changed files with 51 additions and 14 deletions

View File

@@ -42,7 +42,6 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.ConnectivityManager.PacketKeepalive; import android.net.ConnectivityManager.PacketKeepalive;
@@ -63,6 +62,7 @@ import android.net.NetworkInfo.DetailedState;
import android.net.NetworkMisc; import android.net.NetworkMisc;
import android.net.NetworkQuotaInfo; import android.net.NetworkQuotaInfo;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.NetworkState; import android.net.NetworkState;
import android.net.NetworkUtils; import android.net.NetworkUtils;
import android.net.Proxy; import android.net.Proxy;
@@ -102,7 +102,6 @@ import android.text.TextUtils;
import android.util.LocalLog; import android.util.LocalLog;
import android.util.LocalLog.ReadOnlyLocalLog; import android.util.LocalLog.ReadOnlyLocalLog;
import android.util.Log; import android.util.Log;
import android.util.Pair;
import android.util.Slog; import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
@@ -4007,6 +4006,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
0, 0, thresholds); 0, 0, thresholds);
} }
private void ensureValidNetworkSpecifier(NetworkCapabilities nc) {
if (nc == null) {
return;
}
NetworkSpecifier ns = nc.getNetworkSpecifier();
if (ns == null) {
return;
}
MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(ns);
ns.assertValidFromUid(Binder.getCallingUid());
}
@Override @Override
public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities, public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities,
Messenger messenger, int timeoutMs, IBinder binder, int legacyType) { Messenger messenger, int timeoutMs, IBinder binder, int legacyType) {
@@ -4032,9 +4043,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (timeoutMs < 0) { if (timeoutMs < 0) {
throw new IllegalArgumentException("Bad timeout specified"); throw new IllegalArgumentException("Bad timeout specified");
} }
ensureValidNetworkSpecifier(networkCapabilities);
MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(
networkCapabilities.getNetworkSpecifier());
NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType, NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
nextNetworkRequestId(), type); nextNetworkRequestId(), type);
@@ -4102,9 +4111,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
enforceNetworkRequestPermissions(networkCapabilities); enforceNetworkRequestPermissions(networkCapabilities);
enforceMeteredApnPolicy(networkCapabilities); enforceMeteredApnPolicy(networkCapabilities);
ensureRequestableCapabilities(networkCapabilities); ensureRequestableCapabilities(networkCapabilities);
ensureValidNetworkSpecifier(networkCapabilities);
MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(
networkCapabilities.getNetworkSpecifier());
NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE,
nextNetworkRequestId(), NetworkRequest.Type.REQUEST); nextNetworkRequestId(), NetworkRequest.Type.REQUEST);
@@ -4166,9 +4173,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// can't request networks. // can't request networks.
nc.addCapability(NET_CAPABILITY_FOREGROUND); nc.addCapability(NET_CAPABILITY_FOREGROUND);
} }
ensureValidNetworkSpecifier(networkCapabilities);
MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(
networkCapabilities.getNetworkSpecifier());
NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(), NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(),
NetworkRequest.Type.LISTEN); NetworkRequest.Type.LISTEN);
@@ -4186,9 +4191,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (!hasWifiNetworkListenPermission(networkCapabilities)) { if (!hasWifiNetworkListenPermission(networkCapabilities)) {
enforceAccessPermission(); enforceAccessPermission();
} }
ensureValidNetworkSpecifier(networkCapabilities);
MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(
networkCapabilities.getNetworkSpecifier());
NetworkRequest networkRequest = new NetworkRequest( NetworkRequest networkRequest = new NetworkRequest(
new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId(), new NetworkCapabilities(networkCapabilities), TYPE_NONE, nextNetworkRequestId(),

View File

@@ -1996,6 +1996,40 @@ public class ConnectivityServiceTest extends AndroidTestCase {
} }
} }
@SmallTest
public void testNetworkSpecifierUidSpoofSecurityException() {
class UidAwareNetworkSpecifier extends NetworkSpecifier implements Parcelable {
@Override
public boolean satisfiedBy(NetworkSpecifier other) {
return true;
}
@Override
public void assertValidFromUid(int requestorUid) {
throw new SecurityException("failure");
}
@Override
public int describeContents() { return 0; }
@Override
public void writeToParcel(Parcel dest, int flags) {}
}
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
mWiFiNetworkAgent.connect(false);
UidAwareNetworkSpecifier networkSpecifier = new UidAwareNetworkSpecifier();
NetworkRequest networkRequest = newWifiRequestBuilder().setNetworkSpecifier(
networkSpecifier).build();
TestNetworkCallback networkCallback = new TestNetworkCallback();
try {
mCm.requestNetwork(networkRequest, networkCallback);
fail("Network request with spoofed UID did not throw a SecurityException");
} catch (SecurityException e) {
// expected
}
}
@SmallTest @SmallTest
public void testRegisterDefaultNetworkCallback() throws Exception { public void testRegisterDefaultNetworkCallback() throws Exception {
final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback(); final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback();