[转]Android 常见安全漏洞修复理论与实践

前言

前段时间公司对应用在爱加密上进行了安全扫描,本文将基于爱加密的漏洞分析报告,针对部分内容,介绍理论修复实践

最小化特权准则概念介绍

最小化特权准则,即指组件只能供自身应用调用,尽可能禁止其他应用访问及调用。

违反最小化特权的危害

若组件违反最小化特权准则,则会带来如下危害:

  1. 攻击者恶意调用应用的 Activity, 修改程序的状态或关键数据。举个例子,如果您的应用的应用需要人脸认证才可以登录,一般需要保存一个人脸认证状态,如果攻击者修改了人脸状态,改为已认证通过,则可以直接进入应用主页。

  2. 通过调用 Activity 内部的方法,可获取私密数据,甚至造成拒绝服务和应用崩溃。例如,如果您的登录 Activity 违反了最小化特权准则,攻击装者可通过反射,来调用您的 Activity 有一个私有方法,用来获取账号和密码。

解决方案

  1. 设置 Activity 组件 android:exported = false
  2. 必须 exported 的 Activity 组件必须仅限于授权用户或者特定组件调用
  3. 谨慎使用 intent-filter 属性,若必须使用,则需强制设置 android:exported = false

这里涉及几个概念,简要介绍一下:

1. android:exported

适用于 Android 四大组件,其作用是控制其他应用程序是否可以与当前组件交互。其中 true 为可以与之交互。若设置为 false ,意味着对于 Service 组件,只有相同应用程序的组件或相同用户 ID 的程序才能启动或绑定该服务。值得注意的是,如果该组件在 AndroidManifest 中声明了 intent-filter , 该组件的 exported 属性将自动设置为 true。若没有声明,则默认为 false.

2. 用户 ID (UID)

对于 Android 应用,每个应用程序都有一个 UID, 默认情况下,Android 系统会为每一个分配一个互不相同的 UID. 如果两个应用的 UID 不同,则不能相互调用。若希望相互调用,可进行如下操作:

  1. 设置 android:sharedUserId 属性,该属性的作用是将一个或多个应用程序共享同一个 UID。具体代码如下所示:
  2. 两个应用需使用相同的签名文件进行签名
// 应用一<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="test.anna.hello"android:sharedUserId="anna.uid">
// 应用二<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="test.anna.hello2"android:sharedUserId="anna.uid">

 

3. 自定义安全权限

该标签用于在 AndroidManifest 中声明一个安全权限,可用于此应用程序的特定组件或功能的访问。例如一个发送广播的业务,APK1 用于接收广播,APK2 用于发送广播,APK1 此时仅想接收声明了对应权限的应用发送的广播。此时需要在 APK1 通过 定义安全权限, 在 APK2 通过 申请 APK1 定义的安全权限即可。 定义格式如下:

<permissionandroid:description="string resource"android:icon="drawable resource"android:label="string resource"android:name="string"android:permissionGroup="string"android:protectionLevel=["normal" | "dangerous" |"signature" | "signatureOrSystem"] /> 

 

  • android:description 用于描述该权限所针对的操作及用户授予这个权限的后果
  • android:label 用于描述该权限
  • android:name 用于唯一标识权限
  • android:permissionGroup 用于标识该权限所属权限组的名称
  • android:protectionLevel 用于标识该权限的等级,可控制权限的授予方式,normal 表示声明后自动获取,signature 表示定义权限的 APK 和声明权限的 APK 必须使用同一签名文件,才可获取权限。

Activity 最小化特权漏洞修复

案例详解 1

在本例中,IncomingDialog 为会议振铃和外呼界面。由于 IncomingDialog 设置了 标签 导致了android:exported = true, 因此,强制设置 exported 为 false 即可 修改前:

 

<activityandroid:name="cn.redcdn.incoming.IncomingDialog"android:process=":JMeetingService"android:screenOrientation="portrait"android:configChanges="orientation|screenSize|keyboardHidden"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><intent-filter><action android:name="cn.redcdn.jmeetingsdk.start.incomingactivity" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>


修改后:

<activityandroid:name="cn.redcdn.incoming.IncomingDialog"android:process=":JMeetingService"android:screenOrientation="portrait"android:exported="false"android:configChanges="orientation|screenSize|keyboardHidden"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><intent-filter><action android:name="cn.redcdn.jmeetingsdk.start.incomingactivity" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>

