现在是使用 bpf 程序 cgroupsock/inet/create 控制创建 socket 的权限
packages/modules/Connectivity/bpf_progs/netd.c
首次提交 于 2019 年
这个程序不再通过 groups 判断是否具有 网络权限 ,而是从 bpf 程序定义的 map (uid_permission_map) 中查找目标进程 uid (非 gid 或 groups)的权限记录,如果 map 有相应 uid 的记录,且记录中没有 网络权限,才会拒绝创建 socket 。
因此现在 gids 有 inet 也不一定能创建 socket ,而不存在于 pm 的 uid 反而具有 网络权限 。
你可以在 /sys/fs/bpf/netd_shared/map_netd_uid_permission_map 看到这个 map
map 由 系统服务 或 netd 负责更新,相关代码:
packages/modules/Connectivity/service/src/com/android/server/BpfNetMaps.java setNetPermForUids
packages/modules/Connectivity/service/native/TrafficController.cpp TrafficController::setPermissionForUids
packages/modules/Connectivity/bpf_progs/netd.c
首次提交 于 2019 年
这个程序不再通过 groups 判断是否具有 网络权限 ,而是从 bpf 程序定义的 map (uid_permission_map) 中查找目标进程 uid (非 gid 或 groups)的权限记录,如果 map 有相应 uid 的记录,且记录中没有 网络权限,才会拒绝创建 socket 。
因此现在 gids 有 inet 也不一定能创建 socket ,而不存在于 pm 的 uid 反而具有 网络权限 。
你可以在 /sys/fs/bpf/netd_shared/map_netd_uid_permission_map 看到这个 map
map 由 系统服务 或 netd 负责更新,相关代码:
packages/modules/Connectivity/service/src/com/android/server/BpfNetMaps.java setNetPermForUids
packages/modules/Connectivity/service/native/TrafficController.cpp TrafficController::setPermissionForUids