前言

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

最小化特权准则概念介绍

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

违反最小化特权的危害

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

  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博客文章一键转载插件

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

  1. 浅谈漏洞修复的方法论

    序言 大人,时代变了 面临的场景不同 技术的不同 应该怎么做 战略 组织 技术 策略 未来的发展 是否是创业的方向 序言 近日在看到安全牛发布的<漏洞管理的八大趋势>,其中提到了" ...

  2. Android常见漏洞

    Android常见漏洞 漏洞名称: Log敏感信息泄露 漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露 修改建议: 建议禁止隐私信息的log 漏洞名称: web https校验错误忽略漏洞 漏 ...

  3. Php如何过360拦截,PHP常见漏洞修复文件-360漏洞修复插件

    主要对常见的漏洞进行拦截,如:SQL注入漏洞.检测POST数据.XSS漏洞防护等,效果非常不错,值得拥有. 1.下载:360漏洞修复插件 2.解压后,上传整个文件夹至服务器根目录 3.if(is_fi ...

  4. python框架漏洞_注意!Python中的10个常见安全漏洞及修复方法

    编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 ...

  5. 这些常见的漏洞和修复方法你知道吗?

    1.SQL注入 描述:Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏了原有SQL语句逻辑,攻击者可以利用这个漏洞执行任意SQL语句. 修复方法: 代码层最佳 ...

  6. python 不安全的包或方法_Python中的10个常见安全漏洞及修复方法

    写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 ...

  7. python中常见的漏洞_Python常见安全漏洞及修复方法集合!你所不会的这里都有!...

    [51CTO技术沙龙]10月27日,让我们共同探索AI场景化应用实现之道 --> 概述 编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考 ...

  8. Python中的10个常见安全漏洞及修复方法

    Python中的10个常见安全漏洞及修复方法 写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在 ...

  9. python中常见的漏洞_注意!Python中的10个常见安全漏洞及修复方法

    原标题:注意!Python中的10个常见安全漏洞及修复方法 源 /Python程序员 编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避 ...

最新文章

  1. 也许,这是东半球最叼的Java内存模型
  2. 弱口令的分析和爆破工具使用
  3. java内部类为什么会持有外部类的引用_java中内部类为什么会持有外部类的引用?...
  4. linux ctime 时间戳,Linux时间戳atime ctime mtime区别及相关命令
  5. ROS2学习(七).ROS概念 - ROS客户端库(Ros Client Library)
  6. php反射机制与依赖注入,利用反射机制实现基本的依赖注入
  7. 微信群怎么设置验证加入_怎么让微信群裂变拉人/拉人进群奖励方案/微信裂变营销方案策划...
  8. python将一个文件夹下图片到另外一个文件夹下
  9. Leetcode每日一题:148.sort-list(链表排序)
  10. 洛谷 P1137 旅行计划
  11. 试论《华严经》来历的可信
  12. 动态载入.ascx用户控件
  13. keil的终极配色方案(提供配置文件)
  14. 分组交换(Packet Switching)和线路交换(Circuit Switching)
  15. 无线AP人员定位实现调研以及方案编写
  16. 读书有益——》小朋友的诗(一)
  17. mysql条件计数_Mysql按条件计数多种实现方法详解
  18. 怎么调整图片的尺寸大小?
  19. 【数据库】HIVE SQL实现本月一号、月底的提取
  20. FPGA Verilog HDL 系列实例--------顺序脉冲发生器

热门文章

  1. perl对文件和目录进行操作
  2. 发布nuget包的正确姿势---cicd自动打包发布
  3. CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发
  4. 06Prism WPF 入门实战 - Log控件库
  5. .NET 6 预览版 7 Released
  6. Build 2021 :正式发布.NET 6 Preview4
  7. .netcore 极速接入第三方登录
  8. 再分享 5 个 vs 调试技巧
  9. 链路追踪在ERP系统中的应用实践
  10. ASP.NET Core 借助 Helm 部署应用至 K8S