MIUI的root权限管理分析

2024-03-31 08:08
文章标签 分析 管理 权限 miui

本文主要是介绍MIUI的root权限管理分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、授权管理

       MIUI中对与root权限的管理和控制通过两个模块实现:
       su 这是一个ELF可执行文件,在系统中的路径为/system/bin/su
       Superuser.apk(Superuser.odex) 授权管理app
       MIUI中的app提权到root的一般过程为:

          某个app通过Runtime.getRuntime().exec()方法执行提权命令”su [options]“
          su被执行,将待提权app的相关信息以广播的形式发送出去,并开启local socket服务端等待客户端连接
          Superuser.apk中的广播接收器接受到su发送的广播,获得用户的设置,然后将结果通过local socket返回给su

          su根据Socket客户端发来的结果继续或者终止提权过程


二、问题定位


      由于MIUI的su不容易被逆向分析,所以从分析Superuser.apk(Superuser.odex)入手。MIUI将系统应用程序(/sysetm/app目录下)apk文件中的classes.dex提取出来,进行优化得到odex文件,也存放到/system/app目录下。例如,Superuser这个app就分为两个部分,Superuser.apk和Superuser.odex,与典型的apk文件不同,Superuser.apk中已没有classes.dex了。

     查看Superuser.apk中的AndroidManifest.xml,看到了一个比较关键的BroadcastReceiver:

[html]  view plain copy
  1. <span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <manifest android:versionCode="24" android:versionName="2.3.6"  
  3.     package="com.miui.uac"  
  4.     xmlns:android="http://schemas.android.com/apk/res/android">  
  5.         ...  
  6.         <receiver android:name="SuRequestReceiver">  
  7.             <intent-filter>  
  8.                 <action android:name="com.miui.uac.REQUEST" />  
  9.             </intent-filter>  
  10.         </receiver>  
  11.         ...  
  12.         <uses-permission android:name="com.miui.uac.RESPOND" />  
  13.         <permission  
  14.             android:label="@string/permlab_respond"  
  15.             android:name="com.miui.uac.RESPOND"  
  16.             android:protectionLevel="signature"  
  17.             android:permissionGroup="android.permission-group.SYSTEM_TOOLS"  
  18.             android:description="@string/permdesc_respond" /></span>  

     根据名字大概可以判断,su发来的广播会被此receiver接受并进行处理(后面查看它的smali代码也验证了这个判断)。值得注意的是,这个receiver是对外暴露的,而且    看起来没有受到任何权限的保护。如何利用这一点,有两个思路:

        伪造广播,看能否有”意外”作用
        伪造广播接收器,实现广播监听或者劫持(虽然从AndroidManifest.xml中来看,com.miui.uac.RESPOND权限可能会成为一个障碍)


(1)伪造广播

   尝试使用am发送一条空广播:
   $ adb shell am broadcast -a com.miui.uac.REQUEST
   授权管理app崩溃了。
   查看log发现广播接收器中的数据库查询语句出了问题,应该是缺少参数导致的。看来伪造广播并发送是可行的,但是在此之前,要找到合适的广播参数,让授权管理app不会崩溃。使用baksmali反编译Superuser.apk查看com/miui/uac/SuRequestReceiver.smali的代码:

[html]  view plain copy
  1. <span style="font-size:12px;">.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V  
  2.     const/4 v2, 0x0  
  3.     const-string v0, "caller_uid" #从intent中得到caller_uid  
  4.     invoke-virtual {p2, v0, v2}, Landroid/content/Intent;->getIntExtra(Ljava/lang/String;I)I  
  5.     move-result v0  
  6.   
  7.     const-string v1, "desired_uid" #从intent中得到desired_uid  
  8.     invoke-virtual {p2, v1, v2}, Landroid/content/Intent;->getIntExtra(Ljava/lang/String;I)I  
  9.     move-result v1  
  10.   
  11.     const-string v2, "desired_cmd" #从intent中得到desired_cmd  
  12.     invoke-virtual {p2, v2}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;  
  13.     move-result-object v2  
  14.   
  15.     const-string v3, "socket" #从intent中得到socket  
  16.     invoke-virtual {p2, v3}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;  
  17.     move-result-object v3  
  18.   
  19.     # 从数据库中查询当前app权限配置  
  20.     new-instance v4, Lcom/miui/uac/DBHelper;  
  21.     invoke-direct {v4, p1}, Lcom/miui/uac/DBHelper;->(Landroid/content/Context;)V  
  22.     invoke-virtual {v4, v0, v1, v2}, Lcom/miui/uac/DBHelper;->checkApp(IILjava/lang/String;)Lcom/miui/uac/AppDetails;  
  23.     move-result-object v0  
  24.     invoke-virtual {v0}, Lcom/miui/uac/AppDetails;->getAllow()I  
  25.     move-result v1  
  26.   
  27.     const/4 v2, -0x1  
  28.     if-ne v1, v2, :cond_3f  
  29.   
  30.     # 弹框提示用户允许/拒绝当前app提权  
  31.     new-instance v0, Landroid/content/Intent;  
  32.     const-class v1, Lcom/miui/uac/SuRequest;  
  33.     invoke-direct {v0, p1, v1}, Landroid/content/Intent;->(Landroid/content/Context;Ljava/lang/Class;)V  
  34.     invoke-virtual {v0, p2}, Landroid/content/Intent;->putExtras(Landroid/content/Intent;)Landroid/content/Intent;  
  35.     const/high16 v1, 0x1000  
  36.     invoke-virtual {v0, v1}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;  
  37.     invoke-virtual {p1, v0}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V  
  38.   
  39.     :goto_3b  
  40.     invoke-virtual {v4}, Lcom/miui/uac/DBHelper;->close()V  
  41.     return-void  
  42.   
  43.     :cond_3f  
  44.     # 返回结果给su  
  45.     invoke-static {p1, v0, v3}, Lcom/miui/uac/ResponseHelper;->sendResult(Landroid/content/Context;Lcom/miui/uac/AppDetails;Ljava/lang/String;)V  
  46.     goto :goto_3b  
  47. .end method</span>  
    根据smali代码,可以看到intent传递过来的广播参数一共有四个,key分别为caller_uid, desired_uid, desired_cmd, socket,值依次存储在寄存器v0~v3中。DBHelper进行数据库操作时,并没有涉及到寄存器v3,因此,只要在构造的广播中加入前三个参数,也就是caller_uid, desired_uid, desired_cmd即可。
caller_uid, desired_uid很容易明白, 但是desired_cmd是什么形式的就难以琢磨了。不过既然在数据库操作中把desired_cmd传递过去了,先看看数据库中有没有相关信息。

在/data/data/com.miui.uac/databases中有一个数据库文件permissions.sqlite,其中有三个表:

[html]  view plain copy
  1. <span style="font-size:12px;"># pwd  
  2. /datadata/com.miui.uac/databases  
  3. # ls -l  
  4. -rw-rw----    1 app_32   app_32      288768 Jan 21 17:01 permissions.sqlite  
  5. # sqlite3 permissions.sqlite  
  6. sqlite> .tables  
  7. android_metadata  apps              logs              prefs             
  8. sqlite> .schema apps   
  9. CREATE TABLE apps (_id INTEGER, uid INTEGER, package TEXT, name TEXT,   
  10.     exec_uid INTEGER, exec_cmd TEXT, allow INTEGER, PRIMARY KEY (_id),   
  11.     UNIQUE (uid,exec_uid,exec_cmd));  
  12. sqlite> select * from apps;  
  13. 1|10058|jackpal.androidterm|终端模拟器|0|/system/bin/sh|1</span>  

结合apps表的schema和其中的内容,exec_uid对应前面提到的desired_uid,exec_cmd对应前面提到的desired_cmd。因此,把desired_cmd设置为”/system/bin/sh”就行了。(后来发现,只要不是空字符串就行……)构造以下广播:

[html]  view plain copy
  1. <span style="font-size:12px;">$ adb shell am broadcast -a com.miui.uac.REQUEST \  
  2. > --ei caller_uid 10051  --ei desired_uid 0 --es desired_cmd "/system/bin/sh"</span>  

被成功接收,并且授权管理app弹出对话框提示用户进行授权。
使用代码实现的话也比较简单:

[html]  view plain copy
  1. <span style="font-size:12px;">        Intent it = new Intent();  
  2.         it.setAction("com.miui.uac.REQUEST");  
  3. //      ComponentName c = new ComponentName("com.miui.uac", "com.miui.uac.SuRequestReceiver");  
  4. //      it.setComponent(c);  
  5.         it.putExtra("caller_uid", 10051);  
  6.         it.putExtra("desired_uid", 0);  
  7.         it.putExtra("desired_cmd", "/system/bin/sh");  
  8.            
  9.         getApplicationContext().sendBroadcast(it);</span>  
   (2)伪造广播接收器

         自己写一个app注册广播接收器net.yurushao.uactest.FakeSuRequestReceiver:


[html]  view plain copy
  1. <span style="font-size:12px;"><receiver android:name=".FakeSuRequestReceiver" >  
  2.     <intent-filter>  
  3.         <action android:name="com.miui.uac.REQUEST" />  
  4.     </intent-filter>  
  5. </receiver></span>  

[html]  view plain copy
  1. <span style="font-size:12px;">public class FakeSuRequestReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context arg0, Intent arg1) {  
  4.         // TODO Auto-generated method stub        
  5.         System.out.println(arg1.getAction());     
  6.     }  
  7. }</span>  

选取某个正常app进行提权时,FakeSuRequestReceiver没有任何反应。查看log发现:

Permission Denial: receiving Intent { act=com.miui.uac.REQUEST (has extras) } 
to net.yurushao.uactest requires com.miui.uac.RESPOND due to sender null (uid 0)
没有com.miui.uac.RESPOND权限,而这个权限是受签名保护的,因此对su发出广播的监听和劫持都是无法实现。

三、 总结

   su发送 的广播可以被伪造,但是不可以被监听或者劫持。至于对广播的伪造,除了能引起授权管理app的崩溃,还没有发现可以被利用的地方。

这篇关于MIUI的root权限管理分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863845

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动