gpt4 book ai didi

permissions - 什么会导致 socket() "Permission denied"错误?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:22 29 4
gpt4 key购买 nike

在 Android 4 下,以下简单的 native C 代码行失败并出现 Permission denied 错误 when not run as :

online_socket = socket(AF_INET, SOCK_DGRAM, 0);

确实拥有设备的 root 访问权限,但想以非特权用户身份运行该进程。

请注意,错误甚至发生在绑定(bind)套接字之前。

我猜有些安全设置需要调整?谁能告诉我在哪里看?

在这种情况下,操作系统实际上是 Android,但我猜问题实际上与 Linux 相关(因为 Android 基于 Linux 内核)。

对于那些想知道的人:这是一个自定义程序,在 Android 4 环境中运行的完整(debootstrapped)Debian Jessie 安装中运行。

更新

我了解到 Android 内核有一个特殊的 CONFIG_ANDROID_PARANOID_NETWORK 扩展,它只允许 AID_INETAID_NET_RAW 组中的用户访问网络。

然而,即使在将用户添加到这些组之后,socket() 仍然被拒绝(并且 ping 似乎有同样的问题,顺便说一句)。

uid=5(imp) gid=51(imp) groups=51(imp),3003(aid_inet),3004(aid_net_raw),3005(aid_admin),3001(aid_bt),3002(aid_bt_net)

我无法判断是否在这个特定的内核中设置了 CONFIG_ANDROID_PARANOID_NETWORK 标志,因为我无权访问配置文件。

更新2

我发现 root 还有我的非特权用户 imp 实际上可以成功调用 socket() - 至少使用上述组设置。

但是,调用与root 相同的进程,然后使用seteuid() 系统切换到imp调用阻止 socket() 成功。有什么想法吗?

最佳答案

事实证明,Android 使用了一个特殊的内核补丁,该补丁通过 CONFIG_ANDROID_PARANOID_NETWORK 激活。此补丁允许网络访问属于具有硬编码 ID 的某些特殊组的系统用户。

groupadd -g 3001 aid_bt
groupadd -g 3002 aid_bt_net
groupadd -g 3003 aid_inet
groupadd -g 3004 aid_net_raw
groupadd -g 3005 aid_admin

这是因为 Android 通常仅在特定应用具有网络权限时才将用户(即应用)添加到这些组。

将用户添加到这些组将授予其使用 socket() 的权限,如问题中所述:

usermod -a -G aid_bt,aid_bt_net,aid_inet,aid_net_raw,aid_admin someuser

但是,当一个进程使用seteuid()root切换到非特权用户(例如someuser),那么这个有效用户拥有 aid_* 组成员身份是不够的(或者可能不相关)。相反,root 用户必须明确地成为这些组的成员:

usermod -a -G aid_bt,aid_bt_net,aid_inet,aid_net_raw,aid_admin root

这解决了我的问题。

请注意,我也尝试过使用 setegid() 和类似的替代方案,但没有任何帮助...

关于permissions - 什么会导致 socket() "Permission denied"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36451444/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com