安卓APP安全测试

App安全问题

  • App 运行时虚拟机监测
  • App 运行时root监测
  • App数据备份检测
  • 代码反编译检测
  • 敏感权限使用
  • 敏感信息泄露
  • 拒绝服务测试
  • 目录穿越安全测试
  • App 缓存安全检测
  • 接口安全测试
  • 弱加密安全测试
  • 秘钥硬编码安全检测
  • 数据存储安全检测
  • 数据传输安全检测
  • 日志信息泄露检测
  • App组件导出检测
  • App组件权限检测
  • webview 多项漏洞安全测试
  • App Webview DOM 安全测试
  • 本地SQL注入安全测试
  • SQLite 存储安全审计

案件分析

APP运行时虚拟机检测

该app未进行虚拟机运行检测,攻击者在虚拟机中安装运行该app,即可在虚拟机中截取并操作数据包或进行其他有害操作。

image.png
APP数据备份检测

在对某app进行安全测试时,发现并未对app进行数据备份检测,安卓AndroidManifest.xml文件中android:allowBackup为true,当这个标志被设置成true或不设置该标志位时,应用程序数据可以备份和恢复,adb调试备份允许恶意攻击者复制应用程序数据。
在对某app进行安全测试时,发现并未对app进行数据备份检测,其AndroidManifest.xml文件中android: allowBackup为true,存在数据任意备份漏洞。


image.png

连接手机,然后输入以下备份命令,会出现一个对话窗,输入备份密码即可:
adb backup -nosystem -noshared -apk -f com.xxx.wallet com.xxx.wallet

image.png

连接到另一台手机或root的本机,输入下列命令,弹出对话框,输入备份时的密码即可恢复数据
adb restore com
如果用户账号密码保存在本地,则恢复到另一台root的手机后,可以看到各种敏感信息。
建议设置AndroidManifest.xml的android:allowBackup标志为false。

代码反编译检测

若app的apk文件可被反编译,就有可能导致源代码信息泄露,攻击者也可对其进行代码审计以找出可能存在隐患的攻击点。
对某app进行安全测试时,通过检测apk文件是否通过加固,代码是否通过加密或者混淆,是否可以通过反编译攻击等方面对该app进行测试。发现该apk文件可被反编译,反编译后可以看到java源代码,导致源代码信息泄露。(通过jadx-gui或其他反编译工具可直接操作apk,查看java源代码。)
建议,可使用专业加固工具对apk进行加壳处理。

image.png
敏感权限使用

目前很多系统在app请求权限这一方面上都不甚敏感,这也是如今移动端并不那么安全的成因之一。很多app都会请求一些敏感的权限,有的甚至会直接绕过,不向用户请求就直接自行取得了权限。而这些app有可能对用户都产生足够的恶意影响。
在对某app进行安全测试时,检测APP程序中是否存在敏感权限的使用,发现确实存在敏感权限使用漏洞。
建议,可使用专业加固工具对apk进行加壳处理。

image.png

敏感权限如下:

  • android.permision.WRITE_EXTERNAL_STORAGE 允许应用写入外部存储
  • ndroid.permission.READ_PHONE_STATE 允许访问电话状态、设备信息
  • ndroid.permission.CAMERA 允许访问摄像头
  • android.permission.GET_TASKS 允许获取系统应用列表
  • android.permission.MOUNT_UNMOUNT_FILESYSTEMS 允许挂载、反挂载外部文件系统
    建议禁用不需要的敏感权限。
敏感信息泄露

敏感信息泄露危害极大,如泄露出测试/管理员数据,参数注释信息等。但它又是一种危害虽大却又较容易避免的漏洞,只要开发人员多加注重安全意识即可避免大部分问题。
在对某app进行安全测试时,查找其 app 程序文件中是否存在敏感信息泄露(如源码中,备份文件中,xml 资源文件中等),发现确实存在敏感信息泄露漏洞,源码中泄露了微信公众号 appid 和 secretkey:

image.png

获取token:

image.png
秘钥硬编码安全

被测试的app,若通信存在加密处理,即可检查源码或者静态资源文件中是否存在硬编码的加密秘钥,从而破解通信加密的数据。
在对某app进行安全测试时,检查是否存在秘钥硬编码漏洞,此app请求数据默认是通过请求数据排列,然后加上appkey加上另外一个秘钥进行md5,再通过算法后去字符串再次md5得到最后的签名。
这里加密使用的appkey硬编码到apk中。如下图:

image.png

另一个加密key在so文件中,通过逆向可以获取:

image.png

这样一来即可通过修改数据后重新签名构造任意数据了,加签也就失去了意义。
(以下为第二个例子。)
在对另一个app进行测试时,使用burp工具截取该app传输的数据包,发现响应包内容已经过加密并有base64的特征。

image.png

对apk进行逆向获取到加密方式为aes cbc补码方式为pkcs7。

image.png

在反编译源码中未查询到aes秘钥相关信息 对apk进行解压 在静态资源文件中发现aes_key与aes_iv。

image.png

使用收集到的aes_key与aes_iv 以pkcs7为补码方式构造aes cbc解密获取到明文数据。

数据存储安全

如果安卓手机用户的app文件存放在external storage,例如SD卡,那这些文件就是全局可读写的,external storage可以被任何用户操作,且可以被所有的应用修改使用。
在对某app进行安全测试时,使用动态方法监测/data/data//目录下所有生成的目录是否带有明文信息泄露。
进入到/data/data/com.xxx.wallet/shared_prefs目录,查看config.xml文件,此文件存储了用户的支付信息等非常敏感的信息,而这些信息可被其他用户接触导致信息被盗取等。
建议,app的敏感数据不要存放在external storage,如若不得不这样做,请对数据进行加密处理

image.png
App组件导出检测

检测app中Activity、activity-alias、service、receiver组件对外暴露情况,如果检测到组件的exported属性为true或者未设置,而且组件的permission属性为normal或者dangerous或者未设置组件的permission属性时,app将存在组件导出漏洞,导致数据泄露和恶意的dos攻击以及钓鱼攻击。
在对某app进行安全测试时,检测到该app存在Activity组件导出漏洞。
检测app中Activity、activity-alias、service、receiver组件对外暴露情况,先检测组件的exported属性,再检测组件的permission对应的protectionlevel属性。

image.png

具体检测存在漏洞的方法如下:


image.png

建议:

  • 最小化组件暴露。对不会参与跨应用调用的组件添加android:exported=”false”属性。
  • 设置组件访问权限。对跨应用间调用的组件或者公开的receiver、service、activity和activity-alias设置权限,同时将权限的protectionLevel设置为”signature”或”signatureOrSystem”。
  • 组件传输数据验证。对组件之间,特别是跨应用的组件之间的数据传入与返回做验证和增加异常处理,防止恶意调试数据传入,更要防止敏感数据返回。
SQLite 存储安全

此类安全问题的检测,使用adb工具将sqlite数据库拖到本地,使用sqlite数据库连接软件查看是否存在敏感数据即可。如下为测试某app发现的漏洞范例。


image.png

零时科技

你可能感兴趣的:(安卓APP安全测试)