尽管问题很旧,但问题始终出现在“ 未回答(我的标签)”问题之上。所以我认为我应该回答这个问题:)
AOSP的功能支持:
问题专门针对Google设备,我从未使用过Google设备。但是我可以肯定地说的是,大多数运行于Android 1.6以下版本的设备(如果不是全部)必须已启用Linux(进程)功能。可以在init和中找到参考system_server,这两个都是AOSP的非常主要的组成部分。例如,在Android 4.2中,installd-另一个核心组件-可以在已删除的功能下运行。
文件系统功能是Android 4.3中的主要安全增强功能之一,该功能从set-uid/ 删除set-gid了二进制run-as文件,并在其中设置了文件功能。这引起了Android生根历程的革命性变化。
在Android 8中添加了对环境功能的支持,这不鼓励使用文件功能:
反过来,文件功能会带来安全风险,因为执行具有文件功能的文件的任何进程都将能够获得这些功能。
许多init服务都依赖于它们,例如storaged,包括我自己的服务sshd和dnscrypt-proxy服务。
内核对功能的支持:
谈到内核部分,构建没有功能的内核不是可选的:
从内核2.5.27到内核2.6.26,功能是可选的内核组件,可以通过CONFIG_SECURITY_CAPABILITIES内核配置选项启用/禁用。
和:
在Linux 2.6.33之前的内核中,文件功能是一个可选功能,可以通过CONFIG_SECURITY_FILE_CAPABILITIES选项进行配置。从Linux 2.6.33开始,已删除了配置选项,并且文件功能始终是内核的一部分。
在Android库最古老的通用内核版本2.6.39是其中包含文件功能的支持了。
某些OEM 必须延迟了对内核端文件系统功能的支持,但他们必须切换,因为否则功能会中断。例如,自Android 7.1起,surfaceflinger(Android的Surface Composer)如果没有文件功能将无法运行。
Mainline Linux内核4.3于9月15日针对Ambient(进程)功能进行了修补,并于2016年向后移植到Android内核3.18和4.1。因此它们必定是内核的一部分。
结论:
在Linux发行版中,很少有程序使用Linux功能。虽然有pam_cap,大多(或全部?)的发行版仍然使用set-uid上su,sudo,ping,mount,passwd等。但是在Android上,功能已深深集成在框架和核心服务中。删除它们将需要在AOSP和内核源代码中编辑数百行或数千行。OEM(尤其是Google,它开发了AOSP并为Android修改了Linux内核)毫无意义,而没有在Android内核中立即可用的免费安全功能,这是没有道理的。它是与OS相关的纯粹功能,不需要任何额外的硬件支持。因此,来自任何制造商的任何电话都必须具有支持的功能。
问题:
我是否能够在不更改原始内核二进制文件的情况下在可执行文件上设置功能?
是的,你一定是。
必需的东西是设置上限的工具...
我一直在用capsh,getcap,setcap,getpcaps从libcap和netcap,pscap从libcap-ng没有任何问题。但是我更喜欢Ambient功能,这些功能易于配置,并且不像文件功能那样依赖任何文件系统功能,例如扩展属性。你也可以使用listxattr,getxattr,setxattr并removexattr从工具xattr_syscall_wrapper操纵security.capability或任何其他XATTR直接。
根据您的评论:
我只是注意到该/system/bin/ping命令不在setuid我真正的三星设备上,提示CAP_NET_RAW
Android的ping既没有也set-uid没有CAP_NET_RAW。它创建了一个特殊的非RAW套接字IPPROTO_ICMP,与之不同的IPPROTO_RAW是,该套接字不需要任何特权。
更多参考资料:
除了上面给出的10多个参考,这里还有AOSP代码的其他一些部分,它们支持和利用Linux功能:
- 核心组件:仿生
libc,init,trusty(OS)
- 外部部件:
libcap,libcap-ng
- 守护程序/服务:
zygote(分叉的应用程序和system_server), ,hostapd,wpa_supplicant,dnsmasq,(logd 经理,私人DNS), (测试),守护,,,,(PERFETTO),性(IPSec) ,若干HAL守护进程,包括。netdNetLinkdebuggerdsdcardperformancedincidentdmtpdtraced_probesracoonwificondrild
- 可执行文件:
reboot(INIT), , ,dumpstate,(tcpdump , 等)straceiputilspingtraceroute
- Minijail:专用于功能的沙盒工具和库。
adbd利用此库来放弃特权。
- SELinux使用
capability类来授予/拒绝域功能。
结论是,Android高度依赖Linux功能,这不是一个很少使用的功能。
有关: