Android系统原理性问题分析 - 系统 Root 的实现原理

news2024/11/25 4:37:27

声明

  • 在Android系统中经常会遇到一些系统原理性的问题,在此专栏中集中来讨论下。
  • Android低版本时经常听说Root系统,随着Android版本的升高,提Root的人越来越少了。不过我在系统开发时也有客户提出为系统Root的需求,所以在这里分析下Android系统Root的原理。
  • 此篇代码基于LineageOS 14.1(Android 7.1.1),参考一些博客和书籍,不方便逐一列出,仅供学习、知识分享。

1 为何要获取 Root 权限

  不同的人 Root 手机的原因各有不同,而我是因为客户需要安装Xposed框架和一些游戏外挂APP,才需要Root的。

2 获得 Root 权限的原理

由于 Android 采用了 Linux内核,也使用 su 命令切换到 root 权限。不过一般我们使用的手机安装的都是release版的 Android 系统,并没有 su 。不过在 Android 源码中已经包含了专门用于 Android 系统的 su 命令,默认的 root密码为空,所以执行该 su 命令后,根本不需要输入任何密码就可以使当前 Shel 拥有 root 权限。
这样看来,现在已经将提取 Android 手机 Root 权限的问题转换为将 su 可执行文件刷入系统 /system/bin 或 /system/xbin 目录并执行 su 命令的问题。

总结的目前的思路有两种:

  1. 找一个已经有 Root 权限的进程来完成以上步骤:
    思路:通过系统漏洞提升权限到 Root。
    问题:如何找到 Root的漏洞,目前所找到的洞有哪些?
    思路:init 进程启动的服务进程,如 adbd、rild、mtpd、vold等都有 Root权限,找它们的漏洞
  2. 通过系统之外的某些方法植入:
    思路:通过 Recovery 刷机方式刷入 su。
    问题:如何刷入Recovery。

3 通过 su 获取 Root 权限的隐患

  并不是 Android 系统包含了 su 命令,Android 应用的任何操作都可以在 Root 权限下执行。要想在 Root 权限下执行操作,需要使用 Process 对象来执行命令,并在该进程下执行相应的命令。而这些命令将在 Root 权限下执行,当 su 进程结束后,Root 权限也随之消失。下面的代码描述了如何在 Root 权限下执行 Linux 命令:

//实际上,在创建 Process 对象后,就已经执行 su 命令了,如果这段程序未执行完,su 进程就不会退出
Process process = Runtime.getRuntime().exec("su");
Outputstream os = process.getOutputstream();
//指定要执行的命令,所以这些命令都将拥有 Root 权限
os.write("ls /system/app".getBytes());
//执行 flush 方法以便 Process 对象立刻执行 ls 命令
os.flush();
os.close();

  以上代码对用户来说是无感知的,所以如果一个 Android 应用利用 su 执行 Linux 命令,用户是不知道的。执行的这些命令是良性/恶性是不可控的,是个致命的安全隐患。在 Android 系统中的很多操作也和 su 命令类似,有很大的权限,也可能造成危害。
  例如,安装APK 时,系统要求执行这些操作时必须提示用户。(弹出一个安装警告窗口,主要告诉用户该 APK 程序拥有哪些权限,并且由用户确定是否继续安装该 APK。尽管这个安装警告窗口并不能阻止 Android系统受到侵害,但至少可以多一道保险,而且这个警告窗口是由系统负责弹出的,不允许取消也就是不允许静默安装)。

  基于 Android 系统的这些机制,我们希望APP在请求Root权限时会弹出一个警告窗口来通知用户,并允许用户自己决定是否赋予该应用 Root 权限。要实现这种技术,必须修改 su 命令的源代码,而且还需要编写一个 APK 程序来配合 su 命完成这一功能。通常这个 APK 序叫 Superuser.apk (APK程序用于弹出“Root 授权”警告窗口)。不过 su 命令必须和配套的 Superuser.apk 程序一起使用。

4 应用申请 Root 权限

任何一个应用程序都可以调用 su 命令来获取 Root权限,这样对Android 设备来说是相当不安全的。所以,SuperUser 应用就需要完成以下几个工作来保证 Root 后的设备的安全。

  • su 文件是否被替换,保证 su 的安全(替换后的 su文件,估计都动过了手脚 );
  • 建立白名单,只允许白名单中的应用使用 Root权限;
  • 应用程序调用 su 命令时,向用户弹出 Root 申请Dialog;

