在Android 4下,当不作为Permission denied
<运行时,以下简单的原生C代码行失败并显示 root
错误 /强>:
online_socket = socket(AF_INET, SOCK_DGRAM, 0);
我执行拥有root
对设备的访问权限,但希望以非特权用户身份运行该进程。
请注意,即使在绑定套接字之前也会发生错误。
我想有一些需要调整的安全设置?任何人都可以告诉我在哪里看?
在这种情况下,操作系统实际上是Android,但我猜这个问题确实与Linux有关(因为Android基于Linux内核)。
对于那些想知道:这是一个自定义程序,运行在Android 4环境中运行的完整(debootstrap
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)
我无法判断是否在此特定内核中设置了CONFIG_ANDROID_PARANOID_NETWORK
标志,因为我无法访问配置文件。
我发现root
和这两个非特权用户imp
实际上可以成功调用socket()
- 至少使用上述群组设置。
但是,调用与root
相同的流程,然后使用 imp
系统调用切换到seteuid()
会阻止socket()
成功。有什么想法吗?
答案 0 :(得分: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
这是因为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()
和类似的替代方案,但这些都没有帮助......
答案 1 :(得分:0)
那些在Android上与apt-get
纠缠的人(启用了CONFIG_ANDROID_PARANOID_NETWORK
,从而限制了对特定组成员的用户的网络访问)有两种解决方法:
groupadd -g 3003 aid_inet && usermod -G nogroup -g aid_inet _apt
echo 'APT::Sandbox::User "root";' > /etc/apt/apt.conf.d/01-android-nosandbox
这是因为apt-get在沙盒用户下运行http / https / gpgv方法,默认情况下为_apt
:
root 1465 0.0 0.0 31408 4956 pts/0 S 11:48 0:00 | | \_ -bash
root 23814 0.1 0.1 65300 10124 pts/0 T 18:58 0:00 | | \_ apt-get update
_apt 23818 0.0 0.1 90208 8852 pts/0 T 18:58 0:00 | | | \_ /usr/lib/apt/methods/http
_apt 23819 0.0 0.1 90208 8828 pts/0 T 18:58 0:00 | | | \_ /usr/lib/apt/methods/https
...