怎样的APP是安全的呢?
只要攻击者所花费的时间成本和精力超过其攻击逆向破解后获取到的收益,那么你的APP就相对安全。
对于个人开发者或者某些小企业开发者而言,APP安全的始终是一件让人非常头疼的事情。下面我以安全开发角度出发,进行梳理了一个APP需要关注的APP安全的问题(没有绝对的安全)。
主要分为四个方向分别为: 应用安全、组件安全、运行时安全、通信安全。
应用安全
在开发APP过程中,不安全的代码编写方式和没有周全考虑到相应的安全性,从而给开发的APP带来一定的安全风险,那么应用安全这个最重要的安全需要关注哪些方面?
应用安全主需要关注:二进制安全、敏感数据安全、敏感资源安全、完整性安全、证书存储安全。这五个方面处理的好会一定程度提高APP安全性,下面就对这五方面进行做个详细分析。
二进制安全
1. 环境检测
环境检测主要关注点: 模拟器检测、root检测。
目前主流的模拟器:夜神模拟器、雷电模拟器、逍遥模拟器、mumu模拟器、腾讯手游模拟器。
对模拟器实现原理:一种基于Qemu,一种基于Genymotion(VirtualBox)
模拟器的检测主要方式:模拟器的特有文件、模块、特征,代理类等等。
root:获取手机超级管理员权限,android系统是基于linux内核,默认情况下并不提供超级管理员权限,所有获取su的权限就是所谓root。
检测root的方式:特有刷root工具的包名称、特有root的文件路径。
2. 反注入检测
目前主要的注入: zygote属于全局注入(xposed工具)、ptrace单进程注入(frida工具)。
注入的检测方式(只是检测规则一小部分):
- 检测APP自身的/proc/%d/maps模块是否有第三方so模块,
2. 优先把自身ptrace,那么就其他就无法注入。
下图是个简单的ptrace反注入方式。
3. 反调试检测
目前调试工具: jeb、IDA、GDB等调试工具进行调试分析代码和数据。
反调试方式(检测规则一小部分):
- 检测/proc/%d/status和/proc/pid/stat 和 /proc/pid/task/pid/stat状态值。
2.检测调速器端口和名称和通信的关键文件信息。
下图是个简单的tracePid检测实现
4. 代理检测
目前app应用面临的严峻问题之一:数据被抓包分析。
App目前的抓包流程以charles抓包工具为例(http和socket)(https需要安装SSL证书): 电脑端上charles工具上进行设置代理端口,模拟器或者手机环境,安装charles证书,设置代理模式,设置电脑端的ip和代理的端口。
对APP抓包问题可以检测校验抓包所需要安装的证书信息。
敏感数据安全
1. 代码中敏感URL
直接将访问的网址或访问的IP地址硬编码写到代码中,那么攻击者可以通过反编译app进行静态分析(jeb,jadx,IDA),搜索URL或IP相关的信息,那么这些URL或IP信息就会成为攻击者的一个利用目标。
2. APP中敏感数据
在APP的代码或配置文件中,存储着敏感而且没有进行做加密保护的数据。
攻击者攻击方式有两种
1.利用apktool反编译APP应用,并进行查看二进制代码数据就能直观的看到敏感的操作调用敏感数据。
2.通过代理模式进行抓包就可以直接抓到APP运行中的操作的敏感数据。
3. 通用加密算法参数
代码中往往会出现一些保护敏感信息的常量字符串,例如在代码中硬编码AES加密的key、iv等,或者用户的VPN密码等等。
敏感资源安全
APP中的一些关键资源文件没有进行加密保护,攻击者可以从APP中提取关键的资源文件,进行二次使用或从资源文件中获取本地业务逻辑代码,从而对APP发起攻击。例如对APP进行关键逻辑篡改,植入恶意代码,网络协议分析等等。
完整性校验
APP开发者如果没有对开发的APP进行做完整性校验的话,那么攻击者用androidkiller工具进行对APP功能的逆向修改,例如对app植入恶意代码,木马、广告等等,那么这些修改APP后,并进行重新签名发布,这会导致包的完整性被破坏,那么如果有包完整性校验,校验包被破坏了就进行检验并做对应闪退效果。
证书存储风险
APP中使用的数字证书可被用来校验服务器的合法身份,以及在于服务器进行做通信的过程中对传输数据进行加解密的运算,保证传输数据的保密性,完整性。
明文存储的数字证书如果被篡改,APP客户端可能会连接到攻击者的服务器上,导致APP的敏感信息被盗取。如果明文证书被盗取,可能会造成传输数据被拦截解密,伪造第三方的APP客户端向服务器进行发送请求,篡改服务器中的关键数据或者造成服务器响应异常。
组件安全
什么是组件?
Android是以组件为单位进行权限声明和生命周期管理。
组件的作用是什么?
Android系统共有四大组件:活动组件、服务组件、广播组件、内容组件。
Activity(活动组件):用于展示用户交互的界面,它是最常见的组件。
Service(服务组件):用于后台运行服务不提供界面展示,常见于监控类应用。
Content Provider(内容组件): 不同的APP应用进行数据共享,比如通讯录数据,图片数据。
Broadcast Receiver(广播组件): 用于注册特定的事件,并在其发生时被激活。
组件安全方面:需要关注四大组件以及第三方sdk中的组件安全。如果组件暴露会影响到APP应用的逻辑核心和泄露用户敏感信息,这个是很严重安全问题,攻击者只要通过组件利用的方式就可以获取到关键信息,那么就会导致关键信息被泄露的风险。所以在APP应用中如果非必要的组件不要进行导出,在AndroidManifest.xml文件中, 设置组件的exported属性为false,如果组件一定要提供给外部进行调用的话,可以对组件的权限进行控制。
运行时安全
日志输出
开发人员在开发调试APP过程中, 会进行做一些日志的输出,日志信息往往会记录着一些敏感信息如:用户名、密码、函数调用栈信息、Token、Cookies、网络请求IP或URL等等,在发布的APP过程中往往会漏掉或者忘记将日志输出的信息进行删除。那么只要用monitor工具就可以分成APP运行的敏感日志信息。这就给APP的安全带来一定的威胁,攻击者通过分析日志信息就可以作为攻击的入口点。
数据存储
APP运行时候会进行记录或存储一些敏感信息:个人隐私、登录信息、本地验证码、聊天记录等等。
Android主要有五种数据存储方式: 1.文件存储、2.SharedPreferences轻量级存储、3.SQLite数据库存储、4.ContentProvider数据共享、5.网络存储。
从下图的截图中,某个APP沙盒目录下的数据存储目录shared_prefs(SharedPreferences实现),该目录主要记录存储一些一些数据量较小的信息。存储的信息直接可以用MT管理工具或者直接用adb复制传输到外部电脑主机上,再通过可视化工具进行打开查看文件,会造成配置信息或敏感的账号信息泄露。
配置文件中获取运行环境的IMEI值
所以对于运行时的读写操作本地数据存储,在本地操作关键敏感信息,进行用一些加密算法进行做保护,以此提高APP运行时数据存储的安全性。
通信安全
在APP通信过程中数据传输协议以及字段数据保护。
以下通过charles抓某个APP包的检测更新功能性数据包,可以看到抓包的数据看到具体通信的功能,攻击者可以通过对这些包进行分析伪造假的数据包等进行做影响APP安全的事情。
建议在通信传输功能可以采用SSL协议进行传输,并在客户端和服务端证书信息和关键数据加密和进行校验。加密过程中尽量避免使用CBC模式。