微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

权限 – 什么可以导致套接字()“权限被拒绝”错误?

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 举报,一经查实,本站将立刻删除。

相关推荐