`
arm10504
  • 浏览: 16996 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Android Root 1 —— RageAgainstTheCage

阅读更多
这个漏洞网上有很多资料,我也来总结一下。
首先,先来大致了解下Root Android系统的原理。Root的本质就是修改替换/system/bin/su这个文件。这个文件就跟桌面linux的su命令一样,提供切换到root用户的功能。但是系统自带的su文件(有时候系统中甚至不会有这个文件)有诸多限制,不可能让随便一个程序就能使用su命令。该文件的源码在/system/extras/su/目录下,其中有这样一段代码:



[cpp] view plaincopyprint?
01./* Until we have something better, only root and the shell can use su. */ 
02.myuid = getuid(); 
03.if (myuid != AID_ROOT && myuid != AID_SHELL) { 
04.    fprintf(stderr,"su: uid %d not allowed to su\n", myuid); 
05.    return 1; 
06.} 

从这个 if 我们能够看到它对不是root和shell的用户进行了排除(android中每个普通应用程序所属的用户id应该都是临时用户?)。所以我们只要用我们修改后的su文件将系统中的替换即可。修改su时除了修改它的源代码,它的权限也要进行修改——需要设置上SUID和GUID位(这两位有什么作用我这里就不细说了,网上很多资料)。

但是,/system/bin/这个目录的权限是644,用户和用户组均是root,所以你也不可能直接删除修改su文件,而是需要获得root权限才能删除修改su,这就形成了死循环了。所以这里root的关键点就是怎样获得root权限来修改su,答案当然就是漏洞了。

也许有人会问了,既然你都已经通过漏洞获得root权限了,为什么还要通过修改su来获得root权限呢,这不多此一举吗?因为这里的漏洞有点特殊:这次我们讲RageAgainstTheCage这个漏洞,它只是临时的一次性的获取root权限,当你手机重启后就还原了,更重要的是,它需要手机通过USB连接电脑时才能获得root权限,这让我们平时需要root需要使用手机带来了不方便,总不可能每次需要root的时候都去连接电脑执行一次漏洞程序吧。所以我们的策略是使用那个“不方便的一次性的root”来修改su使得我们能够获得“永久root的权限”。

下面我们来看RageAgainstTheCage这个漏洞的原理。

既然是漏洞,那么是哪里的漏洞呢?难道是linux内核漏洞?那是不可能的,如果真是linux内核漏洞,那么世界早就乱套了。既然Android是基于linux的系统,那么肯定是android自己的问题了。

Android系统有一个服务程序:adb(Android Debug Bridge),我们这里利用到的漏洞就是adb程序的一个漏洞。adb是一个“客户端-服务器端 ”程序,其中客户端是你用来操作的电脑,服务器端是android设备;adb也是android sdk里的一个工具,用于连接、调试、管理android设备。一般来说当手机通过usb连接到电脑后(当然,还得需要该手机的驱动才行),系统会自动启动手机端的adb程序,这样我们在电脑上的命令行里输入命令就能连接控制手机了,例如我们在开发程序时在命令行里输入的”adb devices“、”adb install ***“、”adb shell“等。adb程序就是为这个功能提供服务支持。其中adb shell很有用,它为我们提供了一个登陆手机的shell,可惜它也没有权限使用su命令(虽然它是shell权限,通过了上面代码中的 if 条件判断,但是后面还有其他验证,看来普通shell也是不能使用su的啊,还是 root 靠谱)。

明白了adb是个什么东西后,我们再来看看adb的源代码,分析其中到底哪里有漏洞。adb的源代码在/system/core/adb/adb.c,简要如下:




[cpp] view plaincopyprint?
01.int adb_main(int is_daemon)  
02.{  
03.      ......  
04.      property_get("ro.secure", value, "");  
05.      if (strcmp(value, "1") == 0) {  
06.            secure = 1;  
07.      ......  
08.      }  
09.     if (secure) {  
10.           ......  
11.           setgid(AID_SHELL);  
12.           setuid(AID_SHELL);  
13.           ......  
14.      }  
15.} 

Adbd服务进程初始是Root权限,因为它要进行一些系统的初始化的工作,这时必须要是root权限才行。初始化完成后它会给自己降级为shell,所以我们在使用adb shell时看到的权限是shell,而不是root。降级的关键代码是setgid()和setuid()这两个函数,而漏洞就出在这里。

试想一下,若是降级失败会怎样?很明显,若是降级失败,函数setgid()和setuid()都返回非0值,但是,程序并没有检查它的返回值,也就是并没有判断它是否降级成功,这就给了我们可乘之机。若是降级失败,程序继续运行,并没有任何出错的地方,唯一的不同就是这个服务程序依然是root权限,而当我们使用adb shell得到它返回给我们使用的shell窗口时,我们得到的也就是root权限的shell。

为什么?因为它使用fork()函数来产生子进程(这个子进程就是我们得到的shell),而在linux中子进程将继承父进程的权限,所以我们得到的shell就是具有root权限,显然,此时我们就能很方便地删除修改su文件了。

那么,其中的关键点就是:怎么让它降级失败,也就是setgid()和setuid()函数执行失败。在此之前我们来补充一个知识点。

linux系统中,任何一个用户他所能拥有的进程数量是有限的,这个上限为RLIMIT_NPROC(我电脑上这个值大概是6万多),平时大家都很少接触这个东西,因为正常作业时我们每个用户所拥有的进程数量基本不会超过它。一旦达到这个上限,那么系统就不会再为此用户添加新的进程。

结合之前的分析,我们就可以利用这一点使得adb服务降权失败:当adb服务在执行setuid和setgid之前,我们让shell用户的进程数量达到上限,那么当它使用setuid来降权时,就会因为shell用户的进程数量满了而失败,使得adb继续保持root权限。

网上对于RageAgainstTheCage源码的分析也有不少,我这里就不详述了,只是画一些图方便大家理解,

流程图:






时序图:






最后,如果要封堵这个漏洞也非常简单,只需对那两个函数的返回值加以判断即可:




[cpp] view plaincopyprint?
01.int adb_main(int is_daemon)  
02.{  
03.      ......  
04.      property_get("ro.secure", value, "");  
05.      if (strcmp(value, "1") == 0) {  
06.            secure = 1;  
07.      ......  
08.      }  
09.     if (secure) {  
10.           ......  
11.           if(setgid(AID_SHELL) != 0){ 
12.      exit(1); 
13.           };  
14.           if(setuid(AID_SHELL) != 0){ 
15.      exit(1); 
16.           };  
17.           ......  
18.      }  
19. } 


  • 大小: 110.5 KB
  • 大小: 68.3 KB
分享到:
评论

相关推荐

    android root提权原理

    android 利用exploit root提权原理

    手机安卓2.2以上系统ROOT工具

    电脑端用SuperOneClick 2.1 获取手机Root权限 首先说明一点,如果在xp系统必须安装NET.framework,在这个构架下superoneclick才能连接手机。win7的话没有这个问题 ROOT机步骤: 1.点开 设置---应用程序---开发 ...

    ansys maxwell

    ansys maxwell

    matlab基于不确定性可达性优化的自主鲁棒操作.zip

    matlab基于不确定性可达性优化的自主鲁棒操作.zip

    pytest-2.8.0.zip

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    信息安全课程实验C++实现DES等算法源代码

    信息安全课程实验C++实现DES等算法源代码

    基于知识图谱的医疗诊断知识问答系统python源码+项目说明.zip

    环境 python >= 3.6 pyahocorasick==1.4.2 requests==2.25.1 gevent==1.4.0 jieba==0.42.1 six==1.15.0 gensim==3.8.3 matplotlib==3.1.3 Flask==1.1.1 numpy==1.16.0 bert4keras==0.9.1 tensorflow==1.14.0 Keras==2.3.1 py2neo==2020.1.1 tqdm==4.42.1 pandas==1.0.1 termcolor==1.1.0 itchat==1.3.10 ahocorasick==0.9 flask_compress==1.9.0 flask_cors==3.0.10 flask_json==0.3.4 GPUtil==1.4.0 pyzmq==22.0.3 scikit_learn==0.24.1 效果展示 为能最简化使用该系统,不需要繁杂的部署各种七七八八的东西,当前版本使用的itchat将问答功能集成到微信做演示,这需要你的微信能登入网页微信才能使用itchat;另外对话上下文并没

    一个高品质的音乐共享和流媒体轻量音乐程序网站在线音乐源码

    一个高品质的音乐共享和流媒体轻量音乐程序网站在线音乐源码,是创建您自己的音乐流媒体网站的最佳方式! 最新版本: 添加插件系统,现在开发人员可以为程序制作插件并在更新后保留您的自定义设置。 固定的2 个以上的小错误。 安装所需:nginx/apache,mysql5.6+,php7+ 搭建说明:看源码内详细说明

    实现的金融风控贷款违约预测python源码.zip

    实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip实现的金融风控贷款违约预测python源码.zip

    麦肯锡—xx数码公司发展战略咨询报告.ppt

    麦肯锡—xx数码公司发展战略咨询报告.ppt

    FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

    FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写

    基于sklearn实现线性回归模型对波士顿房价进行预测源码.zip

    基于sklearn实现线性回归模型对波士顿房价进行预测源码.zip

    pytest-3.5.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pytest-4.5.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于相干衍射成像模拟的matlab源码.zip

    基于相干衍射成像模拟的matlab源码.zip

    基于CS的远程监控系统软件项目(免费提供全套java开源项目源码+论文)

    项目介绍 背景 在当今的数字化时代,远程监控系统已经成为企业和个人必不可少的工具。随着物联网(IoT)技术的发展,监控系统的需求不断增加,不仅仅局限于视频监控,还包括数据监控、设备状态监控等。基于CS(Client-Server)架构的远程监控系统应运而生,旨在提供高效、实时、可靠的监控服务,帮助用户实现远程管理和控制。 目的 基于CS的远程监控系统软件项目旨在为用户提供一个综合性的监控平台,通过该平台,用户可以实时监控各类设备和数据,实现远程控制和管理,提高工作效率,降低运营成本。同时,该系统还可以用于安全防护、生产过程监控等多种场景,具有广泛的应用前景。 模块说明 前端模块 前端模块是用户与系统交互的界面,负责展示监控数据和接收用户指令。前端模块的主要功能包括: 用户登录与认证:通过安全的登录机制,确保只有授权用户才能访问系统。 实时数据展示:以图表、仪表盘等形式展示实时监控数据,包括视频流、传感器数据等。 报警通知:当监控系统检测到异常情况时,前端模块会通过弹窗、声音等方式通知用户。 远程控制:用户可以通过前端界面对设备进行远程控制,例如开关设备、调整参数等。

    网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip

    网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面.zip

    matlab基于标签歧义的深度标签分布学习.zip

    matlab基于标签歧义的深度标签分布学习.zip

    九型人格测试题.144题dr.xls

    九型人格测试题.144题dr.xls

    麦肯锡—xx科技业务流程改造报告.ppt

    麦肯锡—xx科技业务流程改造报告.ppt

Global site tag (gtag.js) - Google Analytics