在 Android 4 下,以下简单的本机 C 代码行会失败,并在 not
作为
Permission denied
运行时出现 root
错误:
online_socket = socket(AF_INET, SOCK_DGRAM, 0);
我
确实拥有对设备的root
访问权限,但希望以非特权用户身份运行该进程。请注意,即使在绑定套接字之前也会发生错误。
我猜有一些安全设置需要调整?谁能告诉我哪里可以看?
在这种情况下,操作系统实际上是 Android,但我猜问题实际上与 Linux 相关(因为 Android 基于 Linux 内核)。
对于那些想知道的人:这是一个自定义程序,可以在 Android 4 环境中运行的完整 (debootstrap
ped) Debian Jessie 安装中运行。更新
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
root
和 以及我的非特权用户
imp
实际上都可以成功调用
socket()
- 至少使用上述组设置是这样。但是,调用与
root
相同的进程,然后使用
imp
系统调用切换到 seteuid()
会阻止 socket()
成功。有什么想法吗?
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()
和类似的替代方案,但这些都没有帮助......
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
:
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
...
{ 许可 }