这里简要介绍一下 android:enabled 属性,该属性适用于四大组件,控制该组件是否可以被系统初始化,默认为 true, 如果设置为 false, 对应控件无法初始化,例如无法启动服务。值得注意的是, 标签中也会可以声明该属性,而且该 enabled 与 组件声明都为 true 的情况下组件才可被初始化。修改点同样是将 exported 改为 false

数据越权备份风险

概念

应用数据备份

Android 2.1 系统可为 APP 提供数据的备份与恢复功能,可在 AndroidManifest 标签下声明 android:allowBackup, 属性决定是否禁用该功能,其中 false 标识禁用。值得注意的是该属性默认为 true

违反数据越权备份的危害

攻击者可利用此漏洞攻击任何可以打开 USB 调试的应用非 root 设备。

  1. 通过 adb backup 命令,将制定应用的数据拷贝到外设。一旦该应用数据被备份后,所有的用户在这个应用的SharedPreferencesDB都可被攻击者读取。
  2. 通过 adb restore 命令,可指定某个备份数据,恢复应用的数据

虽然可以对备份后的文件(.ab)进行加密,但是仍有许多工具工具可对其解密,例如: android-backup-extractor, 下面将简单介绍一下 adb backup 的用法

adb backup

adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <档案名称> [需要备份的应用包名]

例如想备份包名为emergency.cicdi.com的数据,可以输入如下代码:

adb backup -nosystem -noapk -f emergency.ab emergency.cicdi.com

该命令会在当前目录下生成名为 emergency.ab 的备份文件。通过 android-backup-extractor ,可得到对应应用的SharedPreferencesDB文件

解决方案

将 app module 下的 AndroidManifest.xml 中设置 android:allowBackup="false" 即可,但是这么处理是不够的,会遇到一个问题,由于我们的项目集成了多个依赖,比如扫码二维码的库,和 IM Library, 依赖中 AndroidManifest 都默认设置 android:allowBackup="true" ,会导致编译时不同 module 合并 AndroidManifest 文件会产生冲突。需要解决冲突,即统一该属性的取值。但是有些 library 是远程依赖,本地项目并不可以编辑代码,而且一个一个修改未免效率较低,因此需要在 app module 下的 AndroidManifest.xml 中声明


<application...tools:replace=" android:icon,theme,allowBackup" >...
这行代码标识 Manifest 合并规则,意味着当合并 library 中的 Manifest 文件到主 App Manifest时,不考虑 library Manifest 中的 allowBackup 取值,以 app 中的 Manifest 为准进行合并。

最后

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

最后针对Android程序员,除了上面的知识体系,我这边给大家整理了一些资料,其中分享内容包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!关注我的主页个人说明有惊喜哦~


---------------------
作者:whale_kyle
来源:CSDN
原文:https://blog.csdn.net/whale_kyle/article/details/92428743
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

 

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

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

相关文章

C语言试题158之从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:从键盘输入一些字符,逐个把…

html5--3.2 input元素(1)

html5--3.2 input元素(1) 学习要点 input元素及其属性input元素 用来设置表单中的内容项&#xff0c;比如输入内容的文本框&#xff0c;按钮等不仅可以布置在表单中&#xff0c;也可以在表单之外的元素使用input元素的属性 type属性&#xff1a;指定输入内容的类型&#xff0c;…

css3 3D

● css3 3D旋转 ○ rotateX() 方法&#xff0c;元素围绕其 X 轴以给定的度数进行旋转 ○ rotateY() 方法&#xff0c;元素围绕其 Y 轴以给定的度数进行旋转 ○ rotateZ(angle)&#xff0c;定义沿 Z 轴的 3D 旋转。 ● 3D景深 ○ perspective(n)&#xff0c;景深&#xff0c;离屏…

我是怎么自学 Git / GitHub 的?

大家好我是鱼皮&#xff0c;Git 和 GitHub 是如今团队协作开发必不可少的技能&#xff0c;且不说程序员&#xff0c;就连很多产品也在学习它们。今天分享一下我自学 Git 和 GitHub 的经验&#xff0c;希望起到一个 导学 的作用&#xff0c;帮助大家抓住重点&#xff0c;节省时间…

[转]Android 代码混淆和加固 so库 简单教你一行代码实现

