- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 Android 4 下,以下简单的 native C 代码行失败并出现 Permission denied
错误 when not run as 根
:
online_socket = socket(AF_INET, SOCK_DGRAM, 0);
我确实拥有设备的 root
访问权限,但想以非特权用户身份运行该进程。
请注意,错误甚至发生在绑定(bind)套接字之前。
我猜有些安全设置需要调整?谁能告诉我在哪里看?
在这种情况下,操作系统实际上是 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
标志,因为我无权访问配置文件。
我发现 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()
和类似的替代方案,但没有任何帮助...
关于permissions - 什么会导致 socket() "Permission denied"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36451444/
我在 Ubuntu Linux Server 20.04这是我第一次向 Docker 推送东西,所以我只是在本地创建了一个虚拟容器并且它工作了。按照一些在线教程,hello-world示例也可以正常工
尝试将图像推送到 Docker Hub 上的公共(public)存储库时会发生此错误。我尝试过的其他注册表没有问题。 我查看了很多网站、博客,包括 StackOverflow,但仍然没有明确的答案。
我有个问题。我有操作系统 CentOS 5.8 。我在 httpd.conf 文件中写了这个配置: Listen 85 并在文件末尾: ServerName localhost ServerAdmi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
请帮我配置 python 服务器。当我使用 python 命令在 cmd 中执行 .pyw 文件时出现错误我收到错误: IOError: [Errno 13] Permission denied(Pe
我是第一次尝试 CGI 脚本,但没有成功。我已经阅读了很多教程并关注了不同论坛中的主题,但我无法使其正常工作。我在 Fedora 10 机器上使用 appache 网络服务器。我总是有问题 [Wed
在两个文件中使用相同的 mdb.connect 行。使用 debian 7,我的问题现在是向您提供更多详细信息,因为我在问题中使用了很多代码,但我没有什么可告诉的。文件 1 工作正常。 #!/usr/
我正在尝试将数据洞察报告连接到表格和 BigQuery 中的 View 。在 BigQuery 中,表从位于我的云端硬盘中的 GoogleSheet 接收数据, View 正在查询同一个表,但添加了一
我正在尝试为我的 docker hub 存储库创建一个 list ,以便我拥有一个多平台镜像。 我的程序如下: 我首先创建一个空的存储库并向其中推送两个图像,一个用于 amd64,另一个用于 arm6
我正在尝试在我的 arch linux lamp 服务器中使用 fuecms。但是我不能让 htaccess 工作。我的主文件夹是 ytsejam/fuel_cms/.. 这是我的 .htaccess
我有一个简单的docker-compose.yml文件以这种方式定义: version: '3' services: db: image: postgres:10.5-alpine
所以我使用了 testcafe 的默认 docker,它在 docker hub 上是 testcafe/testcafe,我必须运行一些 testcafe 脚本。 但是,我需要将错误触发的屏幕截图上
我在 ubuntu 上使用 Hyperledger Fabric 2.2。我正在尝试借助 article 使用 express.js 创建 REST API . 我的结构网络和 apiserver.j
最近将 macOS Mojave (10.14.4) 上的 Logstash(通过 Homebrew 安装)升级到版本 6.7.0,但事情没有按预期运行。当我尝试通过命令行手动运行它(出于本地开发目的
最近将 macOS Mojave (10.14.4) 上的 Logstash(通过 Homebrew 安装)升级到版本 6.7.0,但事情没有按预期运行。当我尝试通过命令行手动运行它(出于本地开发目的
我的想法是 eclipse-luna 。系统是windows 7旗舰版。我使用 spring security 将 *.jar 复制到我的项目并“添加到构建路径”。请查看有关警告的图片
我在 vmware 播放器上使用 ubuntu 16.04。共享文件夹已启用并且在/mnt/fghs 上可见。但是,所有者(root)不能被 chown 改变。如何改变它?请给我建议。 另外,有人说修
我刚开始学习 SQL 的基础知识,当我在搜索数据操作语言、数据控制语言、数据定义语言时,有些东西没有意义。 据我了解,Data Control Language 有 3 个关键词:Grant、Deny
我要迁移到新服务器,并希望在过渡期间将我的所有站点都脱机。我知道我可以将它放在我的根 .htaccess 文件中以阻止人们访问该站点: order deny,allow deny from all 但
我正在尝试使用 os.Mkdir() 创建一个目录,然后在其中创建文件,类似于这个脚本: package main import ( "log" "os" "path" ) f
我是一名优秀的程序员,十分优秀!