当前位置: 首页 > news >正文

[免费专栏] Android安全之检测APK中调试代码是否暴露敏感信息


欢迎新同学的光临
… …
人若无名,便可专心练剑


我不是一条咸鱼,而是一条死鱼啊!


Android安全付费专栏长期更新,本篇最新内容请前往:

  • [车联网安全自学篇] Android安全之检测APK中调试代码是否暴露敏感信息

0x01 前言

1.1StrictMode

StrictMode是Android开发过程中一个必不可缺的性能检测工具,它能帮助开发者检测出APK中一些不合理的代码块

Android 2.3提供一个称为严苛模式(StrictMode)的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益

  • StrictMode是什么?
    • StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具
    • 最常用的场景就是检测主线程中本地磁盘和网络读写等耗时的操作
    • StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。我们可以强制用警告代替崩溃(crash),也可以仅将警告计入日志,让你的应用继续执行
    • 严格模式会将应用的违例细节暴露给开发者方便优化与改善

StrictMode 检查策略的函数:

  • 线程策略(TreadPolicy)
    • 自定义的耗时调用:使用detectCustomSlowCalls()开启
    • 磁盘读取操作:使用detectDiskReads()开启
    • 磁盘写入操作:使用detectDiskWrites()开启
    • 网络操作:使用detectNetwork()开启
  • VM策略(VmPolicy)
    • Activity泄露:使用detectActivityLeaks()开启
    • 未关闭的Closable对象泄露:使用detectLeakedClosableObjects()开启
    • 泄露的Sqlite对象:使用detectLeakedSqlLiteObjects()开启
    • 检测实例数量:使用setClassInstanceLimit()开启

:严格模式需要在debug模式开启,不要在release版本中启用。需要注意严格模式的开启一般情况下会放在Application或者Activity以及其他组件的onCreate方法,那么我们就可以首先去寻找这些关键的地方,优先我们可以去Application的onCreate方法中寻找,因为开发人员为了更好地分析应用中的问题,通常会放在Application的onCreate方法中

1.1.1 第一种实现方式

  • 开启与否只在这里设置true或者false就可以了
public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
}
  • 下面的代码放在Application的onCreate方法中,一般放在最开始的地方

:一般建议在 if 语句中插入带有 DEVELOPER_MODE条件的策略,以及要禁用 StrictMode,且必须禁用发布版构建的 DEVELOPER_MODE

if (BuildConfig.DEBUG) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
                    .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
                    .build());
        }

上面说的StrictMode.setThreadPolicyStrictMode.setVmPolicy,解释如下:

private void enabledStrictMode() {
        // 开启Thread策略模式
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() // 构造StrictMode
                .detectNetwork() // 访问网络时输出,这里可以替换为detectAll() 就包括了磁盘读写和网络I/O  
                .detectCustomSlowCalls()// 监测自定义运行缓慢函数
               .detectDiskReads() // 当发生磁盘读操作时输出  
               .detectDiskWrites() // 当发生磁盘写操作时输出  
                .penaltyLog() // 以日志的方式输出
                .penaltyDialog() // 监测到上述状况时弹出对话框
                .build());
        // 开启VM策略模式
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() // 构造StrictMode
                .detectLeakedSqlLiteObjects() // 探测SQLite数据库操作  
                .detectLeakedClosableObjects() // 监测没有关闭IO对象
                .setClassInstanceLimit(MainActivity.class, 1) // 设置某个类的同时处于内存中的实例上限,可以协助检查内存泄露
                .detectActivityLeaks()
                .penaltyLog() // 以日志的方式输出
                .penaltyDeath() // 出现上述情况异常终止
                .build());
    }

1.1.2 第二种实现方式

  • 开启与否:使用AndroidMainifest文件中的debuggable属性来实现
android:debuggable="true"
  • 下面的代码放在Application的onCreate方法中,一般放在最开始的地方
     // Return if this application is not in debug mode 
     ApplicationInfo appInfo = context.getApplicationInfo(); 
     int appFlags = appInfo.flags; 
     if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) { 
       
          StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
                    .build());
          StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
                    .build());
      }

0x02 检测APK中调试代码是否暴露敏感信息

APK Demo:https://github.com/wongkyunban/TimeConsumingViolation

嫌编译麻烦,可用博主同学已编译好的APK:https://download.csdn.net/download/Ananas_Orangey/86505852

  • 使用dex2jar反编译java源码

将StrictMode-debug.apk直接修改后缀,改为StrictMode-debug.zip,并解压解压后的文件夹中,classes.dex 就是java源码打包后的文件

在这里插入图片描述

将命令行定位到dex2jar.bat所在目录
使用命令行:

d2j-dex2jar classes.dex

会生成classes-dex2jar文件,该文件就是反编译后的java源码文件

  • 使用jadx查看反编译后的java源码,为了确定APK是否使用StrictMode,我们接着全局搜索StrictMode.setThreadPolicyStrictMode.setVmPolicy来确认是否有开启Thread策略模式或开启开启VM策略模式

在这里插入图片描述

  • 线程策略的检测方法如下(当然也可以尝试搜索这些关键字):
// 开启Thread策略模式的线程策略
detectNetwork()
detectDiskWrites()
detectDiskReads()
detectCustomSlowCalls()
detectAll()  // 通用Thread策略模式和VM策略模式

// 开启VM策略模式的线程策略
detectActivityLeaks()
detectLeakedClosableObjects()
detectLeakedSqlLiteObjects()
setClassInstanceLimit()