混淆 因为开启混淆会使编译时间变长&#xff0c;所以debug模式下不开启。我们需要做的是&#xff1a; 1.将release下minifyEnabled的值改为true&#xff0c;打开混淆&#xff1b; 2.buildConfigField 不显示log日志 为什么要混淆&#xff1a; 优化java的字节码减小apk文件的大…

【ArcGIS微课1000例】0004:值提取至点(Extract value to point)

文章目录 问题描述值提取至点工具介绍案例实现过程注意事项问题描述 研究区分布有成千上万个离散的矢量点(根据范围创建随机点),但是点上没有高程值,研究区DEM是有的,那么怎样在ArcGIS中提取每个点对应的高程值? 离散点分布情况: DEM数据(ArcGlobe中三维显示):

C语言试题159之计算字符串中子串出现的次数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:两个字符串连接程序 2 、温馨…

关于Android studio找不到sqlite数据库的解决方法

打开Android Device Monitor,剩下的与Eclipse相同。转载于:https://blog.51cto.com/10237758/1761397

linux ubuntu deepin apache2 rewrite

2019独角兽企业重金招聘Python工程师标准>>> apache php 环境装好了&#xff0c;下载了TP5的项目&#xff0c;然后部署上去之后&#xff0c;端口81&#xff0c;&#xff0c;但是 访问 127.0.0.1:81 正常 127.0.0.1:81/admin&#xff0c;报错 404 Not Found 原因是,…

论DATASNAP远程方法支持自定义对象作参数

论DATASNAP远程方法支持自定义对象作参数 DATASNAP远程方法已经可以支持自定义对象作参数&#xff0c;这是非常方便的功能。 1&#xff09;自定义对象 type TMyInfo class(TObject) public AccountNo: string; SQL: string; Params: string; end; 2&#xff09;远程方法定义 f…

[转]Android-Proguard(代码混淆)

一&#xff1a;混淆是什么&#xff0c;该怎么做&#xff1f; 如果我们的app正常发布就必须要经历混淆这一步&#xff0c;混淆可以使我们的app不那么容易被别人用反编译工具破解&#xff0c;就算被破解&#xff0c;想要读懂我们的源码也是非常费劲的&#xff0c;因为混淆过的源码…

学妹,你要的C语言版AOE网络数据结构来了,就这么简单!

文章目录AOE关键路径编程AOE完整求解程序AOE关键路径编程 不难发现AOE图最大特点是没有回路&#xff0c;并且有向图方向始终是从源点走向汇点&#xff0c;且源点汇点都是一个。 把图1写成邻接矩阵文件&#xff0c;见文件P200G736.TXT&#xff0c;并在此复制G0.C到AOE.C&#x…

C语言试题160之某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交换,第二位和第三位

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:某个公司采用公用电话传递数…

C# 关于状态机的实现(案例版)

大部分的状态机都是有限状态机&#xff0c;某些业务环境&#xff0c;或者其他环境中&#xff0c;如果有状态机其实还是很方便的。比如&#xff0c;我是用在了单个客户的Socket通信上&#xff0c;未连接状态&#xff0c;我就等连接。已连接状态&#xff0c;就等待下一步指令状态…

测试并发应用 (一)监控Lock接口

声明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第八章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 译者&#xff1a;郑玉婷 校对&#xff1a;方腾飞 监控Lock接口 Lock 接口是Java 并发 API提供的最基本的机制来同步代码块。它允许定义临界区。临界…

[There will be more story......]

This blog will keep on updating.转载于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根据生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "双鱼", "白羊", "金牛", "双子"…

[转]Android 项目的代码混淆,Android proguard 使用说明

简介 Java代码是非常容易反编译的。为了很好的保护Java源代码&#xff0c;我们往往会对编译好的class文件进行混淆处理。 ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆&#xff0c;当然它还能对字节码进行缩减体积、优化等&#xff0c;但那些对于我们来说都算是次要…

数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

文章目录邻接矩阵存储图的广度优先遍历过程分析C语言实现队列编程程序中加入图的处理函数结果的再次分析C#语言实现图的广度优先遍历、并显示广度优先遍历生成树JavaScript语言实现图的广度优先遍历、并显示广度优先遍历生成树邻接矩阵存储图的广度优先遍历过程分析 对图1这样…

C语言试题161之求100000以内的自守数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:自守数是…