diff --git a/framework-t/src/android/net/NetworkStatsAccess.java b/framework-t/src/android/net/NetworkStatsAccess.java index 0585756e7c..23902dc800 100644 --- a/framework-t/src/android/net/NetworkStatsAccess.java +++ b/framework-t/src/android/net/NetworkStatsAccess.java @@ -17,7 +17,6 @@ package android.net; import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.net.NetworkStats.UID_ALL; import static android.net.TrafficStats.UID_REMOVED; import static android.net.TrafficStats.UID_TETHERING; @@ -33,6 +32,8 @@ import android.os.Process; import android.os.UserHandle; import android.telephony.TelephonyManager; +import com.android.net.module.util.PermissionUtils; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -100,6 +101,7 @@ public final class NetworkStatsAccess { *
  • Device owners. *
  • Carrier-privileged applications. *
  • The system UID. + *
  • NetworkStack application. * */ int DEVICE = 3; @@ -125,9 +127,9 @@ public final class NetworkStatsAccess { final int appId = UserHandle.getAppId(callingUid); - final boolean isNetworkStack = context.checkPermission( - android.Manifest.permission.NETWORK_STACK, callingPid, callingUid) - == PERMISSION_GRANTED; + final boolean isNetworkStack = PermissionUtils.checkAnyPermissionOf( + context, callingPid, callingUid, android.Manifest.permission.NETWORK_STACK, + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK); if (hasCarrierPrivileges || isDeviceOwner || appId == Process.SYSTEM_UID || isNetworkStack) { diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 2af30ddc4b..f6153b1384 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -98,6 +98,7 @@ import static android.system.OsConstants.IPPROTO_UDP; import static com.android.net.module.util.DeviceConfigUtils.TETHERING_MODULE_NAME; import static com.android.net.module.util.NetworkMonitorUtils.isPrivateDnsValidationRequired; +import static com.android.net.module.util.PermissionUtils.checkAnyPermissionOf; import static com.android.net.module.util.PermissionUtils.enforceAnyPermissionOf; import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermission; import static com.android.net.module.util.PermissionUtils.enforceNetworkStackPermissionOr; @@ -2324,11 +2325,12 @@ public class ConnectivityService extends IConnectivityManager.Stub if (newNc.getNetworkSpecifier() != null) { newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact()); } - if (!checkAnyPermissionOf(callerPid, callerUid, android.Manifest.permission.NETWORK_STACK, + if (!checkAnyPermissionOf(mContext, callerPid, callerUid, + android.Manifest.permission.NETWORK_STACK, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)) { newNc.setAdministratorUids(new int[0]); } - if (!checkAnyPermissionOf( + if (!checkAnyPermissionOf(mContext, callerPid, callerUid, android.Manifest.permission.NETWORK_FACTORY)) { newNc.setAllowedUids(new ArraySet<>()); newNc.setSubscriptionIds(Collections.emptySet()); @@ -2837,15 +2839,6 @@ public class ConnectivityService extends IConnectivityManager.Stub setUidBlockedReasons(uid, blockedReasons); } - private boolean checkAnyPermissionOf(int pid, int uid, String... permissions) { - for (String permission : permissions) { - if (mContext.checkPermission(permission, pid, uid) == PERMISSION_GRANTED) { - return true; - } - } - return false; - } - private void enforceInternetPermission() { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERNET, @@ -3004,13 +2997,13 @@ public class ConnectivityService extends IConnectivityManager.Stub } private boolean checkNetworkStackPermission(int pid, int uid) { - return checkAnyPermissionOf(pid, uid, + return checkAnyPermissionOf(mContext, pid, uid, android.Manifest.permission.NETWORK_STACK, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK); } private boolean checkNetworkSignalStrengthWakeupPermission(int pid, int uid) { - return checkAnyPermissionOf(pid, uid, + return checkAnyPermissionOf(mContext, pid, uid, android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, android.Manifest.permission.NETWORK_SETTINGS); @@ -5008,7 +5001,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } private RequestInfoPerUidCounter getRequestCounter(NetworkRequestInfo nri) { - return checkAnyPermissionOf( + return checkAnyPermissionOf(mContext, nri.mPid, nri.mUid, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) ? mSystemNetworkRequestCounter : mNetworkRequestCounter; } diff --git a/tests/unit/java/android/net/NetworkStatsAccessTest.java b/tests/unit/java/android/net/NetworkStatsAccessTest.java index a74056be1a..8b86211112 100644 --- a/tests/unit/java/android/net/NetworkStatsAccessTest.java +++ b/tests/unit/java/android/net/NetworkStatsAccessTest.java @@ -78,6 +78,7 @@ public class NetworkStatsAccessTest { setHasAppOpsPermission(AppOpsManager.MODE_DEFAULT, false); setHasReadHistoryPermission(false); setHasNetworkStackPermission(false); + setHasMainlineNetworkStackPermission(false); } @After @@ -154,6 +155,10 @@ public class NetworkStatsAccessTest { setHasNetworkStackPermission(false); assertEquals(NetworkStatsAccess.Level.DEFAULT, NetworkStatsAccess.checkAccessLevel(mContext, TEST_PID, TEST_UID, TEST_PKG)); + + setHasMainlineNetworkStackPermission(true); + assertEquals(NetworkStatsAccess.Level.DEVICE, + NetworkStatsAccess.checkAccessLevel(mContext, TEST_PID, TEST_UID, TEST_PKG)); } private void setHasCarrierPrivileges(boolean hasPrivileges) { @@ -189,4 +194,10 @@ public class NetworkStatsAccessTest { TEST_PID, TEST_UID)).thenReturn(hasPermission ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED); } + + private void setHasMainlineNetworkStackPermission(boolean hasPermission) { + when(mContext.checkPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, + TEST_PID, TEST_UID)).thenReturn(hasPermission ? PackageManager.PERMISSION_GRANTED + : PackageManager.PERMISSION_DENIED); + } }