系统原生的 su 对于所有的应用程序是平等的,所以原生的su 是无法保证 su 的安全的,SuperUser 必须安装自定义的su,以及能够保证自身 su 不被替换的 deamon 进程。应用请求 Root权限的时候,自定义的 su 则会通知 SuperUser。由SuperUser来进行白名单存储和 Root权限授予提示,让用户选择是否给予该应用 Root权限。而su与SuperUser 之间的通信是靠一个阻塞的 Socket 来完成的。
在这里插入图片描述

5 LineageOS 系统为 Root 增加的安全保障

LocalSocket 不同于网络 Socket,后者必须在网络环境中使用,而前者并不需要网络,在使用时会建立一个用于交互数据的设备文件。在传输数据时,会利用该设备文件进行数据交互。对于 su 和 Superuser.apk来说,su是服务端,Superuser.apk 是客户端。当 su 调用 RequestActivity 时,会将用于连接 LocalSocket 服务端的设备文件路径(PATH)传递给 RequestAcitivity(通过am 命令传参),然后 Superuser.apk 利用这个路径建立与 su 的 LocalSocket 连接。su 会利用这个 LocalSocket 连接将调用 su 命令的 Android 应用的信息传递给 Superuser.apk,这些信息就是在Root 授权窗口上看到的 APP 的名称的图标。

su 首次通过 LocalSocket 连接向 Superuser.apk 传递数据时,会将调用 su 命令的 APP 所在的用户 ID 传递给 Superuser.apk,Superuserapk 利用这个 ID 取 Android 应用的 Package,通过 Package 很容易获取 Android 应用的名称和图标。

申请Root 授权的 APP、su 和 Superuser.apk 三者的调用关系如下所示:

APP su Superuser.apk 调用(申请Root授权) 启动LocalSocket服务 显示RequestActivity窗口 建立与su的LocalSocket的连接 通过LocalSocket传递调用者信息(su无法获取调用su的APP的Package,只能通过uid) 通过LocalSocket返回用户的选择 如果用户允许,批准“授权”申请 关闭LocalSocket连接 APP su Superuser.apk

6 LineageOS 系统中 su 源码分析

6.1 su 进行 Root授权流程

6.2 初始化调用者数据

6.3 初始化路径

6.4 动态宏定义

6.5 检测数据库

6.6 创建LocalSocket服务

6.7 显示Root授权窗口

6.8 等待SuperUser连接LocalSocket服务

6.9 向Superuser传输调用者信息

6.10 接收用户选择的Root授权策略

6.11 允许或拒绝Root授权

7 LineageOS 系统中 Superuser 源码分析

7.1 Root授权警告窗口的处理流程

7.2 设置“Root授权”窗口的控件

7.3 获取“Root授权”持续时间

7.4 处理“Root授权”策略

7.5 读取Su协议数据

7.6 获取和设置“调用者”信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【产品经理】用户增长方法论

在做用户增长为核心的产品运营推广前,我们应从几个方面入手——打造核心功能点、转化方式要清晰、用户反馈与转化、传播渠道要合适、建立病毒式传播规则。 2017年,以营销见长的可口可乐公司将设置了24年之久的首席营销官(CMO)撤销…

[Maven高级]->近万字文章带你深入了解Maven

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:JavaEE ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正&…

已经安装高版本CUDA的条件下bitsandbytes发现低版本的CUDA SETUP: Detected CUDA version 100解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Zabbix 配置钉钉报警

如有错误,敬请谅解! 此文章仅为本人学习笔记,仅供参考,如有冒犯,请联系作者删除!! 1. 创建服务群【手机钉钉】|【电脑钉钉】- 右上角【】-【发起群聊】-【选人建群】/选择不同的群类型创建&…

数据库信息速递 甲骨文与微软合作,在Azure上推出数据库服务

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

Linux搭建配置jdk开发环境

因为ZooKeeper、Hadoop和Spark等大数据应用的运行需要Java环境的支持,所以需要我们来安装配置一下jdk环境。 安装步骤如下: 下载JDK 访问Oracle官网下载Linux x64操作系统的JDK安装包jdk-8u161-linux-x64.tar.gz。 上传JDK安装包 通过SecureCRT远程连接…

