diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index d6476647ef..e58160a5e4 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -2253,7 +2253,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (newNc.getNetworkSpecifier() != null) { newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact()); } - newNc.setAdministratorUids(new int[0]); + if (!checkAnyPermissionOf(callerPid, callerUid, android.Manifest.permission.NETWORK_STACK, + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)) { + newNc.setAdministratorUids(new int[0]); + } if (!checkAnyPermissionOf( callerPid, callerUid, android.Manifest.permission.NETWORK_FACTORY)) { newNc.setAllowedUids(new ArraySet<>()); diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 6eec2eb688..025b28c71d 100644 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -7081,6 +7081,36 @@ public class ConnectivityServiceTest { reset(mStatsManager); } + @Test + public void testAdminUidsRedacted() throws Exception { + final int[] adminUids = new int[] {Process.myUid() + 1}; + final NetworkCapabilities ncTemplate = new NetworkCapabilities(); + ncTemplate.setAdministratorUids(adminUids); + mCellNetworkAgent = + new TestNetworkAgentWrapper(TRANSPORT_CELLULAR, new LinkProperties(), ncTemplate); + mCellNetworkAgent.connect(false /* validated */); + + // Verify case where caller has permission + mServiceContext.setPermission( + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, PERMISSION_GRANTED); + TestNetworkCallback callback = new TestNetworkCallback(); + mCm.registerDefaultNetworkCallback(callback); + callback.expectCallback(CallbackEntry.AVAILABLE, mCellNetworkAgent); + callback.expectCapabilitiesThat( + mCellNetworkAgent, nc -> Arrays.equals(adminUids, nc.getAdministratorUids())); + mCm.unregisterNetworkCallback(callback); + + // Verify case where caller does NOT have permission + mServiceContext.setPermission( + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, PERMISSION_DENIED); + mServiceContext.setPermission(NETWORK_STACK, PERMISSION_DENIED); + callback = new TestNetworkCallback(); + mCm.registerDefaultNetworkCallback(callback); + callback.expectCallback(CallbackEntry.AVAILABLE, mCellNetworkAgent); + callback.expectCapabilitiesThat( + mCellNetworkAgent, nc -> nc.getAdministratorUids().length == 0); + } + @Test public void testNonVpnUnderlyingNetworks() throws Exception { // Ensure wifi and cellular are not torn down.