最近出于安全问题,需要对系统的某些程序进行降权,保护用户数据,但是发现将应用程序降权之后,出现了通过socket()函数创建socket时报没有权限,后面网上找了一些文章,也没有找到具体原因。

当时找到的解决方式基本都是说增加sudo权限执行。如果可以增加sudo的,不需要降权的,压根就没有这个问题了,排除。想了想,android手机上面的应用,肯定的都是有socket通信的,怎么会不行呢,应该某些配置不对导致的。后来在ubuntu系统上测试,发现非root用户也是可以正常创建socket的,得了,肯定是哪些配置不对。之前看到文章介绍说非root用户只能使用1000以上的端口,但是这里仅是创建socket,都还没有到配置网络端口呢,排除。最后和其他人帮助下,发现了内核的一个配置CONFIG_ANDROID_PARANOID_NETWORK,发现去掉这个配置之后,非root用户也可以正常的创建socket了,问题解决

下面再来看看 CONFIG_ANDROID_PARANOID_NETWORK 这个玩意是干什么的?

Android内核有一个特殊的CONFIG_ANDROID_PARANOID_NETWORK扩展,只允许网络访问用户AID_INET和AID_NET_RAW组。同时在内核搜索代码发现,bt、ipv4、ipv6都有根据这个宏进行一些权限检查。

解决该问题也可以尝试通过执行下面的命令,给你的用户增加socket权限:

usermod -a -G aid_inet,aid_net_raw SomeUser

上面方法还没有测试过,具体可以实测, usermod命令介绍

Linux usermod命令用于修改用户帐号,usermod可用来修改用户帐号的各项设定。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