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_INET和AID_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在此特定内核中设置了该标志,因为我无法访问配置文件.
我发现两者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()和类似的替代方案,但没有一个帮助...