本文主要简单总结下Android系统启动过程。
首先看下别人总结系统启动过程图,图来自博客。
第一步:设备芯片ROM上写好了上电后代码执行的地方,会在ROM上查找boot loader执行的地址。
第二步:boot loader执行,完成硬件的初始化,寻找Linux kernel的地址。
第三步:kernel执行,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并启动第一个用户空间的进程init进程。
第四步:从init进程开始,是Android系统启动重点分析的对象。
init 进程主要完成工作有:
创建与挂在系统目录,包括/dev, /proc, /sys等;
根据init.rc 系统启动脚本启动一系列服务和进程。
由init进程启动的启动的进程包括:
一些守护进程,例如vold,debuggerd,installd等;
service_manager进程,此进程统一管理系统服务;
zygote进程,zygote不用多说,所有的app及system_server都是fork自zygote进程;
- (mediaserver进程也是init进程启动的,不知道算不算守护进程)
zygote进程很重要,是所有App的父进程。也是system_server的父进程。我们知道,system_server进程如果崩溃,系统将发生软重启。所以如果zygote进程崩溃,系统必然更会软重启。zygote进程做了以下的事:
zygote进程启动Android 虚拟机,并启动system_server进程。
以上都是网上常见的内容,关于这个我就是浅显地了解。里面有三个进程需要注意,system_server,zygote和servicemanager,这三个进程如果发生了异常崩溃(killed),系统都将发生软重启。此外,这三个进程的uid级别都很高,至少是system级别。如果能向这几个进程注入代码,被注入的代码将以高权限执行。 CVE-2014-7911这个漏洞其实就是利用反序列化向系统服务(system_server)注入了代码,从而达到system提权的目的。
此外,还有一点需要说明,在CVE-2014-7911分析中,包含ROP链的String其实是注入到系统服务中的,为何会以system权限被执行?其实,所以的系统服务(非Native服务)都是作为system_server线程被启动的,也就是说所有系统服务的代码都运行在system_server进程中,所以有system权限。
这篇就到这里,主要是对网上 资料的整理,给自己留下个印象。这里还贴上一个图。
图中可以看到system_server,系统服务还有,servicemanger三者直接是有关系的,所以以下提出几个值得思考和后续值得研究下的问题:
1. 系统服务是怎么启动的?即system_server,servicemanager,和系统服务启动时各自发挥了什么作用?工作机制?
2. 能否向system_server,zygote,service_manager进程注入数据或者代码?导致系统崩溃或者code execution?
3. 看到网上资料说zygote开启了本地Linux socket作为进程通信用,那么这些socket是否有利用价值?
参考文献:
http://ticktick.blog.51cto.com/823160/1659473
http://blog.youkuaiyun.com/amazing7/article/details/51578478