From d72e9ab720ccc3524650f9472065cd5171d1f067 Mon Sep 17 00:00:00 2001 From: Chenbo Feng Date: Tue, 26 Mar 2019 14:36:34 -0700 Subject: [PATCH] Get the permission information for native services For native services such as mediaserver and audioserver, the permission information cannot be retrieved from getInstalledPackages. Instead, the high level permission information is avalaible in systemConfigs. With those permission information, netd can store the complete list of uids that have UPDATE_DEVICE_STATS permission. Bug: 128944261 Test: dumpsys netd trafficcontroller Change-Id: I0331d5a3a5b927a351fcfe6689ef1ba2b993db0c --- .../connectivity/PermissionMonitor.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java index 30771eb7df..0c559346bc 100644 --- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java +++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java @@ -43,12 +43,15 @@ import android.os.INetworkManagementService; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; +import android.util.ArraySet; import android.util.Log; +import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.LocalServices; +import com.android.server.SystemConfig; import java.util.ArrayList; import java.util.HashMap; @@ -170,6 +173,23 @@ public class PermissionMonitor { } } + final SparseArray> systemPermission = + SystemConfig.getInstance().getSystemPermissions(); + for (int i = 0; i < systemPermission.size(); i++) { + ArraySet perms = systemPermission.valueAt(i); + int uid = systemPermission.keyAt(i); + int netdPermission = 0; + // Get the uids of native services that have UPDATE_DEVICE_STATS permission. + if (perms != null) { + netdPermission |= perms.contains(UPDATE_DEVICE_STATS) + ? INetd.PERMISSION_UPDATE_DEVICE_STATS : 0; + } + // For internet permission, the native services have their own selinux domains and + // sepolicy will control the socket creation during run time. netd cannot block the + // socket creation based on the permission information here. + netdPermission |= INetd.PERMISSION_INTERNET; + netdPermsUids.put(uid, netdPermsUids.get(uid) | netdPermission); + } log("Users: " + mUsers.size() + ", Apps: " + mApps.size()); update(mUsers, mApps, true); sendPackagePermissionsToNetd(netdPermsUids);