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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 应用安全 -> 正文阅读

[移动开发]Android 应用安全


一、客户端程序安全

安装包签名

Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!(宣布所有权)

Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。

这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

应用完整性校验

漏洞危害:损害开发者的知识产权,同时可能威胁到用户的敏感信息及财产安全。

解决:防止签名串改(加固)

反编译保护

做加壳处理、加固处理

调试安全

在Android中的AndroidManifest.xml文件中有一项是debuggable属性,意为“可调试”,有true和false两种模式。

默认情况下我们都是需要设置的,如果打包的是debug版本的apk文件,那么这个debuggable属性就自动设置为true,反之,如果打包的是release版本的apk文件,那么这个debuggable属性就自动设置为false。

扩展:
debuggable据说可以通过root来修改。

任意备份风险

漏洞危害
一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装的同一个应用来查看聊天记录等信息,造成信息泄露和财产损失。

解决:
AndroidManifest.xml中的 allowBackup 设置成false。

allowBackup :
Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中AndroidManifest.xml文件中的allowBackup属性值[1] ,其属性值默认是true。
当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。

屏幕截屏安全漏洞

漏洞危害 用户某些隐私内容会暴露给攻击者。

解决:
在BaseActivity内添加

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

注意时机需要在setContentView(R.layout.activity_main)之前。

二、数据安全

shared_prefs

shared_prefs 的数据是明文存在xml文件中,不安全,需要加密

直接用MMKV替代即可。

数据库

需要把关键信息加密处理

内存缓存

使用内存缓存,可一定的保证数据安全

使用内存缓存文件:

File outputDir = this.getCacheDir();
File outputFile = File.createTempFile("prefix", "extension", outputDir);

加密工具

加解密(Cipher)

三、通信安全

网络通信安全

通讯协议安全

使用HTTPS就OK

证书安全

用的是预埋证书的话,存在安全隐患。

证书有效性

用SSL pinning(证书锁定)技术,验证服务器证书的有效性,避免风险。

蓝牙通信安全

三、组件安全

四大组件的安全和暴露

什么情景下,调用startActivity可以启动

为了知道了解安全和暴露,首先要知道什么情景下,调用startActivity可以启动。

如下,可以成功startActivity而不会得到permission denial :

1、同一个application下

2、Uid相同

3、permission匹配

4、目标Activity的属性Android:exported=”true”

5、目标Activity具有相应的IntentFilter,存在Action动作或其他过滤器并且没有设置exported=false

6、启动者的Pid是一个System Server的Pid

7、启动者的Uid是一个System Uid(Android规定android.system.uid=1000,具有该Uid的application,我们称之为获得Root权限)

如果上述调节,满足一条,一般即可(与其他几条不发生强制设置冲突),否则,将会得到Permission Denial的Exception而导致Force Close。

接下来,介绍相关参数。

android:exported

意义:
android:exported 是描述四大组件的参数,表示当前组件能否被其他应用程序的组件调用或与之交互。

值的含义:
当android:exported 为true,表示可以和其他应用程序的组件发生调用和交互。
当android:exported 为false,表示只能当前应用程序组件或者带有相同的用户ID(shareUserId)的应用程序调用和交互。非必要的情况下,需要设置值为false。这样才能保证安全。

android:exported的默认值:

1.主动设置(显示设置)
这种情况下,不管这个activity有没有设置intent-filter,那么exported的值就是显式设置的值

2.被动设置(隐式设置)
如果没有设置exported属性,那么exported属性取决于这个activity是否有intent-filter

2.1.没有设置 intent-filter 的场景:

        <activity
            android:name=".business.vehicle..CtrActivity"/>

当没有为四大组件设置 intent-filter ,android:exported 的值是默认false。

2.2.设置了 intent-filter 的场景:

        <service
            android:name="com.alibaba.sdk.android.push.MsgService">
            <intent-filter>
                <action android:name="com.alibaba.sdk.android.push.NOTIFY_ACTION" />
            </intent-filter>
        </service>

如上,设置 intent-filter,这个时候,android:exported 的值是默认true。

2.3.Content Provider 区别于其他三个组件

Content Provider 区别于其他三个组件,它没有 intent-filter 属性,它的隐式默认值是和Sdk版本有关。
Android sdk版本大于16:默认false
Android sdk版本小于等于16 :默认true

android sharedUserId

介绍:
Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。

