You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:52:53