怎样的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后,并进行重新签名发布,这会导致包的完整性被破坏,那么如果有包完整性校验,校验包被破坏了就进行检验并做对应闪退效果。