浅谈root原理以及已知漏洞的分析

来源:互联网 发布:2017年太阳黑子数据 编辑:程序博客网 时间:2024/03/28 22:18

//weibo: @少仲


0x1 概述

Root本身是指linux系统当中的root账户,它对整个linux系统有着最高的权限,可以操作所有的对象.对于Android手机用户来说,Root就是拥有root权限.然而Android本身就是不想让你获取root权限,大部分手机在出厂时,都默认在普通用户权限下,无法操纵系统中的文件和数据.

Linux下su以后,输入正确的密码后就可以root了,但是Android里的su和linux下的su不太一样.Android里的su不是靠密码验证,而是看你原来的权限是什么.如果你本身是root用户,你可以su切换到其他中户,比如shell,camera等等.但是如果你是root或shell以外的用户,就不能切换到root用户,会提示Permission denied.(su只能被root或者shell权限执行)

//摘自AOSP \system\extras\su\su.cmyuid = getuid();if (myuid != AID_ROOT && myuid != AID_SHELL) {fprintf(stderr,"su: uid %d not allowed to su\n", myuid);return 1;}if(argc < 2) {uid = gid = 0;} else {int gids_count = sizeof(gids)/sizeof(gids[0]);extract_uidgids(argv[1], &uid, &gid, gids, &gids_count);if(gids_count) {if(setgroups(gids_count, gids)) {fprintf(stderr, "su: failed to set groups\n");return 1;}}}if(setgid(gid) || setuid(uid)) {fprintf(stderr,"su: permission denied\n");return 1;}

也就是说在root下执行su才有用,但是我这时候还没有root怎么办?一般我们在linux下查看某文件的权限的是ls –l xxx.

比如-rwxr-xr-x,r代表可读,w代表可写,x代表可执行,-代表没有权限.

第一个rwx代表文件所有者的权限,第二个xr代表文件所有者同属一个用户组的其他用户可读可执行,第三个x代表其他用户组的权限.


rws,它的执行权限标志位是s, s代表代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件的所有者是root,简单点说就是不管谁执行这个文件,他执行的时候都是以root身份执行的.su顺利执行后,就获得了root的权限.

 

所以只要把一个所有者是rootsu拷贝到手机上,并且把su的权限标志位设置成rwsr,就可以完成root.

1.cp /data/local/tmp/su /system/bin/   #拷贝到系统分区,而系统分区非root情况下不可读写

2.chown root:root su #su的所有者设置为root

3.chmod 4755 /system/bin/su #su加上s标志位

 

完成上述的每一步操作都需要root权限.也就是说只有root权限下执行这些代码才能获取root权限.而这些代码就是为了让你获取root.那么如何打破这个逻辑闭环呢?所以一个办法就是使用一个本身已经root权限的进程来执行上述代码,这样就可以顺利root.但是已经有root权限的进程都是出厂时设置好的,我们没法控制.所以要开始自己去需找漏洞了.


0x2 漏洞浅析

1.CVE-2009-2692(Wunderbar/asroot)

sock_sendpage()的空指针解引用.因为sock_sendpage 没有对 socket_file_ops 结构的 sendpage 字段做指针检查,有些模块不具备

sendpage 功能,初始时赋为 NULL,这样,没有做检查的sock_sendpage 有可能直接调用空指针而导致出错并提升权限.

分析文章:http://blog.csdn.net/py_panyu/article/details/45224725

 

2.adbd setuid

ADB守护进程(adbd进程)以root权限开始启动,然后降权到shell用户.在Android2.2及以前的版本中,ADB守护进程在降权时不会检查setuid调用的返回值.在此之前,adb.c中的代码都是以root权限运行,以完成部分初始化工作.通过调用setuid()将用户从root切换回shell,但setuid()在shell用户进程数达到上限RLIMIT_NPROC时,会失败,因此adb.c继续以root身份运行,而没有报错.

分析文章:http://blog.csdn.net/py_panyu/article/details/45224627

 

3.CVE-2011-3874(zergRush)

漏洞的本质是"use after free".具有root权限的vold进程使用了libsysutils.so,其中某个函数存在栈溢出的问题,因此可以控制root身份的vold执行system(),借以提权.

分析文章:http://blog.csdn.net/py_panyu/article/details/45565549

 

4.CVE-2012-0056(mempodroid)

Linux通过一个特殊字符设备/proc/$pid/mem把每个进程的虚拟内存暴露为一个文件.出于安全考虑,读写这个文件的权限被严格限制,拥有写入权限的只有内存的所属进程.但是攻击者可以打开目标进程的mem设备,把它复制到进程的stdout和stderr.当stdout重定向到与虚拟内存相关的字符设备时,攻击者可以写入其他程序内存,但是写入的地址是未知的.

分析文章:http://blog.csdn.net/py_panyu/article/details/45224791

 

5.CVE-2011-1823(GingerBreak)

在Android 3.0版本和2.3.4之前的2.x版本上的volume守护进程(vold)由于信任从PF_NETLINK套接字接收到的消息,因此允许以root权限执行任意代码,利用方法是通过一个负数索引绕过只针对最大值的有符号整数检测.

分析文章: http://blog.csdn.net/py_panyu/article/details/46013631

 

6.Exynos-abuse

早期的三星手机,经常是某些设备被chmod 755/666,造成了全局可读写,然后只要将这些设备mmap出来,就可以操作物理内存,之后可以通过patch相关参数或者构造payload函数达到提权的目的.

分析文章:http://blog.csdn.net/py_panyu/article/details/45397327

 

7.CVE-2012-4220(diag)

Android 2.3-4.2使用的QualcommInnovation Center (QuIC) Diagnostics内核模式驱动程序diagchar_core.c在实现上存在整数溢出漏洞,通过向diagchar_ioctl内传递特制的输入,远程攻击者可利用此漏洞执行任意代码或造成拒绝服务.

分析文章:http://blog.csdn.net/py_panyu/article/details/45114797


0x3 展望

Android 2.*时代,vold有多个溢出漏洞,都被用来exploitpoc.

Android 4.*时代,大部分的exploit都盯上了内核中的堆栈溢出和整数溢出等..

Android 5.*以后,更强悍的SELinux策略,想通过kernel漏洞提取更加困难…



0 0