diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 6db9c5439a..d2473fae25 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -2366,6 +2366,26 @@ public class ConnectivityService extends IConnectivityManager.Stub return false; } + private int getAppUid(final String app, final UserHandle user) { + final PackageManager pm = + mContext.createContextAsUser(user, 0 /* flags */).getPackageManager(); + final long token = Binder.clearCallingIdentity(); + try { + return pm.getPackageUid(app, 0 /* flags */); + } catch (PackageManager.NameNotFoundException e) { + return -1; + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private void verifyCallingUidAndPackage(String packageName, int callingUid) { + final UserHandle user = UserHandle.getUserHandleForUid(callingUid); + if (getAppUid(packageName, user) != callingUid) { + throw new SecurityException(packageName + " does not belong to uid " + callingUid); + } + } + /** * Ensure that a network route exists to deliver traffic to the specified * host via the specified network interface. @@ -2381,6 +2401,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (disallowedBecauseSystemCaller()) { return false; } + verifyCallingUidAndPackage(callingPackageName, mDeps.getCallingUid()); enforceChangePermission(callingPackageName, callingAttributionTag); if (mProtectedNetworks.contains(networkType)) { enforceConnectivityRestrictedNetworksPermission(); diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 1c201d5bc3..d318489183 100644 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -14411,4 +14411,11 @@ public class ConnectivityServiceTest { mDefaultNetworkCallback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent); mDefaultNetworkCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); } + + @Test + public void testRequestRouteToHostAddress_PackageDoesNotBelongToCaller() { + assertThrows(SecurityException.class, () -> mService.requestRouteToHostAddress( + ConnectivityManager.TYPE_NONE, null /* hostAddress */, "com.not.package.owner", + null /* callingAttributionTag */)); + } }