[AWARE] Add UID checking to WifiAwareNetworkSpecifier
Wifi Aware networks are per app - i.e. a requestor gets a dedicated network. Change verifies that the only the original requestor matches the created network (using UID). Bug: 36053921 Test: Integration (sl4a) tests Change-Id: I4ff3994731dd7ccb88e2bea333d1e6905b136f02
This commit is contained in:
@@ -49,7 +49,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;
|
||||||
@@ -70,6 +69,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;
|
||||||
@@ -110,7 +110,6 @@ import android.util.ArraySet;
|
|||||||
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;
|
||||||
@@ -4124,6 +4123,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) {
|
||||||
@@ -4149,9 +4160,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);
|
||||||
@@ -4223,9 +4232,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);
|
||||||
@@ -4287,9 +4294,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);
|
||||||
@@ -4307,9 +4312,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(),
|
||||||
|
|||||||
@@ -1992,6 +1992,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();
|
||||||
|
|||||||
Reference in New Issue
Block a user