非root
权限下运行时会因为权限被拒绝
而失败。online_socket = socket(AF_INET, SOCK_DGRAM, 0);
我确实拥有设备的 root
访问权限,但希望将进程以非特权用户身份运行。
请注意,在绑定套接字之前就发生了错误。
我猜测可能需要调整某些安全设置?有人能告诉我该去哪里查看吗?
在这种情况下,操作系统确实是 Android,但我猜问题实际上与 Linux 有关(因为 Android 基于 Linux 内核)。
对于那些好奇的人:这是在 Android 4 环境中运行的完整(
debootstrap
安装的)Debian Jessie 中运行的自定义程序。
更新
我了解到 Android 内核有一个特殊的 CONFIG_ANDROID_PARANOID_NETWORK
扩展,只允许在 AID_INET
和 AID_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
我发现即使是我的非特权用户imp
,也可以成功调用socket()
,但需要按照上述组设置来进行。
然而,使用seteuid()
系统调用将进程从root
切换到imp
后,调用socket()
会失败。有什么想法吗?