Android HAL(C++)Socket API返回权限拒绝,如何设置BPF_PERMISSION_INTERNET?
问题描述
我正在开发一款使用Socket访问的HAL应用,但在C++编写的HAL中调用Socket API时返回“Operation not Permitted”。相关代码如下:
s = socket(AF_INET, SOCK_STREAM, 0) /// ---> return Operation not Permitted
已确认以下内容:
- SELinux已禁用。
- 应用归属AID_INET(3003)用户组。
- 以root用户运行时,Socket API调用成功。
经排查内核代码,怀疑是BPF过滤器导致该问题,相关代码位于packages/modules/Connectivity/bpf_progs/netd.c:
DEFINE_NETD_BPF_PROG_KVER("cgroupsock/inet/create", AID_ROOT, AID_ROOT, inet_socket_create, KVER_4_14) (struct bpf_sock* sk) { // A return value of 1 means allow, everything else means deny. return (get_app_permissions() & BPF_PERMISSION_INTERNET) ? 1 : 0; }
请问如何为HAL应用的UID设置BPF_PERMISSION_INTERNET权限?
解决方案
要为HAL应用的UID设置BPF_PERMISSION_INTERNET权限,可通过以下几种方式实现:
1. 修改netd权限配置文件
Android的netd通过配置文件管理BPF网络权限,找到packages/modules/Connectivity/config/permissions.xml,添加你的HAL应用UID到android.permission.INTERNET的允许列表:
<permission name="android.permission.INTERNET"> <uid range="你的HAL应用UID"/> </permission>
如果需要覆盖多个UID范围,也可以使用<uid min="起始UID" max="结束UID"/>的格式。
2. 调整BPF程序的权限判定逻辑
直接修改packages/modules/Connectivity/bpf_progs/netd.c中的inet_socket_create函数,为目标UID或AID_INET组强制授予权限:
(struct bpf_sock* sk) { u32 uid = bpf_get_current_uid_gid() >> 16; // 允许目标UID或AID_INET组创建INET socket if (uid == 你的HAL应用UID || (bpf_get_current_uid_gid() & 0xFFFF) == AID_INET) { return 1; } // 原有权限判定逻辑 return (get_app_permissions() & BPF_PERMISSION_INTERNET) ? 1 : 0; }
替换你的HAL应用UID为实际的UID数值即可。
3. 通过cgroup临时授予权限(调试用)
如果只是临时调试验证,可将HAL应用的进程加入允许INET socket创建的cgroup:
echo 你的HAL进程PID > /sys/fs/cgroup/net_cls/inet_allowed/tasks
此方式需要root权限,且系统重启后失效,仅适合快速验证问题根源。
内容的提问来源于stack exchange,提问作者h_n
相关产品推荐
相关产品推荐