通常,不同的APK会具有不同的userId,因此运行时属于不同的进程中,而不同进程中的资源是不共享的,在保障了程序运行的稳定。然后在有些时候,我们自己开发了多个APK并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的。

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样。

使用:

在需要共享资源的项目的每个AndroidMainfest.xml中添加shareuserId的标签。

android:sharedUserId=“com.example”

id名自由设置,但必须保证每个项目都使用了相同的sharedUserId。一个mainfest只能有一个Shareuserid标签。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.shareusertesta"
    android:versionCode="1"
    android:versionName="1.0" 
    android:sharedUserId="com.example">

sharedUserId功能强大,使用sharedUserId后,基本上可以认为是一个App。

android:permission

意义:
四大组件启动的时候都会检查permission是否匹配,如果不匹配,是不是启动的。所以通过permission可以保护需要暴露的四大组件的安全。

使用:

Android提供了Permission检查机制来控制了一个应用拥有哪些执行权利,例如应用拥有读写存储权限才能拥有读写设备存储的文件的权利,那么是否能通过权限来控制一个应用是否有启动该activity的权利呢?答案显而易见。

Android提供了自定义权限的能力,应用可以定义自己的权限,如下方式展示了如何在Manifest自定义一个Permission:

<permission
        android:name="com.myself.permission.WEB"
        android:protectionLevel="signature"
        android:label="permission for opening Web activity"
        />
/**
 * 这里主要介绍三个permission标签下的属性配置:
 * name:该权限的名称,使用该权限时通过名称来指定使用的权限
 * protectionLevel:该权限受保护的等级,很重要,主要介绍三个
 *   ————signature:签名级别权限,即权限的定义方和注册方必须具有相同的签名才有效
 *   ————system:系统级别权限,即权限的定义方和注册方必须为系统应用
 *   ————signatureOrSystem :同签名或系统应用,上述二者具备其一即可
 * label:一般是权限的描述
*/

那么权限的定义完成了,如何使用它来保护暴露的组件呢,如下所示:

<permission android:name="com.myself.permission.WEB"
			android:protectionLevel="signature"/>
<activity
    android:permission="com.myself.permission.WEB"
    android:name="com.test1.WebActivity">
    <intent-filter>
        <action android:name="com.test1.action.VIEW_URL"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>



如上,在activity声明时,activity标签下有一个permission,通过permission的name就能指定保护该activity的权限,这样,只有具有了该权限的activity才能启动它,注意在定义方和使用方都要定义和声明自定义的权限。

根据场景控制四大组件的安全和暴露

根据被调用的场景,将被调用的场景分为3种:封闭式、半封闭式和开放式

封闭式

只要android:exported=“false”,就是封闭式

<activity
            android:name=".SecondActivity"
            android:label="@string/app_name" /><activity
            android:name=".SecondActivity"
            android:label="@string/app_name" 
            android:exported="false"/><activity
            android:name=".SecondActivity"
            android:label="@string/app_name" 
            android:exported="false">
            <intent-filter>
            ...

半封闭式

使用android:sharedUserId ,满足合作需求

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.shareusertesta"
    android:versionCode="1"
    android:versionName="1.0" 
    android:sharedUserId="com.example">

<activity
            android:name=".SecondActivity"
            android:label="@string/app_name" />

使用android:permission ,满足多方合作需求

... 定义权限

<activity
    android:permission="com.myself.permission.WEB"
            android:name=".SecondActivity"
            android:label="@string/app_name" />

封闭式和半封闭式都可以认为是安全的。

开放式

可以被任何App调用

WebView组件安全和暴露

参考和转载地址

Android中allowBackup属性的含义和危险性实例讲解 : https://blog.csdn.net/qq_31387043/article/details/51452782

Android sharedUserId 使用:https://www.cnblogs.com/w-y-f/p/4019388.html

Android中startActivity中的permission检测与UID机制:https://blog.csdn.net/zjd934784273/article/details/83349097

Android暴露组件——被忽略的组件安全:https://blog.csdn.net/wsq_tomato/article/details/83349812

结合源码谈谈Activity的exported属性:https://blog.csdn.net/weixin_38503885/article/details/80653809

浅谈Android安全:https://www.jianshu.com/p/fe0206f8be5b

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:12:28  更:2021-09-27 14:14:44 
 
开发: 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 20:39:24-

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