chatgpt赋能python:Python的数据存储:理解Python的内存管理机制

Python的数据存储:理解Python的内存管理机制 Python是一种高级编程语言,广泛用于开发Web应用程序、机器学习和数据科学等。作为一门动态语言,Python的内存管理机制是其优点之一。这篇文章将探讨Python如何内部存储数据,介绍Pytho…

pytorch ddp 范例

pytorch ddp 范例: ################ ## main.py文件 import argparse from tqdm import tqdm import torch import torchvision import torch.nn as nn import torch.nn.functional as F # 新增: import torch.distributed as dist from torch.nn.paral…

从零开始手搓一个STM32与机智云的小项目——GPIO的输入输出

文章目录 前言GPIO简介GPIO的命名与数量GPIO的功能STM32F1 GPIO的寄存器 库函数开发搭建库函数的工程查看原理图WACK_UP输入按键继电器输出138控制流水灯 代码编写库函数简介GPIO输出模式控制继电器通过138控制ledGPIO实现按键输入的操作编写逻辑代码 实物效果 总结 前言 上一…

Redis学习总结(二)

AOF 为什么是在执行完命令之后记录日志? 关系型数据库(如 MySQL)通常都是执行命令之前记录日志(方便故障恢复),而 Redis AOF 持久化机制是在执行完命令之后再记录日志。AOF 记录日志过程为什么是在执行完命…

如何让GPT不再胡说八道

相信我们大部分人在使用GPT的时候,会发现GPT经常在胡言乱语、回复错误的答案等情况,甚至有的内容牛头不对马嘴,直接开始编造,例如下面案例: 我: 周树人是谁 GPT:周树人 (1897年-1975年) &…

独立开发变现周刊(第90期):自学开发了一个36万美元/年的ChatGPT应用

分享独立开发、产品变现相关内容,每周五发布。 目录 1、ChatGPT-Midjourney: 开源 ChatGPTMidjourney 网页应用2、PLExtension: 一个图床上传浏览器扩展3、EasySpider: 一个可视化爬虫软件4、BibiGPT: 音视频 AI 一键总结 & 对话5、自学的程序员开发了一个36万美…

【i阿极送书——第四期】《ChatGPT时代:ChatGPT全能应用一本通》

系列文章目录 作者:i阿极 作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒…

MongoDB集群和安全

目录 副本集-Replica Sets简介副本集的三个角色副本集架构目标副本集的创建主节点副本节点仲裁节点初始化配置副本集和主节点查看副本集的配置内容查看副本集状态添加副本从节点添加仲裁从节点副本集的数据读写操作 主节点的选举原则完整的连接字符串 分片集群-Sharded Cluster…

spring杂记

1、springboot是如何解析yml配置文件中的 tomcat配置,并将其赋值给 tomcat的 重要类 ServerProperties。该类为解析yml文件中的server配置 下面我们主要看看是怎样将 端口号 port 赋值给tomcat的 找到port属性,点击getter方法 发现调用该方法的地方为 …

在弹出框内三个元素做水平显示

最终效果图要求是这样: js代码: // 显示弹出窗口 function showPopup(node) {var popup document.createElement(div);popup.className popup;var inputContainer1 document.createElement(div);/* inputContainer1.className input-container1; */…

Upscayl:开源AI图像放大增强工具 | AIGC实践

连续写了两篇比较理论的文章——一篇行业思考,一篇技术讨论——可能劝退了很多不明真相的人民群众,一看后台数据,好么…… 马上周末了,今天分享一篇轻松小文,介绍一款开源免费、成熟度高、操作简单、效果显著的开源AI图…

记录--开始使用Vue 3时应避免的10个错误

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Vue 3 稳定已经有一段时间了。许多代码库正在生产中使用它,其他人最终也必须进行迁移。我有机会与它一起工作,并记录了我的错误,这可能是你想避免的。 1.使用响应式…

.Net8罕见的技术:MSIL的机器码简析

前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机里面万物都是二进制,本篇来看下,以下…

【GitHub探索】用python写web前端之reactpy探索

你有想象过用python来写web前端这种操作么?近期在github-trending上就有这样的一个项目reactpy,可以满足你在python上写web前端的欲望。为此,笔者也决定踩踩坑,看看这个项目的形式到底如何,能不能很方便地实际投产。 …