Android 的提权 (root) 原理是什么?

标签: android root 原理 | 发表时间:2013-08-09 18:05 | 作者:Kevin
出处:http://www.zhihu.com
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿。
你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入root用户的密码,密码正确就获得root权限了。Android本身就不想让你获得Root权限,大部分手机出厂的时候根本就没有su这个程序。所以你想获得Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或者/system/xbin/目录下。我们先假设你可以把su放在bin下,接下来你可以在Android手机的adb shell或者串口下输入su了。上面说了,执行su,系统会提示你输入root用户密码,但你怎么可能知道密码呢?暴力破解吗?破解root的黑客当然不会这么做,这就涉及到第二个问题。
一般我们在Linux的console下输入 ls -l 会列出所有文件的权限。
比如:-rwxr-xr-x,用过Linux的人都知道r代表该文件可读,w代表可写,x代表可执行,-就代表没有该权限。第一个rwx代表文件所有者的权限,第二个rwx代表和所有者同组人的权限,第三个rwx代表其他用户对该文件的权限。但下面这个文件就比较特殊。


rws,它的执行权限标志位是一个s,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件的所有者是root,简单点说就是不管谁执行这个文件,他执行的时候都是以root身份执行的。那root用户执行任何文件都是不需要密码的。
这个时候如果你把su文件的权限置成-rwsr-xr-x会发生什么?su这个程序本来就是赋予执行者root权限的,但执行的时候又不需要密码,所以执行一下这个文件就自动成root身份了。
问题都清楚了,就是你需要把su拷贝到Android手机上,并且把su权限标志位置成-rwsr-xr-x。能把这个事情搞定你就成功root了一个手机。
大概意思就是两行代码
cp /data/tmp/su /system/bin/ #copy su 到/system/分区
chmod 1775 /system/bin/su #把su置成-rwsr-xr-x
那怎么搞定这个事情呢?Android的system分区本身不可写,只有是root的权限才能改动它,执行不了啊。
一个办法就是找一个本身已经有root权限的进程来启动我上面的两行代码,那我这两行代码一启动就是root权限,就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行你自己的代码啊。这个时候就需要你找漏洞了,比如用来破解Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞,栈溢出说白了就是这个进程读到了自有内存之外的地址空间,这段内存空间没分配给它,谁都能写这段内存,那我就可以把自己的两行代码预先写到这里,运行zergRush代码,然后等那个倒霉的进程执行我就行了。
如果各位有一定基础,能看懂我上面讲的,就基本知道原理其实并不难,难点在于找到漏洞。
zergRush的代码在这儿:
revolutionary/zergRush · GitHub
有兴趣的可以看看,网上也有很多分析文章。

另外iphone的越狱其实和Android的root是一回事儿,都是越权操作。所以越狱的方式也都差不多,也是找IOS自带程序的漏洞,只不过IOS安全性强一点,所以也比较难找。如果你发现你的iphone的某个自带程序经过一些特定操作会出现系统崩溃重启的现象,并且是可以复现的,那就很有可能可以用来越狱了。
好像是IOS6出来的时候,由于比较难搞,某个越狱团队就号召大家来找茬,发现的漏洞可以报告给他们用来越狱。说明IOS越狱越来越难。直接体现就是现在越狱需要的时间越来越长。
不过如果你发现漏洞也可以报告给苹果,苹果会根据漏洞严重程度给予一定奖励。我记得看新闻说南非一个家伙靠给苹果找漏洞赚25万美元。发家致富的好路子啊,哈哈。

================================================
谢谢各位支持
关于为什么su一定要放到/system/bin/或者/system/xbin/
首先,你当然可以把su这个程序copy到/data/分区,但你adb push进去的时候,su有这个程序的所有者肯定不是root,一般是shell什么的(记不清了,应该是和adbd这个进程的所有者一样),这个时候即使你把它权限置为-rwsr-xr-x,哪你运行它的时候也是shell身份运行的,su会提示你输入密码的。
第二我们root手机的目的是为了运行需要root权限的APP,比如goagent或者什么的。这些APP里代码需要获得root的时候是这么写的:
   Process p = Runtime.getRuntime().exec("su");
也就是它们在代码里调用了一下su这个程序,哪可以写成下面这个样子吗?
   Process p = Runtime.getRuntime().exec("./data/tmp/su");
我没写过APP,不太清楚,估计是不行的。换句话说你必须把su放到环境变量PATH所有的目录里,APP才能调用到它。如果你不想放到bin或者xbin下,你就必须给PATH增加一个目录。PATH是root权限才能修改的,你如果能修改PATH,说明你已经有root权限了,修改PATH就没必要了,还不如直接放到bin下面。

关于sudo
android的工程里没有sudo这个东西。sudo是为了给普通用户临时分配root权限的,Android里建立了很多用户,比如wifi,shell等等,这些用户可以访问那个文件,不可以访问那个文件,代码里已经写死了,权限也分配的很分明。它们在运行的过程中不需要临时获得root权限。所以Android不需要sudo这个程序。

— 完 —
本文作者: Kevin

