一、背景和原理
Revolutionary工具开发小组在2011年10月发布了一个在Android 2.2和2.3上获得root权限的方法[1],并公布了漏洞利用代码zergRush.c[2]。tomken_zhang已经在其博客上发表了两篇文章[3][4]对其分析。本文做进一步梳理和补充。
产生漏洞的主要原因是:具有root权限的vold进程使用了libsysutils.so库,该库的一个函数存在栈溢出,因此可以在root权限执行输入的shellcode。
存在漏洞的函数为FrameworkListener::dispatchCommand,位于源码的\system\core\libsysutils\src\FrameworkListener.cpp中,其中的局部变量argv为固定大小的指针数组,当输入参数的数量超过其大小时,会越界写入栈中。
zergRush.c成功地利用了这一漏洞,并进一步:
1、在/data/local/tmp/下增加一个置了S位的shell;
2、使Android中后续启动的adb进程以root权限运行。
其中第二步的方法是:adb进程最初以root运行,之后调用setuid()降低权限[5]。降权之前,会判断系统属性ro.kernel.qemu,如果该属性位1,则不降权。