0x00 背景
Android系统应用的安全很大程度上是依赖于其底层Linux内核的进程隔离机制(Android沙箱)来保证的。在这个机制中,应用程序拥有自己的用户ID(UID)、组ID(GID),有着严格的限制文件系统权限。然而,在Linux系统中,root用户具有系统中所有的权限。沿用了Linux权限模型的Android系统中,root也是具备最高级别的管理权限,可以访问和修改系统中几乎所有的文件。比如处理合约手机预装流氓软件、 访问其他应用程序的数据 ,当然也可以利用漏洞 绕过加密区获取指纹等敏感数据 等等。所以,对于安全要求较高的应用程序,尽可能判断出设备是否处于root状态并使用不同的安全策略是很有必要的。
0x01 ROOT检测浅析
目前常用的基本检测方法有以下几种:
-
检测文件是否存在
/system/bin/su
/system/xbin/su
/sbin/su
/system/su
/system/bin/.ext/.su
/system/usr/we-need-root/su-backup
/system/xbin/mu
-
使用
which
命令查看是否存在su -
尝试执行
su
、id
命令,看能否成功执行,并且查看UID是否为root; -
查看
/system/app/
下是否存如下root后常用软件
Superuser
Busybox
.tmpsu
Titanium
busybox
chainfire
daemonsu
greenify
noshufou
rootcloak
substrate
supersu
superuser
titanium
xposed
(以上应用版本不同,可能对应名称不用,推荐使用grep匹配部分关键词如super等);
-
查看Android属性 -
查看系统 /system/build.prop
信息中的ro.build.tags
,ro.build.type
是否为test-keys
来判断系统是否为测试版; -
检查 ro.debuggable
、ro.secure
两个属性是否为true
,为true
的话APP所运行环境很可能是Root环境;
部分国产手机的定制系统,本身就留有/system/bin/su
,针对以上的判定需要加上下面这一条:
-
若su文件存在,可以查看文件的可执行权限,已root的文件权限为:
-rwxrwxrwx
,其中文件所有者具有可执行权限; -
检查一下
install-recovery.sh
有没有去起一些看起来很奇怪的进程; -
查看system分区有没有具有SUID的文件
-
查看特定目录是否可写:
/data
/
/system
/system/bin
/system/sbin
/system/xbin
/vendor/bin
/sys
/sbin
/etc
/proc
/dev -
/data
是否可读。包含着所有已安装APP的数据文件,默认不可读取; -
主动申请root权限;
-
检查市面主流的模拟器;
-
检测frida、xposed等Hook框架的特征;
-
Cyanogenmod ROM已经把superuser包含在了
com.android.settings
中,这就需要列出settings
包中的activities
来检测
除此之外,可以从作弊、风控等其他维度作为补充信息,比如:
-
一些设备常规信息,比如电量状态,USB状态,屏幕亮度,地理位置,WI-FI,SIM卡信息,IP、MAC等 -
Log、SDK、设备指纹、用户画像连坐等
0x02 ROOT检测绕过
ROOT方式分为两种:
-
不完全 root -
完全 root
目前获取Android root 权限常用方法是通过各种系统漏洞,替换或添加SU程序到设备,获取Root权限,而在获取root权限以后,会装一个程序用以提醒用户是否给予程序最高权限,可以一定程度上防止恶意软件,通常会使用Superuser
或者 SuperSU
,这种方法通常叫做不完全Root
。
而 完全Root
是指,替换设备原有的ROM,以实现取消secure设置。
如何绕过Root检测机制呢?
-
对应用下手,干预应用的Root检测行为; -
对系统下手,隐藏系统自身Root相关的特征;
我们可以借助jadx等逆向工具对应用源码进行分析,Hook相关的实现函数绕过;也可以获取AOSP源码,通过定制ROM来隐藏Root的特征。
-
Hook:目前主流的Hook框架有 frida
和xposed
,可以用frida
的可见框架RMS进行注入。相对来说,通过Hook的方式来绕过Root检测机制操作比较简单、方便,但Hook本身会受到很多的约束。一方面,受限于应用自身的加固手段,可能难以定位ROOT检测的实现函数;另一方面,Hook框架自身也会具备一些易于被检测到的特征。 -
定制ROM:定制ROM的手段有很多种,可以通过对官方包进行解包、修改后重打包。推荐的方式是获取AOSP源码,自己编译后制作ROM包。这样可以实现更高程度的定制化,与基于现有包修改的方式相比该方式的操作空间更大,但是同样的编译成本、修改难度也更大。 -
热修复:热修复就是日常工作中常听到的 打补丁
。热修复实现的本质就是将修复bug后的代码生成的dex放置在该数组的头部。
0x03 结论
APP除了添加检测设备是否root的功能外,还需增加加强代码混才行。
总的来说,目前主流的Root检测就是对Root之后的手机独有的一些特征进行验证,如特征文件是否存在、是否存在越权、关键属性是否被修改等等
在APP中做root检测的效果很有限。对于一个已经root的设备,对方具有绝对高的权限,可能会将supersu改名,然后修改su源码调用改名后的supersu,甚至于将su改名,再修改其他依赖的代码,而我们或许连最基本的设备信息都无法获取。在制定安全策略及功能开发的时候,应把设备全部当做root设备来考虑,从最开始就做好安全防护。
原文始发于微信公众号(小宝的安全学习笔记):Android设备ROOT检测与绕过