【知乎日报——比新闻更多】听亲历者和内行专家八仙过海谈新闻,离现场更近一点。
下载知乎新 app - 知乎日报客户端(Android / iPhone 同步上架):
http://daily.zhihu.com/download

此问题还有 6 个回答,查看全部。
延伸阅读:
Android 手机 root 是否有必要?
Android 手机如何获得 root 权限?

相关 [android root 原理] 推荐:

Android 的提权 (root) 原理是什么?

- - 知乎每日精选
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿. 你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入root用户的密码,密码正确就获得root权限了. Android本身就不想让你获得Root权限,大部分手机出厂的时候根本就没有su这个程序.

一鍵ROOT機的Android程式《Universal Androot》

- Gene - Android 資訊雜誌 android-hk.com
最近網絡出現很多一鍵 ROOT 機的工具,令不熟悉電腦的用家都可輕鬆完成複雜的破解工作,但其實要透過 USB 連接電腦進行 ROOT 機的方法未算最簡單,最近就有台灣高手利用 Android 系統的漏洞,開發出《Universal Androot》程式,讓用家可直接在手機上一鍵 ROOT 機,而且亦設有 UnRoot 功能來回復原有的狀態,那就不怕因為 Root 機而失去官方的保養.

Android手機一鍵 Root ,取回完整控制權

- - T客邦
當我們購買新手機的時候,當然希望能玩到一些最新最炫的應用,然後每次Android推出的更新版本都應該要能夠跟得上升級,這些都是廠商理所當然該提供的. 但是對於一、兩年以上的舊手機來說,可能就成為被遺棄的孤兒了. 新的更新不是沒你的份,就是裝了更新後系統被拖累,然後整個系統裡頭裝了一堆廠商當初預載的官方工具,結果現在這些工具連官方都沒在維護,卻在你的手機裡頭佔空間.

Android中BaseAdapter原理

- - 移动开发 - ITeye博客
            Android ListView理解,BaseAdapter ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来. 一般而言,一个ListView由以下三个元素组 成:. 1.View,用于展示列表,通常是一个xml所指定的. 大家都知道Android的界面基本上是由xml文件负责完成的,所以ListView的界 面也理所应当的使用了xml定义.

linux找回root密码

- - CSDN博客系统运维推荐文章
 “忘记了CentOS(Linux)root管理密码怎么办. 可以通过单用户模式进去系统来修改root密码. 有些时候在忘记了Linux的系统管理员密码的时候,我们可以在本地通过进入单用户模式来重置root密码. 对于CentOS 5.x的版本来说,进入单用户模式的方法有很多,主要的操作都是在进入grub启动菜单的时候进行的,下面说一下常用的两种:.

Linux的root密码恢复

- - 掘金 后端
1.首先,启动系统,进入开机界面,先让光标停在上面这个内核(Core)上,在界面中按“e”进入编辑界面. 进入编辑界面,使用键盘上的上下键把光标往下移动,找到以““Linux16”开头内容所在的行数”,在行的UTF-8最后面输入:init=/bin/sh. 输入完成后,直接按快捷键:Ctrl+x 进入单用户模式.

Droid Bionic 手机一键 root 和取消 root

- bill - 谷安——谷奥Android专题站
摩托罗拉 DROID BIONIC 上市才没过几天,不过一个一键 root 工具已经出现. 而且 root 之后你还可以取消 root,实际上之前已经有一个版本,不过你可以下载新的版本因为新版本中加入了取消 root 的功能. 你可以到 RootzWiki 上参阅更多资料和下载这个工具. © wode 发表于 谷安——谷奥Android专题站 ( http://android.guao.hk ), 2011.

【Android】消息机制原理

- - CSDN博客推荐文章
Android 消息机制涉及到的类主要有. 下面结合 Android API 22 的源码分析上面几个类的内部实现细节,以窥探其中的原理一二. Looper 是一个循环处理消息的类,Looper内部维护一个消息队列,循环的从消息队列中取出消息并处理,如果队列为空则等待新消息. Looper 必须关联到某个线程中,这样其才能获得操作系统的调度而执行消息循环处理,默认情况下,通过 Thread 类创建的线程是没有 Looper 的,如果需要该线程拥有消息循环的功能,需要像下面这样在 Runnable 接口实现方法 run() 中创建Looper.

Kindle 4 Root后更换中文字体

- GaRY - Page to Page
编者按:Mobileread论坛的高手门已经Root了Kindle4(非触摸屏),从而使更换字体变成可能,不过操作步骤偏技术了一些,相信不久就会有更简单的越狱方案出来. 如果你不理解你在做什么,请不要继续. 打开 kindle 4/4.0.1 的ssh登录:. 1)从settings菜单中找到你的serial number.

android瀑布流简单实现原理

- - ITeye博客
网上关于android瀑布流的例子一大堆,但是很多都是很复杂,对于新手来说有一定的难度. 原理很简单,就是异步下载图片,把图片addView到ScrollView(因为可以上下一直拖动)中,你需要屏幕显示几列就在ScrollView中放置几个LinearLayout,. 下面我就一个简单的例子来讲解android瀑布流的用法,样子很丑就不上图了.