Merge "Revert "NetworkRequest: Embed requestor uid & packageName""

This commit is contained in:
Roshan Pius
2020-02-12 23:36:13 +00:00
committed by Gerrit Code Review
8 changed files with 65 additions and 256 deletions

View File

@@ -3746,7 +3746,6 @@ public class ConnectivityManager {
checkCallbackNotNull(callback); checkCallbackNotNull(callback);
Preconditions.checkArgument(action == REQUEST || need != null, "null NetworkCapabilities"); Preconditions.checkArgument(action == REQUEST || need != null, "null NetworkCapabilities");
final NetworkRequest request; final NetworkRequest request;
final String callingPackageName = mContext.getOpPackageName();
try { try {
synchronized(sCallbacks) { synchronized(sCallbacks) {
if (callback.networkRequest != null if (callback.networkRequest != null
@@ -3758,11 +3757,10 @@ public class ConnectivityManager {
Messenger messenger = new Messenger(handler); Messenger messenger = new Messenger(handler);
Binder binder = new Binder(); Binder binder = new Binder();
if (action == LISTEN) { if (action == LISTEN) {
request = mService.listenForNetwork( request = mService.listenForNetwork(need, messenger, binder);
need, messenger, binder, callingPackageName);
} else { } else {
request = mService.requestNetwork( request = mService.requestNetwork(
need, messenger, timeoutMs, binder, legacyType, callingPackageName); need, messenger, timeoutMs, binder, legacyType);
} }
if (request != null) { if (request != null) {
sCallbacks.put(request, callback); sCallbacks.put(request, callback);
@@ -4035,10 +4033,8 @@ public class ConnectivityManager {
@NonNull PendingIntent operation) { @NonNull PendingIntent operation) {
printStackTrace(); printStackTrace();
checkPendingIntentNotNull(operation); checkPendingIntentNotNull(operation);
final String callingPackageName = mContext.getOpPackageName();
try { try {
mService.pendingRequestForNetwork( mService.pendingRequestForNetwork(request.networkCapabilities, operation);
request.networkCapabilities, operation, callingPackageName);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) { } catch (ServiceSpecificException e) {
@@ -4150,10 +4146,8 @@ public class ConnectivityManager {
@NonNull PendingIntent operation) { @NonNull PendingIntent operation) {
printStackTrace(); printStackTrace();
checkPendingIntentNotNull(operation); checkPendingIntentNotNull(operation);
final String callingPackageName = mContext.getOpPackageName();
try { try {
mService.pendingListenForNetwork( mService.pendingListenForNetwork(request.networkCapabilities, operation);
request.networkCapabilities, operation, callingPackageName);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) { } catch (ServiceSpecificException e) {

View File

@@ -166,19 +166,18 @@ interface IConnectivityManager
in int factorySerialNumber); in int factorySerialNumber);
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities, NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
in Messenger messenger, int timeoutSec, in IBinder binder, int legacy, in Messenger messenger, int timeoutSec, in IBinder binder, int legacy);
String callingPackageName);
NetworkRequest pendingRequestForNetwork(in NetworkCapabilities networkCapabilities, NetworkRequest pendingRequestForNetwork(in NetworkCapabilities networkCapabilities,
in PendingIntent operation, String callingPackageName); in PendingIntent operation);
void releasePendingNetworkRequest(in PendingIntent operation); void releasePendingNetworkRequest(in PendingIntent operation);
NetworkRequest listenForNetwork(in NetworkCapabilities networkCapabilities, NetworkRequest listenForNetwork(in NetworkCapabilities networkCapabilities,
in Messenger messenger, in IBinder binder, String callingPackageName); in Messenger messenger, in IBinder binder);
void pendingListenForNetwork(in NetworkCapabilities networkCapabilities, void pendingListenForNetwork(in NetworkCapabilities networkCapabilities,
in PendingIntent operation, String callingPackageName); in PendingIntent operation);
void releaseNetworkRequest(in NetworkRequest networkRequest); void releaseNetworkRequest(in NetworkRequest networkRequest);

View File

@@ -27,7 +27,6 @@ import android.os.Build;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.os.Process; import android.os.Process;
import android.text.TextUtils;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoOutputStream;
@@ -64,16 +63,6 @@ public final class NetworkCapabilities implements Parcelable {
// Set to true when private DNS is broken. // Set to true when private DNS is broken.
private boolean mPrivateDnsBroken; private boolean mPrivateDnsBroken;
/**
* Uid of the app making the request.
*/
private int mRequestorUid;
/**
* Package name of the app making the request.
*/
private String mRequestorPackageName;
public NetworkCapabilities() { public NetworkCapabilities() {
clearAll(); clearAll();
mNetworkCapabilities = DEFAULT_CAPABILITIES; mNetworkCapabilities = DEFAULT_CAPABILITIES;
@@ -100,8 +89,6 @@ public final class NetworkCapabilities implements Parcelable {
mOwnerUid = Process.INVALID_UID; mOwnerUid = Process.INVALID_UID;
mSSID = null; mSSID = null;
mPrivateDnsBroken = false; mPrivateDnsBroken = false;
mRequestorUid = Process.INVALID_UID;
mRequestorPackageName = null;
} }
/** /**
@@ -122,8 +109,6 @@ public final class NetworkCapabilities implements Parcelable {
mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities; mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities;
mSSID = nc.mSSID; mSSID = nc.mSSID;
mPrivateDnsBroken = nc.mPrivateDnsBroken; mPrivateDnsBroken = nc.mPrivateDnsBroken;
mRequestorUid = nc.mRequestorUid;
mRequestorPackageName = nc.mRequestorPackageName;
} }
/** /**
@@ -825,7 +810,7 @@ public final class NetworkCapabilities implements Parcelable {
} }
/** /**
* UID of the app that owns this network, or Process#INVALID_UID if none/unknown. * UID of the app that owns this network, or INVALID_UID if none/unknown.
* *
* <p>This field keeps track of the UID of the app that created this network and is in charge of * <p>This field keeps track of the UID of the app that created this network and is in charge of
* its lifecycle. This could be the UID of apps such as the Wifi network suggestor, the running * its lifecycle. This could be the UID of apps such as the Wifi network suggestor, the running
@@ -836,9 +821,8 @@ public final class NetworkCapabilities implements Parcelable {
/** /**
* Set the UID of the owner app. * Set the UID of the owner app.
*/ */
public @NonNull NetworkCapabilities setOwnerUid(final int uid) { public void setOwnerUid(final int uid) {
mOwnerUid = uid; mOwnerUid = uid;
return this;
} }
/** /**
@@ -881,11 +865,9 @@ public final class NetworkCapabilities implements Parcelable {
* @hide * @hide
*/ */
@SystemApi @SystemApi
public @NonNull NetworkCapabilities setAdministratorUids( public void setAdministratorUids(@NonNull final List<Integer> administratorUids) {
@NonNull final List<Integer> administratorUids) {
mAdministratorUids.clear(); mAdministratorUids.clear();
mAdministratorUids.addAll(administratorUids); mAdministratorUids.addAll(administratorUids);
return this;
} }
/** /**
@@ -1403,7 +1385,6 @@ public final class NetworkCapabilities implements Parcelable {
combineSignalStrength(nc); combineSignalStrength(nc);
combineUids(nc); combineUids(nc);
combineSSIDs(nc); combineSSIDs(nc);
combineRequestor(nc);
} }
/** /**
@@ -1423,8 +1404,7 @@ public final class NetworkCapabilities implements Parcelable {
&& satisfiedBySpecifier(nc) && satisfiedBySpecifier(nc)
&& (onlyImmutable || satisfiedBySignalStrength(nc)) && (onlyImmutable || satisfiedBySignalStrength(nc))
&& (onlyImmutable || satisfiedByUids(nc)) && (onlyImmutable || satisfiedByUids(nc))
&& (onlyImmutable || satisfiedBySSID(nc))) && (onlyImmutable || satisfiedBySSID(nc)));
&& (onlyImmutable || satisfiedByRequestor(nc));
} }
/** /**
@@ -1508,7 +1488,7 @@ public final class NetworkCapabilities implements Parcelable {
public boolean equals(@Nullable Object obj) { public boolean equals(@Nullable Object obj) {
if (obj == null || (obj instanceof NetworkCapabilities == false)) return false; if (obj == null || (obj instanceof NetworkCapabilities == false)) return false;
NetworkCapabilities that = (NetworkCapabilities) obj; NetworkCapabilities that = (NetworkCapabilities) obj;
return equalsNetCapabilities(that) return (equalsNetCapabilities(that)
&& equalsTransportTypes(that) && equalsTransportTypes(that)
&& equalsLinkBandwidths(that) && equalsLinkBandwidths(that)
&& equalsSignalStrength(that) && equalsSignalStrength(that)
@@ -1516,8 +1496,7 @@ public final class NetworkCapabilities implements Parcelable {
&& equalsTransportInfo(that) && equalsTransportInfo(that)
&& equalsUids(that) && equalsUids(that)
&& equalsSSID(that) && equalsSSID(that)
&& equalsPrivateDnsBroken(that) && equalsPrivateDnsBroken(that));
&& equalsRequestor(that);
} }
@Override @Override
@@ -1535,9 +1514,7 @@ public final class NetworkCapabilities implements Parcelable {
+ Objects.hashCode(mUids) * 31 + Objects.hashCode(mUids) * 31
+ Objects.hashCode(mSSID) * 37 + Objects.hashCode(mSSID) * 37
+ Objects.hashCode(mTransportInfo) * 41 + Objects.hashCode(mTransportInfo) * 41
+ Objects.hashCode(mPrivateDnsBroken) * 43 + Objects.hashCode(mPrivateDnsBroken) * 43;
+ Objects.hashCode(mRequestorUid) * 47
+ Objects.hashCode(mRequestorPackageName) * 53;
} }
@Override @Override
@@ -1560,8 +1537,6 @@ public final class NetworkCapabilities implements Parcelable {
dest.writeBoolean(mPrivateDnsBroken); dest.writeBoolean(mPrivateDnsBroken);
dest.writeList(mAdministratorUids); dest.writeList(mAdministratorUids);
dest.writeInt(mOwnerUid); dest.writeInt(mOwnerUid);
dest.writeInt(mRequestorUid);
dest.writeString(mRequestorPackageName);
} }
public static final @android.annotation.NonNull Creator<NetworkCapabilities> CREATOR = public static final @android.annotation.NonNull Creator<NetworkCapabilities> CREATOR =
@@ -1584,8 +1559,6 @@ public final class NetworkCapabilities implements Parcelable {
netCap.mPrivateDnsBroken = in.readBoolean(); netCap.mPrivateDnsBroken = in.readBoolean();
netCap.setAdministratorUids(in.readArrayList(null)); netCap.setAdministratorUids(in.readArrayList(null));
netCap.mOwnerUid = in.readInt(); netCap.mOwnerUid = in.readInt();
netCap.mRequestorUid = in.readInt();
netCap.mRequestorPackageName = in.readString();
return netCap; return netCap;
} }
@Override @Override
@@ -1651,9 +1624,6 @@ public final class NetworkCapabilities implements Parcelable {
sb.append(" Private DNS is broken"); sb.append(" Private DNS is broken");
} }
sb.append(" RequestorUid: ").append(mRequestorUid);
sb.append(" RequestorPackageName: ").append(mRequestorPackageName);
sb.append("]"); sb.append("]");
return sb.toString(); return sb.toString();
} }
@@ -1662,7 +1632,6 @@ public final class NetworkCapabilities implements Parcelable {
private interface NameOf { private interface NameOf {
String nameOf(int value); String nameOf(int value);
} }
/** /**
* @hide * @hide
*/ */
@@ -1830,120 +1799,4 @@ public final class NetworkCapabilities implements Parcelable {
private boolean equalsPrivateDnsBroken(NetworkCapabilities nc) { private boolean equalsPrivateDnsBroken(NetworkCapabilities nc) {
return mPrivateDnsBroken == nc.mPrivateDnsBroken; return mPrivateDnsBroken == nc.mPrivateDnsBroken;
} }
/**
* Set the uid of the app making the request.
*
* Note: This works only for {@link NetworkAgent} instances. Any capabilities passed in
* via the public {@link ConnectivityManager} API's will have this field overwritten.
*
* @param uid UID of the app.
* @hide
*/
@SystemApi
public @NonNull NetworkCapabilities setRequestorUid(int uid) {
mRequestorUid = uid;
return this;
}
/**
* @return the uid of the app making the request.
*
* Note: This could return {@link Process#INVALID_UID} if the {@link NetworkRequest}
* object was not obtained from {@link ConnectivityManager}.
* @hide
*/
public int getRequestorUid() {
return mRequestorUid;
}
/**
* Set the package name of the app making the request.
*
* Note: This works only for {@link NetworkAgent} instances. Any capabilities passed in
* via the public {@link ConnectivityManager} API's will have this field overwritten.
*
* @param packageName package name of the app.
* @hide
*/
@SystemApi
public @NonNull NetworkCapabilities setRequestorPackageName(@NonNull String packageName) {
mRequestorPackageName = packageName;
return this;
}
/**
* @return the package name of the app making the request.
*
* Note: This could return {@code null} if the {@link NetworkRequest} object was not obtained
* from {@link ConnectivityManager}.
* @hide
*/
@Nullable
public String getRequestorPackageName() {
return mRequestorPackageName;
}
/**
* Set the uid and package name of the app making the request.
*
* Note: This is intended to be only invoked from within connectivitiy service.
*
* @param uid UID of the app.
* @param packageName package name of the app.
* @hide
*/
public @NonNull NetworkCapabilities setRequestorUidAndPackageName(
int uid, @NonNull String packageName) {
return setRequestorUid(uid).setRequestorPackageName(packageName);
}
/**
* Test whether the passed NetworkCapabilities satisfies the requestor restrictions of this
* capabilities.
*
* This method is called on the NetworkCapabilities embedded in a request with the
* capabilities of an available network. If the available network, sets a specific
* requestor (by uid and optionally package name), then this will only match a request from the
* same app. If either of the capabilities have an unset uid or package name, then it matches
* everything.
* <p>
* nc is assumed nonnull. Else, NPE.
*/
private boolean satisfiedByRequestor(NetworkCapabilities nc) {
// No uid set, matches everything.
if (mRequestorUid == Process.INVALID_UID || nc.mRequestorUid == Process.INVALID_UID) {
return true;
}
// uids don't match.
if (mRequestorUid != nc.mRequestorUid) return false;
// No package names set, matches everything
if (null == nc.mRequestorPackageName || null == mRequestorPackageName) return true;
// check for package name match.
return TextUtils.equals(mRequestorPackageName, nc.mRequestorPackageName);
}
/**
* Combine requestor info of the capabilities.
* <p>
* This is only legal if either the requestor info of this object is reset, or both info are
* equal.
* nc is assumed nonnull.
*/
private void combineRequestor(@NonNull NetworkCapabilities nc) {
if (mRequestorUid != Process.INVALID_UID && mRequestorUid != nc.mOwnerUid) {
throw new IllegalStateException("Can't combine two uids");
}
if (mRequestorPackageName != null
&& !mRequestorPackageName.equals(nc.mRequestorPackageName)) {
throw new IllegalStateException("Can't combine two package names");
}
setRequestorUid(nc.mRequestorUid);
setRequestorPackageName(nc.mRequestorPackageName);
}
private boolean equalsRequestor(NetworkCapabilities nc) {
return mRequestorUid == nc.mRequestorUid
&& TextUtils.equals(mRequestorPackageName, nc.mRequestorPackageName);
}
} }

View File

@@ -380,7 +380,6 @@ public class NetworkRequest implements Parcelable {
dest.writeInt(requestId); dest.writeInt(requestId);
dest.writeString(type.name()); dest.writeString(type.name());
} }
public static final @android.annotation.NonNull Creator<NetworkRequest> CREATOR = public static final @android.annotation.NonNull Creator<NetworkRequest> CREATOR =
new Creator<NetworkRequest>() { new Creator<NetworkRequest>() {
public NetworkRequest createFromParcel(Parcel in) { public NetworkRequest createFromParcel(Parcel in) {
@@ -495,31 +494,6 @@ public class NetworkRequest implements Parcelable {
return networkCapabilities.getNetworkSpecifier(); return networkCapabilities.getNetworkSpecifier();
} }
/**
* @return the uid of the app making the request.
*
* Note: This could return {@link Process#INVALID_UID} if the {@link NetworkRequest} object was
* not obtained from {@link ConnectivityManager}.
* @hide
*/
@SystemApi
public int getRequestorUid() {
return networkCapabilities.getRequestorUid();
}
/**
* @return the package name of the app making the request.
*
* Note: This could return {@code null} if the {@link NetworkRequest} object was not obtained
* from {@link ConnectivityManager}.
* @hide
*/
@SystemApi
@Nullable
public String getRequestorPackageName() {
return networkCapabilities.getRequestorPackageName();
}
public String toString() { public String toString() {
return "NetworkRequest [ " + type + " id=" + requestId + return "NetworkRequest [ " + type + " id=" + requestId +
(legacyType != ConnectivityManager.TYPE_NONE ? ", legacyType=" + legacyType : "") + (legacyType != ConnectivityManager.TYPE_NONE ? ", legacyType=" + legacyType : "") +

View File

@@ -606,7 +606,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
private Set<String> mWolSupportedInterfaces; private Set<String> mWolSupportedInterfaces;
private final TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
private final AppOpsManager mAppOpsManager; private final AppOpsManager mAppOpsManager;
private final LocationPermissionChecker mLocationPermissionChecker; private final LocationPermissionChecker mLocationPermissionChecker;
@@ -1166,7 +1166,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
int transportType, NetworkRequest.Type type) { int transportType, NetworkRequest.Type type) {
final NetworkCapabilities netCap = new NetworkCapabilities(); final NetworkCapabilities netCap = new NetworkCapabilities();
netCap.addCapability(NET_CAPABILITY_INTERNET); netCap.addCapability(NET_CAPABILITY_INTERNET);
netCap.setRequestorUidAndPackageName(Process.myUid(), mContext.getPackageName());
if (transportType > -1) { if (transportType > -1) {
netCap.addTransportType(transportType); netCap.addTransportType(transportType);
} }
@@ -1697,12 +1696,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
return newLp; return newLp;
} }
private void restrictRequestUidsForCallerAndSetRequestorInfo(NetworkCapabilities nc, private void restrictRequestUidsForCaller(NetworkCapabilities nc) {
int callerUid, String callerPackageName) {
if (!checkSettingsPermission()) { if (!checkSettingsPermission()) {
nc.setSingleUid(callerUid); nc.setSingleUid(Binder.getCallingUid());
} }
nc.setRequestorUidAndPackageName(callerUid, callerPackageName);
nc.setAdministratorUids(Collections.EMPTY_LIST); nc.setAdministratorUids(Collections.EMPTY_LIST);
// Clear owner UID; this can never come from an app. // Clear owner UID; this can never come from an app.
@@ -5307,7 +5304,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// This checks that the passed capabilities either do not request a // This checks that the passed capabilities either do not request a
// specific SSID/SignalStrength, or the calling app has permission to do so. // specific SSID/SignalStrength, or the calling app has permission to do so.
private void ensureSufficientPermissionsForRequest(NetworkCapabilities nc, private void ensureSufficientPermissionsForRequest(NetworkCapabilities nc,
int callerPid, int callerUid, String callerPackageName) { int callerPid, int callerUid) {
if (null != nc.getSSID() && !checkSettingsPermission(callerPid, callerUid)) { if (null != nc.getSSID() && !checkSettingsPermission(callerPid, callerUid)) {
throw new SecurityException("Insufficient permissions to request a specific SSID"); throw new SecurityException("Insufficient permissions to request a specific SSID");
} }
@@ -5317,7 +5314,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
throw new SecurityException( throw new SecurityException(
"Insufficient permissions to request a specific signal strength"); "Insufficient permissions to request a specific signal strength");
} }
mAppOpsManager.checkPackage(callerUid, callerPackageName);
} }
private ArrayList<Integer> getSignalStrengthThresholds(NetworkAgentInfo nai) { private ArrayList<Integer> getSignalStrengthThresholds(NetworkAgentInfo nai) {
@@ -5364,6 +5360,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
return; return;
} }
MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(ns); MatchAllNetworkSpecifier.checkNotMatchAllNetworkSpecifier(ns);
ns.assertValidFromUid(Binder.getCallingUid());
} }
private void ensureValid(NetworkCapabilities nc) { private void ensureValid(NetworkCapabilities nc) {
@@ -5375,9 +5372,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@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) {
@NonNull String callingPackageName) {
final int callingUid = Binder.getCallingUid();
final NetworkRequest.Type type = (networkCapabilities == null) final NetworkRequest.Type type = (networkCapabilities == null)
? NetworkRequest.Type.TRACK_DEFAULT ? NetworkRequest.Type.TRACK_DEFAULT
: NetworkRequest.Type.REQUEST; : NetworkRequest.Type.REQUEST;
@@ -5385,7 +5380,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// the default network request. This allows callers to keep track of // the default network request. This allows callers to keep track of
// the system default network. // the system default network.
if (type == NetworkRequest.Type.TRACK_DEFAULT) { if (type == NetworkRequest.Type.TRACK_DEFAULT) {
networkCapabilities = createDefaultNetworkCapabilitiesForUid(callingUid); networkCapabilities = createDefaultNetworkCapabilitiesForUid(Binder.getCallingUid());
enforceAccessPermission(); enforceAccessPermission();
} else { } else {
networkCapabilities = new NetworkCapabilities(networkCapabilities); networkCapabilities = new NetworkCapabilities(networkCapabilities);
@@ -5397,14 +5392,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
ensureRequestableCapabilities(networkCapabilities); ensureRequestableCapabilities(networkCapabilities);
ensureSufficientPermissionsForRequest(networkCapabilities, ensureSufficientPermissionsForRequest(networkCapabilities,
Binder.getCallingPid(), callingUid, callingPackageName); Binder.getCallingPid(), Binder.getCallingUid());
// Set the UID range for this request to the single UID of the requester, or to an empty // Set the UID range for this request to the single UID of the requester, or to an empty
// set of UIDs if the caller has the appropriate permission and UIDs have not been set. // set of UIDs if the caller has the appropriate permission and UIDs have not been set.
// This will overwrite any allowed UIDs in the requested capabilities. Though there // This will overwrite any allowed UIDs in the requested capabilities. Though there
// are no visible methods to set the UIDs, an app could use reflection to try and get // are no visible methods to set the UIDs, an app could use reflection to try and get
// networks for other apps so it's essential that the UIDs are overwritten. // networks for other apps so it's essential that the UIDs are overwritten.
restrictRequestUidsForCallerAndSetRequestorInfo(networkCapabilities, restrictRequestUidsForCaller(networkCapabilities);
callingUid, callingPackageName);
if (timeoutMs < 0) { if (timeoutMs < 0) {
throw new IllegalArgumentException("Bad timeout specified"); throw new IllegalArgumentException("Bad timeout specified");
@@ -5479,18 +5473,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkRequest pendingRequestForNetwork(NetworkCapabilities networkCapabilities, public NetworkRequest pendingRequestForNetwork(NetworkCapabilities networkCapabilities,
PendingIntent operation, @NonNull String callingPackageName) { PendingIntent operation) {
checkNotNull(operation, "PendingIntent cannot be null."); checkNotNull(operation, "PendingIntent cannot be null.");
final int callingUid = Binder.getCallingUid();
networkCapabilities = new NetworkCapabilities(networkCapabilities); networkCapabilities = new NetworkCapabilities(networkCapabilities);
enforceNetworkRequestPermissions(networkCapabilities); enforceNetworkRequestPermissions(networkCapabilities);
enforceMeteredApnPolicy(networkCapabilities); enforceMeteredApnPolicy(networkCapabilities);
ensureRequestableCapabilities(networkCapabilities); ensureRequestableCapabilities(networkCapabilities);
ensureSufficientPermissionsForRequest(networkCapabilities, ensureSufficientPermissionsForRequest(networkCapabilities,
Binder.getCallingPid(), callingUid, callingPackageName); Binder.getCallingPid(), Binder.getCallingUid());
ensureValidNetworkSpecifier(networkCapabilities); ensureValidNetworkSpecifier(networkCapabilities);
restrictRequestUidsForCallerAndSetRequestorInfo(networkCapabilities, restrictRequestUidsForCaller(networkCapabilities);
callingUid, callingPackageName);
NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE, NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE,
nextNetworkRequestId(), NetworkRequest.Type.REQUEST); nextNetworkRequestId(), NetworkRequest.Type.REQUEST);
@@ -5538,16 +5530,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities, public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities,
Messenger messenger, IBinder binder, @NonNull String callingPackageName) { Messenger messenger, IBinder binder) {
final int callingUid = Binder.getCallingUid();
if (!hasWifiNetworkListenPermission(networkCapabilities)) { if (!hasWifiNetworkListenPermission(networkCapabilities)) {
enforceAccessPermission(); enforceAccessPermission();
} }
NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
ensureSufficientPermissionsForRequest(networkCapabilities, ensureSufficientPermissionsForRequest(networkCapabilities,
Binder.getCallingPid(), callingUid, callingPackageName); Binder.getCallingPid(), Binder.getCallingUid());
restrictRequestUidsForCallerAndSetRequestorInfo(nc, callingUid, callingPackageName); restrictRequestUidsForCaller(nc);
// Apps without the CHANGE_NETWORK_STATE permission can't use background networks, so // Apps without the CHANGE_NETWORK_STATE permission can't use background networks, so
// make all their listens include NET_CAPABILITY_FOREGROUND. That way, they will get // make all their listens include NET_CAPABILITY_FOREGROUND. That way, they will get
// onLost and onAvailable callbacks when networks move in and out of the background. // onLost and onAvailable callbacks when networks move in and out of the background.
@@ -5567,17 +5558,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void pendingListenForNetwork(NetworkCapabilities networkCapabilities, public void pendingListenForNetwork(NetworkCapabilities networkCapabilities,
PendingIntent operation, @NonNull String callingPackageName) { PendingIntent operation) {
checkNotNull(operation, "PendingIntent cannot be null."); checkNotNull(operation, "PendingIntent cannot be null.");
final int callingUid = Binder.getCallingUid();
if (!hasWifiNetworkListenPermission(networkCapabilities)) { if (!hasWifiNetworkListenPermission(networkCapabilities)) {
enforceAccessPermission(); enforceAccessPermission();
} }
ensureValid(networkCapabilities); ensureValid(networkCapabilities);
ensureSufficientPermissionsForRequest(networkCapabilities, ensureSufficientPermissionsForRequest(networkCapabilities,
Binder.getCallingPid(), callingUid, callingPackageName); Binder.getCallingPid(), Binder.getCallingUid());
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
restrictRequestUidsForCallerAndSetRequestorInfo(nc, callingUid, callingPackageName); restrictRequestUidsForCaller(nc);
NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(), NetworkRequest networkRequest = new NetworkRequest(nc, TYPE_NONE, nextNetworkRequestId(),
NetworkRequest.Type.LISTEN); NetworkRequest.Type.LISTEN);
@@ -7856,13 +7847,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
throw new IllegalArgumentException("ConnectivityManager.TYPE_* are deprecated." throw new IllegalArgumentException("ConnectivityManager.TYPE_* are deprecated."
+ " Please use NetworkCapabilities instead."); + " Please use NetworkCapabilities instead.");
} }
final int callingUid = Binder.getCallingUid(); mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackageName);
mAppOpsManager.checkPackage(callingUid, callingPackageName);
// This NetworkCapabilities is only used for matching to Networks. Clear out its owner uid // This NetworkCapabilities is only used for matching to Networks. Clear out its owner uid
// and administrator uids to be safe. // and administrator uids to be safe.
final NetworkCapabilities nc = new NetworkCapabilities(request.networkCapabilities); final NetworkCapabilities nc = new NetworkCapabilities(request.networkCapabilities);
restrictRequestUidsForCallerAndSetRequestorInfo(nc, callingUid, callingPackageName); restrictRequestUidsForCaller(nc);
final NetworkRequest requestWithId = final NetworkRequest requestWithId =
new NetworkRequest( new NetworkRequest(

View File

@@ -272,23 +272,9 @@ public class NetworkCapabilitiesTest {
netCap.setOwnerUid(123); netCap.setOwnerUid(123);
assertParcelingIsLossless(netCap); assertParcelingIsLossless(netCap);
netCap.setSSID(TEST_SSID); netCap.setSSID(TEST_SSID);
assertParcelSane(netCap, 15); assertParcelSane(netCap, 13);
} }
@Test
public void testParcelNetworkCapabilitiesWithRequestorUidAndPackageName() {
final NetworkCapabilities netCap = new NetworkCapabilities()
.addCapability(NET_CAPABILITY_INTERNET)
.setRequestorUid(9304)
.setRequestorPackageName("com.android.test")
.addCapability(NET_CAPABILITY_EIMS)
.addCapability(NET_CAPABILITY_NOT_METERED);
assertParcelingIsLossless(netCap);
netCap.setSSID(TEST_SSID);
assertParcelSane(netCap, 15);
}
@Test @Test
public void testOemPaid() { public void testOemPaid() {
NetworkCapabilities nc = new NetworkCapabilities(); NetworkCapabilities nc = new NetworkCapabilities();

View File

@@ -212,8 +212,7 @@ public class ConnectivityManagerTest {
ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class); ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class);
// register callback // register callback
when(mService.requestNetwork( when(mService.requestNetwork(any(), captor.capture(), anyInt(), any(), anyInt()))
any(), captor.capture(), anyInt(), any(), anyInt(), any()))
.thenReturn(request); .thenReturn(request);
manager.requestNetwork(request, callback, handler); manager.requestNetwork(request, callback, handler);
@@ -241,8 +240,7 @@ public class ConnectivityManagerTest {
ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class); ArgumentCaptor<Messenger> captor = ArgumentCaptor.forClass(Messenger.class);
// register callback // register callback
when(mService.requestNetwork( when(mService.requestNetwork(any(), captor.capture(), anyInt(), any(), anyInt()))
any(), captor.capture(), anyInt(), any(), anyInt(), any()))
.thenReturn(req1); .thenReturn(req1);
manager.requestNetwork(req1, callback, handler); manager.requestNetwork(req1, callback, handler);
@@ -260,8 +258,7 @@ public class ConnectivityManagerTest {
verify(callback, timeout(100).times(0)).onLosing(any(), anyInt()); verify(callback, timeout(100).times(0)).onLosing(any(), anyInt());
// callback can be registered again // callback can be registered again
when(mService.requestNetwork( when(mService.requestNetwork(any(), captor.capture(), anyInt(), any(), anyInt()))
any(), captor.capture(), anyInt(), any(), anyInt(), any()))
.thenReturn(req2); .thenReturn(req2);
manager.requestNetwork(req2, callback, handler); manager.requestNetwork(req2, callback, handler);
@@ -285,8 +282,7 @@ public class ConnectivityManagerTest {
info.targetSdkVersion = VERSION_CODES.N_MR1 + 1; info.targetSdkVersion = VERSION_CODES.N_MR1 + 1;
when(mCtx.getApplicationInfo()).thenReturn(info); when(mCtx.getApplicationInfo()).thenReturn(info);
when(mService.requestNetwork(any(), any(), anyInt(), any(), anyInt(), any())) when(mService.requestNetwork(any(), any(), anyInt(), any(), anyInt())).thenReturn(request);
.thenReturn(request);
Handler handler = new Handler(Looper.getMainLooper()); Handler handler = new Handler(Looper.getMainLooper());
manager.requestNetwork(request, callback, handler); manager.requestNetwork(request, callback, handler);

View File

@@ -107,7 +107,6 @@ import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
@@ -306,7 +305,6 @@ public class ConnectivityServiceTest {
private static final String MOBILE_IFNAME = "test_rmnet_data0"; private static final String MOBILE_IFNAME = "test_rmnet_data0";
private static final String WIFI_IFNAME = "test_wlan0"; private static final String WIFI_IFNAME = "test_wlan0";
private static final String WIFI_WOL_IFNAME = "test_wlan_wol"; private static final String WIFI_WOL_IFNAME = "test_wlan_wol";
private static final String TEST_PACKAGE_NAME = "com.android.test.package";
private static final String[] EMPTY_STRING_ARRAY = new String[0]; private static final String[] EMPTY_STRING_ARRAY = new String[0];
private MockContext mServiceContext; private MockContext mServiceContext;
@@ -656,7 +654,7 @@ public class ConnectivityServiceTest {
if (mNmValidationRedirectUrl != null) { if (mNmValidationRedirectUrl != null) {
mNmCallbacks.showProvisioningNotification( mNmCallbacks.showProvisioningNotification(
"test_provisioning_notif_action", TEST_PACKAGE_NAME); "test_provisioning_notif_action", "com.android.test.package");
mNmProvNotificationRequested = true; mNmProvNotificationRequested = true;
} }
} }
@@ -2974,7 +2972,7 @@ public class ConnectivityServiceTest {
networkCapabilities.addTransportType(TRANSPORT_WIFI) networkCapabilities.addTransportType(TRANSPORT_WIFI)
.setNetworkSpecifier(new MatchAllNetworkSpecifier()); .setNetworkSpecifier(new MatchAllNetworkSpecifier());
mService.requestNetwork(networkCapabilities, null, 0, null, mService.requestNetwork(networkCapabilities, null, 0, null,
ConnectivityManager.TYPE_WIFI, TEST_PACKAGE_NAME); ConnectivityManager.TYPE_WIFI);
}); });
class NonParcelableSpecifier extends NetworkSpecifier { class NonParcelableSpecifier extends NetworkSpecifier {
@@ -3013,12 +3011,31 @@ public class ConnectivityServiceTest {
} }
@Test @Test
public void testNetworkRequestUidSpoofSecurityException() throws Exception { public void testNetworkSpecifierUidSpoofSecurityException() throws Exception {
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 TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiNetworkAgent.connect(false); mWiFiNetworkAgent.connect(false);
NetworkRequest networkRequest = newWifiRequestBuilder().build();
UidAwareNetworkSpecifier networkSpecifier = new UidAwareNetworkSpecifier();
NetworkRequest networkRequest = newWifiRequestBuilder().setNetworkSpecifier(
networkSpecifier).build();
TestNetworkCallback networkCallback = new TestNetworkCallback(); TestNetworkCallback networkCallback = new TestNetworkCallback();
doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
assertThrows(SecurityException.class, () -> { assertThrows(SecurityException.class, () -> {
mCm.requestNetwork(networkRequest, networkCallback); mCm.requestNetwork(networkRequest, networkCallback);
}); });