什么可以导致socket()"Permission denied"错误?

Udo*_*o G 9 sockets permissions android

在Android 4下,以下简单的本机C代码行在运行失败并显示Permission denied错误:root

online_socket = socket(AF_INET, SOCK_DGRAM, 0);
Run Code Online (Sandbox Code Playgroud)

root接入设备,但要运行的过程,非特权用户.

请注意,即使在绑定套接字之前也会发生错误.

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

在这种情况下,O/S实际上是Android,但我猜这个问题确实与Linux有关(因为Android基于Linux内核).

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

更新

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

但是,即使将用户添加到这些组后,socket()仍然会被拒绝(并且ping似乎有同样的问题,BTW).

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)
Run Code Online (Sandbox Code Playgroud)

我无法分辨是否CONFIG_ANDROID_PARANOID_NETWORK在此特定内核中设置了该标志,因为我无法访问配置文件.

更新2

我发现两者root 以及我的无特权用户imp实际上都可以成功呼叫socket()- 至少使用上述群组设置.

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

Udo*_*o G 13

事实证明,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
Run Code Online (Sandbox Code Playgroud)

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

将用户添加到这些组可以使用socket()该问题中所述的权限:

usermod -a -G aid_bt,aid_bt_net,aid_inet,aid_net_raw,aid_admin someuser
Run Code Online (Sandbox Code Playgroud)

但是,当进程用于seteuid()切换root到非特权用户(例如someuser)时,此有效用户具有组成员资格是不够的(或可能不相关).相反,用户必须明确地成为这些组的成员:aid_*root

usermod -a -G aid_bt,aid_bt_net,aid_inet,aid_net_raw,aid_admin root
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.

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

  • usermod 命令在 Android 中不可用。如何在 Android 手机上执行此操作? (2认同)