- 一、客户端程序安全
- 安装包签名
- 应用完整性校验
- 反编译保护
- 调试安全
- 任意备份风险
- 屏幕截屏安全漏洞
- 二、数据安全
- shared_prefs
- 数据库
- 内存缓存
- 加密工具
- 三、通信安全
- 网络通信安全
- 蓝牙通信安全
- 三、组件安全
- 四大组件的安全和暴露
- 什么情景下,调用startActivity可以启动
- android:exported
- android sharedUserId
- android:permission
- 根据场景控制四大组件的安全和暴露
- 封闭式
- 半封闭式
- 开放式
- WebView组件安全和暴露
- 参考和转载地址
一、客户端程序安全 安装包签名
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_prefsshared_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 的场景:
当没有为四大组件设置 intent-filter ,android:exported 的值是默认false。
2.2.设置了 intent-filter 的场景:
如上,设置 intent-filter,这个时候,android:exported 的值是默认true。
2.3.Content Provider 区别于其他三个组件
Content Provider 区别于其他三个组件,它没有 intent-filter 属性,它的隐式默认值是和Sdk版本有关。
Android sdk版本大于16:默认false
Android sdk版本小于等于16 :默认true
介绍:
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标签。
sharedUserId功能强大,使用sharedUserId后,基本上可以认为是一个App。
android:permission意义:
四大组件启动的时候都会检查permission是否匹配,如果不匹配,是不是启动的。所以通过permission可以保护需要暴露的四大组件的安全。
使用:
Android提供了Permission检查机制来控制了一个应用拥有哪些执行权利,例如应用拥有读写存储权限才能拥有读写设备存储的文件的权利,那么是否能通过权限来控制一个应用是否有启动该activity的权利呢?答案显而易见。
Android提供了自定义权限的能力,应用可以定义自己的权限,如下方式展示了如何在Manifest自定义一个Permission:
那么权限的定义完成了,如何使用它来保护暴露的组件呢,如下所示:
如上,在activity声明时,activity标签下有一个permission,通过permission的name就能指定保护该activity的权限,这样,只有具有了该权限的activity才能启动它,注意在定义方和使用方都要定义和声明自定义的权限。
根据场景控制四大组件的安全和暴露根据被调用的场景,将被调用的场景分为3种:封闭式、半封闭式和开放式
封闭式只要android:exported=“false”,就是封闭式
半封闭式或 或 ...
使用android:sharedUserId ,满足合作需求
使用android:permission ,满足多方合作需求
... 定义权限
封闭式和半封闭式都可以认为是安全的。
开放式可以被任何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



