在Android 4下,以下简单的本机C代码行在未以root身份运行时失败并显示Permission denied错误:
online_socket = socket(AF_INET, SOCK_DGRAM, 0);
我对该设备具有root访问权限,但希望以非特权用户身份运行该进程.
我想有一些需要调整的安全设置?谁能告诉我在哪里看?
在这种情况下,O / S实际上是Android,但我猜这个问题确实与Linux有关(因为Android基于Linux内核).
对于那些想知道:这是一个自定义程序,运行在Android 4环境中运行的完整(debootstrapped)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)
我无法判断是否在此特定内核中设置了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()和类似的替代方案,但没有一个帮助…
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。