APK文件是安卓工程打包的最终形式,将apk安装到手机或者模拟器上就可以使用APP。反编译apk则是将该安卓工程的源码、资源文件等内容破解出来进行分析。
攻击者通过反编译可获取应用安卓客户端应用的源代码,攻击者可根据源代码获取对应接口信息,加密算法、密钥,以及一些硬编码在代码中的其他敏感信息,从而进行进一步攻击。
Android系统要求安装的应用必须用数字证书进行签名后才能安装,并且签名证书的私钥由应用开发者保存。签名证书的生成也由开发者自己生成。在应用安装时会校验包名(package name)和签名,如果系统中已经存在了一个相同的包名和签名的应用,将会用新安装的应用替换旧的;如果包名相同但是签名不同,则会安装失败。
应用签名完后在应用的META-INF目录下会有三个文件: CERT.RSA、CERT.SF和MANIFEST.MF。
MANIFEST.MF中保存了所有其他文件的SHA1摘要并base64编码后的值。
CERT.SF文件是对MANIFEST.MF文件中的每项中的每行加上“\r\n”后,再次SHA1摘要并base64编码后的值(这是为了防止通过篡改文件和其在MANIFEST.MF中对应的SHA1摘要值来篡改APK,要对MANIFEST的内容再进行一次数字摘要)。
CERT.RSA文件:包含了签名证书的公钥信息和发布机构信息。
签名信息中包含的组织信息,将便于用户识别安装包的真伪。
客户端若未进行应用完整性校验,经二次打包后的Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。
可参考下列文章:
android APK安全性校验
Android防重签名和二次打包
Android 应用防止被二次打包指南
Android属性allowBackup
安全风险源于adb backup
允许任何一个能够打开USB 调试开关的人,从Android手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取,adb restore
允许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。
因此,当一个应用数据被备份之后,用户即可在其他Android手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。
当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复。
尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;
android:allowBackup
值为false。
当在 AndroidManifest.xml
文件中设置 android:debuggable="true"
时,应用程序可以以调试模式启动,并被任意调试器附加调试。
客户端若设置了可被动态调试时,增加了apk被破解、分析的风险。
目前动态调试器的功能都很强大,如果debuggable属性为true,则可轻易被调试,通常用于重要代码逻辑分析、破解付费功能等。
android:debuggable
的值改为ture。
Android安全架构是基于Linux多用户机制的访问控制。在Linux操作系统中,root的权限是最高的,也被称为超级权限的拥有者。在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对root除外。
root用户的特权性还表现在:
攻击者可在root的终端上对应用程序进行动态调试、内存访问篡改、Hook应用程序与服务端交互流量等。
可以查看发布的系统版本,是test-keys(测试版),还是release-keys(发布版)。
可是在实际情况下,也有某些厂家的正式发布版本也是test-keys
Superuser.apk是一个被广泛使用的用来root安卓设备的软件,所以可以检查这个app是否存在。
su是Linux下切换用户的命令,在使用时不带参数,就是切换到超级用户。通常我们获取root权限,就是使用su命令来实现的,所以可以检查这个命令是否存在。
BusyBox集成压缩了 Linux 的许多工具和命令,所以若设备root了,很可能Busybox也被安装上了。
在Android系统中,有些目录是普通用户不能访问的,例如 /data
、/system
、/etc
等。
可以以/data
为例,来进行读写访问。先写入一个文件,然后读出,查看内容是否匹配,若匹配,才认为系统已经root了。
具体代码可参考:
Android root检测方法小结
安卓模拟器是一种可以运行在电脑上的虚拟设备,通过它可以实现应用的跨平台操作,让移动端APP无需任何改动即可在PC上执行。
模拟器作为一种虚拟机,配合改机工具,能够以较低成本实现设备多开,因此而备受黑灰产的青睐。
可利用PC端其他辅助工具完成对移动端应用的支持,如通过按键精灵完成自动挂机等操作。
通过模拟器多开功能,零成本体验同时多部手机、多个账户开小黑屋,实现刷单、薅羊毛。
在客户端代码中增加模拟器检测代码。
模拟器的检测秉持一句话:抓取特征值与真机比较。
可参考下列文章:
Android模拟器检测体系梳理
检测Android虚拟机的方法和代码实现
APP客户端通过宿主机与服务器进行流量交互,攻击者可通过设置Wi-Fi、网卡代理进行中间人劫持,抓取通信过程中的流量包,进行进一步分析利用。
攻击者可利用Charles、fiddler、BurpSuite等抓包工具,抓包分析网络流量及api接口信息,从而进一步分析相关接口、参数等安全问题。
代码可参考:
Android检测代理
ndroid中有些时候会将一些隐私数据存放在sqlite数据库中,在root过的手机中通过RE就能够轻松的打开并查看数据库所有内容。
SQLite不支持加密,应用中重要的数据、账号密码等容易被泄露。
在存储数据时加密内容,在查询时进行解密。但是这种方式不能彻底加密,数据库的表结构等信息还是能被查看到,另外检索数据也是一个问题。
借助SQLCipher。SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能。
在 Android 中有一种名为 LogCat 的日志机制,不仅系统日志信息,还有应用日志信息也会输出到LogCat。
开发人员通常会通过打印出的日志信息来分析、定位问题。如果对外发布版本的时候,忘记关闭相关的日志打印。LogCat 中的日志信息可以从同一设备中的其他应用中读出,敏感信息不应输出到LogCat,因此向Logcat输出敏感信息的应用,被认为具有信息泄露的漏洞。
攻击者通过调试可获取到logcat输出的敏感信息,造成敏感信息泄漏
在发行版应用中,最好不要输出任何日志。
为了APP的错误采集,异常反馈,必要的日志如要被输出,需遵循安全编码规范将风险控制在最小范围内
具体代码及实现请参考:
信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算法和加密后的密文,很容易得到加密前的明文;对于非对称密码算法或者签名算法,根据密钥和要加密的明文,很容易获得计算出签名值,从而伪造签名。
若将加密密钥、数据库连接信息、后台信息等敏感信息硬编码在Java代码、文件中,将导致敏感信息泄漏,造成更大危害。
硬编码敏感信息泄漏,造成的安全问题一般无法被轻易修正。例如:
可参考下列文章:
Android安全开发之浅谈密钥硬编码
关于Android敏感信息
在开发应用程序时,最好将网络请求限制为必要的网络请求。对于必要的,请确保它们是通过HTTPS而不是HTTP制作的。HTTPS是一种加密流量的协议,因此窃听者无法轻易拦截它。
多年来,HTTPS协议已被多次利用。虽然可以使用HTTPS的方式保证与服务端加密传输,但是我们仍然可以通过网卡、wifi代理、Hook等方式劫持未加密的流量数据包。
攻击者通过嗅探、中间人劫持等手段可获取到客户端与服务端的交互数据包,从而能够进行数据流量分析与篡改,进行进一步的攻击。
通信加密需采用两种手段同时加固:
在应用软件在运行时,用户在设备上的一举一动都将被详细记录下来,更多的是在使用者毫无觉察的情况下将屏幕内容以图片的形式、按键内容以文本文档的形式保存在指定的文件夹或发送到指定的邮箱。键盘记录,包括物理按键与软键盘的监控,通常监控的事件有:点击,长按,滑动等,这些时间在Android上表现出来的都是一系列的KeyEvent。
客户端应用程序若未针对键盘记录保护增加相关安全策略,攻击者可将记录下来的键盘记录发送到指定邮箱或post到指定网页。
建议使用自定义随机的软键盘;
对输入框打码处理