什么会导致socket()“权限被拒绝”错误?

问题描述 投票:0回答:3

在 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 安装中运行。

更新

我了解到 Android 内核有一个特殊的

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()
 成功。有什么想法吗?

permissions android sockets
3个回答
20
投票
事实证明,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()

 和类似的替代方案,但这些都没有帮助......


3
投票
那些在 Android 上遇到

apt-get

 问题的用户(启用 
CONFIG_ANDROID_PARANOID_NETWORK
 会限制属于特定组的用户的网络访问),有两种解决方法:

  1. groupadd -g 3003 aid_inet && usermod -G nogroup -g aid_inet _apt
    
    
  2. 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 ...
    

0
投票
防火墙性能。

{ 许可 }

© www.soinside.com 2019 - 2024. All rights reserved.