StrictMode VM策略可以监控以下问题:

  • 泄露的 Activity 对象
  • 泄露的 SQLite 对象
  • 泄漏的可关闭对象

泄露的 Activity 对象和泄露的 SQLite 对象就是字面意思,没啥好解释的,泄漏的可关闭对象可以理解为是检查器通过调用 close()或类似方法在最终确定之前监视应该关闭的对象

上面说的三种策略,也有多种不同的方式让我们知道APK何时违反了规则。一旦发现违规可以写入 Logcat 日志存储在 DropBox (android.os.DropBox) 服务或ANR日志中。此外,线程策略违规可能会闪烁屏幕背景或显示对话框(当然此处也可以手动检测就是自行开启Android 设备中的监控下的严格模式)

除了通过日志查看之外,我们也可以在手机的开发者选项中开启严格模式,开启之后,如果主线程中有执行时间长的操作,屏幕则会闪烁,这是一个更加直接的方法

在这里插入图片描述

  • 下面这些是StrictMode违反线程策略的关键字,尤其是以日志的方式输出
penaltyLog() // 以日志的方式输出
penaltyDeath() // 出现上述情况异常终止
penaltyDialog() // 监测到上述状况时弹出对话框
  • 通过日志查看并过滤StrictMode就能得到违例的具体stacktrace信息:
adb logcat | grep StrictMode

在这里插入图片描述

  • 我们应该跟进 StrictMode 生成的大多数警告,但并不是所有该APK产生的StrictMode 警告来判断是否存在敏感信息泄露、能否造成APK应用程序被Doss等漏洞。举个例子,比如在很多情况下,APK在主线程上从磁盘快速读取不会明显阻碍APK应用程序运行或可能开发人员还有其它一些在发布生产版本的APK中存在违规的调试代码

  • 动态分析隐藏APK调试符号方法,比如StrictMode,有如下三种方式(之前我们也涉及的讲过这些内容)

    • Logcat 日志观察StrictMode 关键字
    • 观察应用程序的警告提示弹框,因为违规时可能会弹框提示
    • 应用程序的ANR 崩溃日志信息

配合之前的文章食用更佳:

  • [车联网安全自学篇] Android安全之IPC机制敏感信息挖掘
  • [车联网安全自学篇] Android安全之Log日志敏感信息泄露+自定义URL敏感信息泄露挖掘
  • [车联网安全自学篇] Android安全之本地存储敏感信息挖掘【一】
  • [车联网安全自学篇] Android安全之本地存储敏感信息挖掘【二】
  • [车联网安全自学篇] Android安全之APK备份文件敏感信息挖掘
  • [车联网安全自学篇] Android安全之剪贴板+键盘缓存+UI界面+自动截屏敏感信息挖掘
  • [车联网安全自学篇] Android安全之APK应用程序第三方服务/通知功能的敏感信息挖掘
  • [车联网安全自学篇] Android安全之APK内存敏感信息泄露挖掘【静态分析】
  • [车联网安全自学篇] Android安全之APK内存敏感信息泄露挖掘【动态分析】

参考链接

https://www.cnblogs.com/daemon369/p/3227309.html

https://github.com/OWASP/owasp-mstg/blob/master/Document/0x05i-Testing-Code-Quality-and-Build-Settings.md

https://support.google.com/googleplay/android-developer/answer/9848633?hl=zh-Hans

https://blog.csdn.net/beyond702/article/details/56281068

https://www.jianshu.com/p/271474cd1d91

https://bbs.huaweicloud.com/blogs/307087

https://blog.csdn.net/u011033906/article/details/89926229

https://www.programminghunter.com/article/5661141738/

https://blog.csdn.net/jovifan/article/details/11782019


我自横刀向天笑,去留肝胆两昆仑


相关文章:

  • 一款二次元的Web多人在线网络聊天系统源码
  • docker 安装后的问题 Is the docker daemon running
  • docker 安装完成后测试hello-world出现问题(Unable to find image ‘hello-worldlatest‘ locally)
  • 前端工作小结47-icon图标前置和后置
  • 力扣刷题记录36.1-----144. 二叉树的前序遍历(迭代实现)
  • 实现简易minishell
  • 计算机视觉入门-梯度、算子、Canny边缘检测、非极大值抑制、双门限法
  • Spring之面向切面【进阶版】
  • 打造我的专属中秋节小程序:我的浪漫不是梦~~Spring 全家桶最常用的 7 大类注解
  • 技术实践|如何优雅的使用Delve调试KubeVela代码
  • C# 第二章『基础语法』◆第4节:foreach循环语句
  • LeetCode 刷题系列 -- 17. 电话号码的字母组合
  • 10.synchronized锁升级的过程
  • Vue——数据绑定(面试)--响应式数据、双向数据绑定、过滤器(面试)
  • 链表内指定区间反转
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [译] React v16.8: 含有Hooks的版本
  • 【Linux系统编程】快速查找errno错误码信息
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS实用技巧干货
  • iOS 颜色设置看我就够了
  • js正则,这点儿就够用了
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Rancher-k8s加速安装文档
  • Ruby 2.x 源代码分析:扩展 概述
  • ucore操作系统实验笔记 - 重新理解中断
  • 前端自动化解决方案
  • 物联网链路协议
  • 一个完整Java Web项目背后的密码
  • const的用法,特别是用在函数前面与后面的区别
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #HarmonyOS:基础语法
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)常见O(n^2)排序算法解析
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (JS基础)String 类型
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)socket Aio demo
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net MVC + EF搭建学生管理系统
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net连接MySQL的方法
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [2010-8-30]