IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 移动安全-APP检测ROOT设备的方法 -> 正文阅读

[移动开发]移动安全-APP检测ROOT设备的方法

0x00 前言

这篇文章是讲移动安全中如何检测ROOT设备的,对于开发人员来说,这篇文章可以让你知道如何去检测;对于安全人员来说,知己知彼方能百战百胜。

0x01 Android系统的沙箱

众所周知Android系统是基于Linux内核的,而Linux系统是多用户的,那么问题来了——Android系统为什么不是多用户的?Android系统是为了智能手机而生的,而智能手机作为私人设备,自然不需要支持多物理用户使用了。

?至于Linux的多用户机制则被用到了APP隔离上,即沙箱中。每一个APP应用在Android系统安装的时候就会分配到一个UID,通过它对APP进行隔离,这样不同的APP就会在不同的沙箱中运行,再默认情况下不同的APP之间不能互相访问以及读写文件,这样就实现了互不干扰。

这个UID一般在10000-99999之间,可以在/data/system/packages.xml文件中查看,比如我们要查看包名为com.sy.h5demo的APP,可以看到UID是10176。

进入/data/data/com.sy.h5demo目录下,可以看到文件属性标识的用户名都是u0_a176,与UID相关联。

?当APP要运行的时候,系统会给它创建一个进程,这个进程也是以这个UID来标识的,我们查看h5demo这个APP,果然如此。

说到这里,你可能会疑问那APP之间如何进行交互?

这是个好问题,系统其实早就考虑到了。我们可以通过配置AndroidManifest.xml文件来实现用户ID的共享,进行共享的APP其签名必须一致。所有的Android应用程序都是需要用证书进行签名的,这个签名私钥由开发者自己保存。这个私钥很重要,需要妥善保管,有的开发者直接将私钥当做资源也打包在APP当中,这也真是心大!

看到这里,通过沙箱机制,Android系统似乎挺安全的?的确如此,不过要加一个前提条件,排除root用户。root这个超级玩家在Linux系统拥有最高权限,它可以无视沙箱机制,超越任何用户和用户组来对文件、目录进行读、写、删除。

为了手机的安全,绝对不要轻易刷机!一个恶意的APP如果获得Root权限,那将是灾难性的!所以在资金交易等敏感场景,APP检测设备是否已经Root就显得非常有必要了。

0x02 APP检测Root原理?

通常我们获取root权限,就是通过su命令,它是Linux下切换用户的命令,不带参数就是切换到root用户。

?所以我们可以通过检测这个命令是否存在来判断系统是否已经Root。

1.检测是否存在可执行文件su

// 检测是否存在可执行文件su
public static boolean checkSuFile() {
    final String filePaths[] = {"/system/bin/", "/system/xbin/", "/system/sbin/", "/sbin/", "/vendor/bin/", "/su/bin/"};
    for (int i = 0;i <filePaths.length;i++){
        File f = new File(filePaths[i]+"su");
        if (f != null && f.exists()){
            Log.i(LOG_TAG, "SuFile is exists: " + filePaths[i]);
            return true;
        }
    }
    return false;
}

2.执行which命令查看是否存在su

//执行which命令查看是否存在su
public static boolean checkSuWhich() {
    String[] cmd = new String[]{"/system/xbin/which", "su"};
    ArrayList<String> result = executeCommand(cmd);
    if (result != null) {
        Log.i(LOG_TAG, "SuWhich is exists:" + result.toString());
        return true;
    } else {
        return false;
    }
}

3. 检测环境变量PATH上是否存在su

//检测环境变量PATH上是否存在su
public static boolean checkSuPath() {
    String[] paths = System.getenv("PATH").split(":");
    for (String path:paths){
        if (new File(path,"su").exists()){
            return true;
        }
    }
    return false;
}

以上三种检测方法就是最常用的三种,那我到底用哪种呢?当然是全要啊!

检测效果如下:

一旦我们检测到设备已经Root,可直接结束进程。

?在以上三种方式存在的情况下,我们还可以添加其他的方式来加强检测,如:检测流行的ROOT工具是否存在等;对了查看系统是否为测试版(test-keys)这种方式是无效的,而且有的厂商发布的就是test-keys。

0x03 End

但是很遗憾的说,恶意用户通过Hook、反编译等技术可以轻松绕过以上检测,这就是说Root检测只是很小的一步,要做好移动安全,我们还有很长的路需要走!

============联系我============

云野专注于网络安全行业技术分享,主要包括渗透测试、代码审计、红蓝对抗、安全合规、应急响应、数据安全、安全架构、安全开发等内容。

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:23:14  更:2021-09-13 09:24:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:30:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码